Application de bureau Windows pour un périphérique USB
Dans cet article, vous allez découvrir comment une application peut appeler des fonctions WinUSB pour communiquer avec un périphérique USB. Pour une telle application, WinUSB (Winusb.sys) doit être installé en tant que pilote de fonction de l’appareil. WinUSB dans la pile en mode noyau de l’appareil. Ce pilote est inclus dans Windows dans le dossier \Windows\System32\drivers.
Si vous utilisez Winusb.sys comme pilote de fonction d’un périphérique USB, vous pouvez appeler des fonctions WinUSB à partir d’une application pour communiquer avec l’appareil. Ces fonctions, exposées par la DLL en mode utilisateur Winusb.dll, simplifient le processus de communication. Au lieu de construire des demandes de contrôle d’E/S d’appareil pour effectuer des opérations USB standard (telles que la configuration de l’appareil, l’envoi de demandes de contrôle et le transfert de données vers ou depuis l’appareil), les applications appellent la fonction WinUSB équivalente.
Winusb.dll utilise les données fournies par l’application pour construire la demande de contrôle d’E/S d’appareil appropriée, puis envoie la demande à Winusb.sys pour traitement. Pour communiquer avec la pile USB, la fonction WinUSB appelle la fonction DeviceIoControl avec la iocTL appropriée qui correspond à la requête de l’application. Une fois la requête terminée, la fonction WinUSB transmet toutes les informations retournées par Winusb.sys (telles que les données d’une demande de lecture) au processus appelant. Si l’appel à DeviceIoControl réussit, il retourne une valeur différente de zéro. Si l’appel échoue ou est en attente (non traité immédiatement), DeviceIoControl retourne une valeur nulle. Si une erreur se produit, l’application peut appeler GetLastError pour obtenir un message d’erreur plus détaillé.
Il est plus simple d’utiliser des fonctions WinUSB pour communiquer avec un appareil que pour implémenter un pilote. Toutefois, notez les limitations suivantes :
Les fonctions WinUSB permettent à une application à la fois de communiquer avec l’appareil. Si vous avez besoin de plusieurs applications pour communiquer simultanément avec un appareil, vous devez implémenter un pilote de fonction.
Avant Windows 8.1, les fonctions WinUSB ne prennent pas en charge la diffusion de données vers ou depuis des points de terminaison isochrones.
Les fonctions WinUSB ne prennent pas en charge les appareils qui ont déjà une prise en charge en mode noyau. Par exemple, ces appareils incluent des modems et des cartes réseau, qui sont pris en charge par l’API de téléphonie (TAPI) et NDIS, respectivement.
Pour les appareils à fonctions multiples, vous pouvez utiliser le fichier INF de l’appareil pour spécifier un pilote en mode noyau intégré ou Winusb.sys pour chaque fonction USB séparément. Toutefois, vous ne pouvez spécifier qu’une seule de ces options pour une fonction particulière, et non les deux.
Remarque
Les fonctions WinUSB nécessitent Windows XP ou une version ultérieure. Vous pouvez utiliser ces fonctions dans votre application C/C++ pour communiquer avec votre appareil USB. Pour écrire une application UWP qui utilise des API WinUSB, consultez l’application UWP pour un appareil USB.
Mise en route
Obtenir les outils nécessaires pour écrire une application de bureau Windows pour les appareils
- Suivez les instructions de téléchargement du Kit de pilotes Windows.
Obtenez un périphérique USB de test et sa spécification matérielle.
Utilisez la spécification pour déterminer les fonctionnalités de l’application et les décisions de conception associées.
Les appareils MUTT (Microsoft USB Test Tool) sont disponibles à partir de technologies JJG. Cet appareil nécessite un microprogramme de Microsoft disponible au téléchargement du package logiciel MUTT.
Écrivez une application squelette qui obtient un handle sur l’appareil.
Il existe deux approches pour écrire la première application :
Écrire en fonction du modèle WinUSB inclus dans Visual Studio. Pour plus d’informations, consultez Écrire une application de bureau Windows basée sur le modèle WinUSB.
Appelez les routines SetupAPI pour obtenir un handle sur l’appareil et l’ouvrir en appelant WinUsb_Initialize. Pour plus d’informations, consultez Comment accéder à un périphérique USB à l’aide de fonctions WinUSB.
Installez Winusb.sys pour votre appareil.
Si vous utilisez Visual Studio, installez le package de pilotes sur l’ordinateur cible à l’aide du déploiement de Visual Studio. Pour obtenir des instructions, consultez Écrire une application de bureau Windows basée sur le modèle WinUSB. Sinon, installez manuellement le pilote dans Gestionnaire de périphériques en écrivant un INF personnalisé. Pour plus d’informations, consultez Installation de WinUSB (Winusb.sys).
Obtenez des informations sur votre appareil et affichez ses descripteurs.
Pour plus d’informations conceptuelles, consultez Concepts pour tous les développeurs USB. Obtenez des informations sur les fonctionnalités de votre appareil en lisant le descripteur de configuration, les descripteurs d’interface pour chaque autre paramètre pris en charge et leurs descripteurs de point de terminaison. Pour plus d’informations, consultez Interroger l’appareil pour les descripteurs USB.
Envoyez un transfert de contrôle USB.
Envoyez des demandes de contrôle standard et des commandes du fabricant à votre périphérique. Pour plus d’informations, consultez Transfert de contrôle d’envoi vers le point de terminaison par défaut.
Envoyer des transferts en bloc ou d’interruption.
Effectuez des opérations de lecture et d’écriture dans et à partir des points de terminaison en bloc, d’interruption et d’isochronous pris en charge par votre appareil. Pour plus d’informations, consultez Demandes d’E/S de problème.
Envoyer des transferts isochrones.
Envoyer des demandes de lecture et d’écriture isochrones, principalement utilisées pour la diffusion en continu de données. Cette fonctionnalité est disponible uniquement sur Windows 8.1 et versions ultérieures. Pour plus d’informations, consultez Envoi de transferts isochrones USB à partir d’une application de bureau WinUSB.