Partager via


USB ContainerIDs dans Windows

Cet article fournit des informations sur les USB ContainerIDs pour le système d'exploitation Windows. Il contient des indications permettant aux fabricants d'appareils de programmer leurs appareils USB multifonctions de manière à ce qu'ils soient correctement détectés par Windows.

Les utilisateurs peuvent profiter de toutes les capacités des appareils connectés à leur ordinateur. Cela inclut les appareils multifonctions, tels que les appareils combinant une imprimante, un scanner et un copieur. Windows prend en charge la consolidation de toutes les fonctionnalités d'un appareil physique unique dans un conteneur d'appareils. Un conteneur de périphérique est une représentation virtuelle de l'appareil physique. Cette consolidation est réalisée en attribuant une propriété ContainerID à chaque fonction d'appareil énumérée pour l'appareil physique. En attribuant la même valeur ContainerID à chaque fonction d'appareil, Windows reconnaît que toutes les fonctions d'appareil appartiennent au même appareil physique.

Tous les types d'appareils qui se connectent à un ordinateur via différents types de bus peuvent prendre en charge les conteneurs d'appareils. Cependant, tous les types de bus n'utilisent pas le même mécanisme pour générer un ContainerID. Pour les appareils USB, les fournisseurs d'appareils peuvent utiliser un descripteur ContainerID pour décrire le ContainerID d'un appareil physique. Un descripteur ContainerID est un descripteur de fonctionnalité du système d'exploitation Microsoft qui peut être stocké dans le microprogramme de l'appareil USB. Les fabricants de périphériques USB doivent mettre en œuvre correctement ces descripteurs ContainerID dans leurs appareils afin de tirer parti des nouvelles capacités des périphériques disponibles dans Windows. Les fabricants de périphériques USB ne doivent implémenter qu'un seul ContainerID pour chaque appareil physique, quel que soit le nombre de fonctions prises en charge par l'appareil.

Pour plus d'informations sur la consolidation de toutes les fonctionnalités d'un appareil unique dans un conteneur d'appareil, voir Comment les ID de conteneur sont générés.

Pour plus d'informations sur les descripteurs du système d'exploitation Microsoft pour les appareils USB, voir Descripteurs du système d'exploitation Microsoft pour les appareils USB.

Comment un USB ContainerID est généré

Voici deux façons de générer un ContainerID pour un appareil USB :

  • Le fabricant du périphérique USB spécifie le ContainerID dans le microprogramme de l'appareil en utilisant un descripteur ContainerID de Microsoft OS.
  • Le pilote du hub USB de Microsoft crée automatiquement un ContainerID pour l'appareil à partir de la combinaison de l'ID du produit (PID), de l'ID du fournisseur (VID), du numéro de révision et du numéro de série de l'appareil. Dans cette situation, le pilote du hub USB de Microsoft crée un ContainerID avec une fonctionnalité minimale. Cette méthode ne s'applique qu'aux appareils qui ont un numéro de série unique.

Contenu de l'USB ContainerID

Un ContainerID USB est présenté au système d'exploitation sous la forme d'une chaîne d'identification universelle unique (UUID). L'UUID ContainerID est contenu dans un descripteur ContainerID. Un descripteur ContainerID est un descripteur de fonctionnalité du système d'exploitation Microsoft au niveau de l'appareil. Ainsi, lorsque le système d'exploitation demande un ContainerID USB, le champ wValue de la requête du descripteur doit toujours être défini sur zéro. Pour plus d'informations sur les descripteurs de fonctionnalité du système d'exploitation Microsoft et les requêtes de descripteurs, voir la spécification des descripteurs du système d'exploitation Microsoft 1.0.

Un descripteur ContainerID se compose d'un en-tête.

Contrepartie Champ Taille Type Description
0 dwLength 4 DWord non signé Longueur, en octets, de l'ensemble du descripteur ContainerID. Ce champ doit toujours avoir la valeur 0x18.
4 bcdVersion 2 BCD Le numéro de version du descripteur ContainerID, en décimal codé binaire (BCD), où chaque octet correspond à un chiffre. L'octet le plus significatif (MSB) contient les deux chiffres avant la virgule, et l'octet le moins significatif (LSB) contient les deux chiffres après la virgule. Par exemple, la version 1.00 est représentée par 0x0100. Ce champ doit toujours avoir la valeur 0x0100.
6 wIndex 2 Word Ce champ est toujours défini sur 6 pour les descripteurs USB ContainerID.

Un descripteur ContainerID se compose d'une section ContainerID.

Contrepartie Champ Taille Type Description
0 bContainerID 16 DWord non signé Données ContainerID.

Les fabricants d'appareils doivent s'assurer que chaque instance d'un appareil possède une valeur universellement unique de 16 octets pour le ContainerID. En outre, un appareil doit indiquer la même valeur ContainerID à chaque fois qu'il est mis sous tension. Il existe plusieurs algorithmes établis pour générer des UUID avec un risque de duplication quasi nul. Les fabricants d'appareils peuvent choisir l'algorithme de génération d'UUID qui répond le mieux à leurs besoins. L'algorithme de génération d'UUID utilisé n'a pas d'importance tant que le résultat est unique.

Syntaxe de l'USB ContainerID

Un ContainerID est indiqué dans le format de chaîne UUID standard de {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Voici un exemple de représentation dans le microprogramme d'un ContainerID USB 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07, qui est formaté comme une chaîne {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}. UUID.

UCHAR ExampleContainerIDDescriptor[24] =
{
    0x18, 0x00, 0x00, 0x00,     // dwLength - 24 bytes
    0x00, 0x01,                 // bcdVersion - 1.00
    0x06, 0x00,                 // wIndex – 6 for a ContainerID
    0x0C, 0xB4, 0xA7, 0x2C,     // bContainerID -
    0xD1, 0x7B, 0x25, 0x4F,     // {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}
    0xB5, 0x73, 0xA1, 0x3A,     // 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07
    0x97, 0x5D, 0xDC, 0x07      //
}

Notez le changement dans l'ordre des 8 premiers octets lorsqu'il est formaté comme une chaîne UUID.

Modifications du descripteur du système d'exploitation de Microsoft

Afin de préserver la fonctionnalité ContainerID, le descripteur de chaîne du système d'exploitation Microsoft contient un champ d'indicateurs qui peut être utilisé pour indiquer la prise en charge du descripteur ContainerID.

La définition actuelle du descripteur de chaîne du système d'exploitation de Microsoft comprend un champ de tampon d'un octet, bPad, à la fin du descripteur, qui est normalement réglé sur zéro. Pour les appareils USB qui prennent en charge le nouveau ContainerID, le champ bPad est redéfini comme un champ d'indicateurs, bFlags. Le bit 1 de ce champ est utilisé pour indiquer la prise en charge du descripteur ContainerID. Le tableau 3 décrit les champs du descripteur de chaîne du système d'exploitation Microsoft pour les appareils USB.

Champ Longueur (octets) Valeur Description
bLength 1 0x12 Longueur du descripteur.
bDescriptorType 1 0x03 Type de descripteur. Une valeur de 0x03 indique un descripteur de chaîne du système d'exploitation de Microsoft.
qwSignature 14 'MSFT100' Champ de signature.
bMS_VendorCode 1 Code du fournisseur Code du fournisseur.
bFlags 1 0x02 Bit 0 : Réservé
Bit 1 : Support ContainerID
 0 : ne prend pas en charge le ContainerID
 1 : Supporte ContainerID
Bits 2-7 : Réservés

Les appareils USB actuellement expédiés qui prennent en charge le descripteur Microsoft OS mais pas le descripteur ContainerID ont le champ bPad réglé sur 0x00. Le pilote du hub USB n'interroge pas ces appareils sur le descripteur USB ContainerID.

Vue du conteneur d'un appareil multifonction USB

Le ContainerID fournit des informations permettant de consolider les appareils pour les appareils USB multifonctions. La figure 1 montre un exemple de consolidation de tous les appareils d'une imprimante multifonction dans un seul conteneur d'appareils lorsque tous les appareils individuels du produit utilisent le même ContainerID.

Capture d'écran du gestionnaire d'appareils montrant la consolidation de tous les appareils d'une imprimante multifonction.

Exigences du HCK de l'USB ContainerID

Les fabricants d'appareils doivent s'assurer que chaque instance d'un appareil qu'ils produisent possède une valeur ContainerID globalement unique afin que Windows puisse consolider avec succès les fonctionnalités de chaque appareil multifonction USB. Le kit de certification du matériel Windows comprend une exigence, DEVFUND-0034, pour un ContainerID USB s'il est implémenté dans un appareil. Si un appareil implémente un USB ContainerID, la certification du matériel Windows teste le ContainerID dans le cadre des tests du descripteur du système d'exploitation Microsoft et vérifie si la valeur du ContainerID est globalement unique. Pour plus d'informations sur ces exigences de la certification du matériel Windows, consultez le site Web de la certification du matériel Windows.

Recommandations pour la mise en œuvre d'un ContainerID USB Les recommandations suivantes s'adressent aux fournisseurs d'appareils qui conçoivent, fabriquent et expédient des appareils USB :

  • Découvrez comment Windows améliore la prise en charge des appareils USB multifonctions et à transport multiple en utilisant un ContainerID. Nous vous recommandons de commencer par lire « Prise en charge des appareils multifonctions et groupements de conteneurs de périphériques dans Windows ».

  • Assurez-vous que le numéro de série de chaque appareil USB est unique. Une exigence de la certification du matériel Windows stipule que, si votre appareil inclut un numéro de série, celui-ci doit être unique pour chaque instance de votre appareil.

  • Ne fournissez pas de ContainerID pour un appareil USB intégré dans un système. Les appareils USB intégrés doivent s'appuyer sur les paramètres du BIOS ACPI ou sur le bit DeviceRemovable du descripteur du hub USB pour le port.

  • Veillez à ce que tous les appareils USB connectés à un système aient des valeurs ContainerID uniques. Ne partagez pas les valeurs ContainerID ou les numéros de série USB entre vos lignes de produits.

  • Veillez à définir correctement la capacité de dispositif amovible pour votre appareil.

    Remarque

    Les fournisseurs d'appareils qui ajoutent un descripteur USB ContainerID à un appareil USB déjà expédié doivent incrémenter le numéro de version de l'appareil (bcdDevice) dans le descripteur de l'appareil. En effet, le pilote du hub USB met en cache le descripteur de chaîne du système d'exploitation Microsoft (ou l'absence de descripteur) en fonction de l'ID du fournisseur, de l'ID du produit et du numéro de version de l'appareil. Si vous n'incrémentez pas le numéro de version du périphérique, le pilote du hub ne demande pas l'USB ContainerID d'un nouveau périphérique s'il a précédemment énuméré une instance de l'appareil avec le même ID de fournisseur, ID de produit et numéro de version du périphérique qui ne prenait pas en charge le descripteur USB ContainerID.