Pilotes USB côté hôte dans Windows

Cet article fournit une vue d’ensemble de l’architecture de la pile de pilotes USB (Universal Serial Bus).

La figure suivante montre le diagramme de bloc architectural de la pile de pilotes USB pour Windows. Le diagramme montre des piles de pilotes USB distinctes pour USB 2.0 et USB 3.0. Windows charge la pile de pilotes USB 3.0 lorsqu’un appareil est attaché à un contrôleur xHCI.

Diagramme de blocs architecturaux pour les piles de pilotes USB 2.0 et 3.0.

Windows charge la pile de pilotes USB 2.0 pour les périphériques qui sont attachés à des contrôleurs eHCI, oHCI ou uHCI. La pile de pilotes USB 2.0 est fournie dans Windows XP avec Service Pack 1 (SP1) et versions ultérieures du système d’exploitation Windows.

Pile de pilotes USB 3.0

Microsoft a créé les pilotes USB 3.0 à l’aide d’interfaces KMDF (Kernel Mode Driver Framework). Le modèle de pilote KMDF réduit la complexité et améliore la stabilité.

Pilote de contrôleur hôte USB 3.0 (Usbxhci.sys)

Le pilote xHCI est le pilote du contrôleur hôte USB 3.0. Les responsabilités du pilote xHCI incluent l’initialisation des registres MMIO et l’hébergement de structures de données basées sur la mémoire pour le matériel du contrôleur xHCI, le mappage des demandes de transfert des pilotes de couche supérieure aux blocs de demande de transfert et l’envoi des demandes au matériel. Après avoir effectué un transfert, le pilote gère les événements d’achèvement de transfert à partir du matériel et propage les événements vers le haut de la pile des pilotes. Il contrôle également les emplacements d’appareil du contrôleur xHCI et les contextes de point de terminaison.

Windows charge le pilote xHCI en tant qu’objet de périphérique de fonction (FDO) dans la pile de périphériques pour le contrôleur hôte.

Extension de contrôleur d’hôte USB (Ucx01000.sys)

Le pilote d’extension du contrôleur hôte USB (extension de KMDF) est la nouvelle extension du pilote de contrôleur hôte spécifique à la classe sous-jacente, tel que le pilote xHCI. Le nouveau pilote est extensible et est conçu pour prendre en charge d’autres types de pilotes de contrôleur hôte qui devraient être développés à l’avenir. L’extension du contrôleur hôte USB sert d’interface abstraite commune au pilote de hub, fournit un mécanisme générique pour la mise en file d’attente des demandes au pilote du contrôleur hôte et remplace certaines fonctions sélectionnées. Toutes les demandes d’E/S initiées par les pilotes supérieurs atteignent le pilote d’extension du contrôleur hôte avant le pilote xHCI. Lors de la réception d’une demande d’E/S, l’extension du contrôleur hôte valide la demande, puis la transfère à la file d’attente KMDF appropriée associée au point de terminaison cible. Le pilote xHCI, lorsqu’il est prêt pour le traitement, récupère la requête à partir de la file d’attente. Les responsabilités du pilote d’extension du contrôleur hôte USB sont les suivantes :

  • Fournit des objets spécifiques à USB au pilote xHCI.
  • Fournit des routines de rappel d’événements KMDF au pilote xHCI.
  • Gère et contrôle les opérations du hub racine associé au contrôleur hôte.
  • Implémente des fonctionnalités configurables par le pilote client, telles que les DLL chaînées, les flux, etc.

Pilote de hub USB (Usbhub3.sys)

Le nouveau pilote de hub, dans la pile de pilotes USB pour les périphériques 3.0, utilise le modèle de pilote KMDF. Le pilote hub effectue principalement les tâches suivantes :

  • Gère les hubs USB et leurs ports.
  • Énumère les appareils et autres hubs attachés à leurs ports en aval.
  • Crée des objets d’appareil physique (PPO) pour les appareils et hubs énumérés.

Windows charge le pilote hub en tant que FDO dans la pile de périphériques hub. L’énumération des appareils et la gestion du hub dans le nouveau pilote sont implémentées par le biais d’un ensemble de machines à état. Le pilote hub s’appuie sur KMDF pour la gestion de l’alimentation et les fonctions PnP. En plus de la gestion du hub, le pilote de hub effectue également des vérifications préliminaires et le traitement de certaines requêtes envoyées par la couche de pilote client USB. Pour instance, le pilote hub analyse une demande de configuration de sélection pour déterminer les points de terminaison qui seront configurés par la demande. Après avoir analysé les informations, le pilote de hub envoie la demande à l’extension du contrôleur hôte USB ou à un traitement ultérieur.

Pile de pilotes USB 2.0

Windows charge la pile de pilotes USB 2.0 pour les périphériques qui sont attachés à des contrôleurs eHCI, oHCI ou uHCI. Les pilotes de la pile de pilotes USB 2.0 sont fournis dans Windows XP avec SP1 et versions ultérieures du système d’exploitation Windows. La pile de pilotes USB 2.0 est conçue pour faciliter les périphériques USB à haut débit, comme défini dans la spécification USB 2.0.

Au bas de la pile de pilotes USB se trouve le pilote du contrôleur hôte. Il se compose du pilote de port, de Usbport.sys et d’un ou plusieurs des trois pilotes miniport qui s’exécutent simultanément. Lorsque le système détecte le matériel du contrôleur hôte, il charge l’un de ces pilotes miniport. Le pilote miniport, une fois chargé, charge le pilote de port, Usbport.sys. Le pilote de port gère les aspects des tâches du pilote du contrôleur hôte qui sont indépendants du protocole spécifique.

Le pilote miniport Usbuhci.sys (interface du contrôleur hôte universel) remplace le pilote Uhcd.sys miniclass fourni avec Windows 2000. Le pilote miniport Usbohci.sys (ouvrir l’interface du contrôleur hôte) remplace Openhci.sys. Le pilote miniport Usbehci.sys prend en charge les périphériques USB à haut débit et a été introduit dans Windows XP avec SP1 et versions ultérieures et windows Server 2003 et les systèmes d’exploitation ultérieurs.

Dans toutes les versions de Windows qui prennent en charge USB 2.0, le système d’exploitation est capable de gérer simultanément les contrôleurs hôtes USB 1.1 et USB 2.0. Chaque fois que le système d’exploitation détecte que les deux types de contrôleurs sont présents, il crée deux nœuds d’appareil distincts, un pour chaque contrôleur hôte. Windows charge ensuite le pilote miniport Usbehci.sys pour le matériel du contrôleur hôte compatible USB 2.0 et Usbohci.sys ou Openhci.sys pour le matériel compatible USB 1.1, en fonction de la configuration du système.

Au-dessus du pilote de port se trouve le pilote de bus USB, Usbhub.sys, également appelé pilote hub. Il s’agit du pilote de périphérique pour chaque hub sur le système.

Pilote parent générique de classe commune USB (Usbccgp.sys)

Le pilote parent générique de classe commune USB est le pilote parent fourni par Microsoft pour les périphériques composites. Le pilote hub énumère et charge le pilote composite parent si deviceClass a la valeur 0 ou 0xef et numInterfaces est supérieur à 1 dans le descripteur de périphérique. Le pilote hub génère l’ID compatible pour le pilote composite parent sous la forme « USB\COMPOSITE ». Usbccgp.sys utilise des routines WDM (Windows Driver Model).

Le pilote composite parent énumère toutes les fonctions d’un appareil composite et crée une PDO pour chacune d’elles. Cela entraîne le chargement de la classe ou du pilote client approprié pour chaque fonction de l’appareil. Chaque pilote de fonction (PDO enfant) envoie des requêtes au pilote parent, qui les envoie au pilote du hub USB.

Usbccgp.sys est inclus dans Windows XP avec SP1 et versions ultérieures du système d’exploitation Windows. Dans Windows 8, le pilote a été mis à jour pour implémenter les fonctionnalités de suspension de fonction et de mise en éveil à distance, telles que définies dans la spécification USB 3.0.

Pour plus d’informations, consultez Pilote parent générique USB (Usbccgp.sys).

WinUSB (Winusb.sys)

Windows USB (WinUSB) est un pilote générique fourni par Microsoft pour les périphériques USB. L’architecture WinUSB se compose d’un pilote en mode noyau (Winusb.sys) et d’une bibliothèque de liens dynamiques en mode utilisateur (Winusb.dll). Pour les appareils qui ne nécessitent pas de pilote de fonction personnalisé, Winusb.sys pouvez être installés dans la pile en mode noyau de l’appareil en tant que pilote de fonction. Les processus en mode utilisateur peuvent ensuite communiquer avec Winusb.sys à l’aide d’un ensemble de demandes de contrôle d’E/S d’appareil ou en appelant WinUsb_Xxx fonctions. Pour plus d’informations, consultez WinUSB.

Dans Windows 8, le fichier d’informations fournies par Microsoft (INF) pour WinUSB, Winusb.inf, contient USB\MS_COMP_WINUSB en tant que chaîne d’identificateur de périphérique. Cela permet Winusb.sys d’être automatiquement chargés en tant que pilote de fonction pour les appareils qui ont un ID compatible WinUSB correspondant dans le descripteur MS OS. Ces appareils sont appelés appareils WinUSB. Les fabricants de matériel ne sont pas tenus de distribuer un fichier INF pour leur appareil WinUSB, ce qui simplifie le processus d’installation du pilote pour l’utilisateur final. Pour plus d’informations, consultez Appareil WinUSB.

Pilote client USB

Chaque périphérique USB, composite ou non composite, est géré par un pilote client. Un pilote client USB est un pilote de classe ou de périphérique qui est un client de la pile de pilotes USB. Ces pilotes incluent des pilotes spécifiques aux classes et aux appareils de Microsoft ou d’un fournisseur tiers. Pour afficher la liste des pilotes de classe fournis par Microsoft, consultez Pilotes pour les classes de périphériques USB prises en charge. Un pilote client crée des demandes pour communiquer avec l’appareil en appelant les interfaces publiques exposées par la pile de pilotes USB.

Un pilote client pour un périphérique composite n’est pas différent d’un pilote client pour un périphérique non composite, à l’exception de son emplacement dans la pile de pilotes.

Un pilote client pour un appareil non composite est superposé directement au-dessus du pilote hub.

Pour un périphérique USB composite qui expose plusieurs fonctions et n’a pas de pilote de classe parent, Windows charge le pilote parent générique USB (Usbccgp.sys) entre le pilote hub et la couche de pilote client. Le pilote parent crée un PDO distinct pour chaque fonction d’un appareil composite. Les pilotes clients (FDO pour les fonctions) sont chargés au-dessus du pilote parent générique. Les fournisseurs peuvent choisir de fournir un pilote client distinct pour chaque fonction.

Un pilote client USB peut s’exécuter en mode utilisateur ou en mode noyau, en fonction des exigences du pilote. Les pilotes clients USB peuvent être écrits à l’aide de routines KMDF, UMDF ou WDM.

Bibliothèques d’assistance pour les pilotes clients

Microsoft fournit les bibliothèques d’assistance suivantes pour aider les pilotes et les applications en mode noyau à communiquer avec la pile de pilotes USB :

  • Usbd.sys

    Microsoft fournit la bibliothèque Usbd.sys qui exporte des routines pour les pilotes clients USB. Les routines d’assistance simplifient les tâches opérationnelles d’un pilote client. Par instance, en utilisant les routines d’assistance, un pilote client USB peut créer des blocs de requête USB (URB) pour certaines opérations spécifiques, telles que la sélection d’une configuration, et envoyer ces URB à la pile de pilotes USB.

  • Usbdex.lib

    Cette bibliothèque d’assistance est nouvelle pour Windows 8. La bibliothèque exporte des routines principalement pour l’allocation et la génération d’URB. Ces routines remplacent certaines des routines héritées exportées par Usbd.sys. Les nouvelles routines nécessitent que le pilote client s’inscrive auprès de la pile de pilotes USB, qui gère le handle pour l’inscription. Ce handle est utilisé pour les appels à d’autres routines Usbdex.lib. Certains URB alloués par les nouvelles routines ont un contexte URB que le pilote USB utilise pour améliorer le suivi et le traitement. Pour plus d’informations, consultez Allocation et génération d’URIB.

  • Winusb.dll

    Winusb.dll est une DLL en mode utilisateur qui expose des fonctions WinUSB pour la communication avec Winusb.sys, qui est chargée en tant que pilote de fonction d’un appareil en mode noyau. Les applications utilisent ces fonctions pour configurer l’appareil, récupérer des informations sur l’appareil et effectuer des opérations d’E/S. Pour plus d’informations sur l’utilisation de ces fonctions, consultez Comment accéder à un périphérique USB à l’aide de fonctions WinUSB.