Partager via


Descripteurs de chaîne USB

Les descripteurs d’appareil, de configuration et d’interface peuvent contenir des références à des descripteurs de chaîne. Cette rubrique explique comment obtenir un descripteur de chaîne particulier à partir de l’appareil.

Les descripteurs de chaîne sont référencés par leur numéro d’index de base unique. Un descripteur de chaîne contient une ou plusieurs chaînes Unicode ; chaque chaîne est une traduction des autres dans une autre langue.

Les pilotes clients utilisent UsbBuildGetDescriptorRequest, avec DescriptorType = USB_STRING_DESCRIPTOR_TYPE, pour générer la requête afin d’obtenir un descripteur de chaîne. Le paramètre Index spécifie le numéro d’index et le paramètre LanguageID spécifie l’ID de langue (les mêmes valeurs sont utilisées que dans les valeurs LANGID De Microsoft Win32). Les pilotes peuvent demander le numéro d’index spécial zéro pour déterminer les ID de langue pris en charge par l’appareil. Pour cette valeur spéciale, l’appareil retourne un tableau d’ID de langue plutôt qu’une chaîne Unicode.

Étant donné que le descripteur de chaîne se compose de données de longueur variable, le pilote doit les obtenir en deux étapes. Tout d’abord, le pilote doit émettre la requête, en passant une mémoire tampon de données suffisamment grande pour contenir l’en-tête d’un descripteur de chaîne, une structure USB_STRING_DESCRIPTOR. Le membre bLength de USB_STRING_DESCRIPTOR spécifie la taille en octets du descripteur entier. Le pilote effectue ensuite la même requête avec une mémoire tampon de données de taille bLength.

Le code suivant montre comment demander le descripteur de chaîne i-th, avec l’ID de langue langID :

USB_STRING_DESCRIPTOR USD, *pFullUSD;
UsbBuildGetDescriptorRequest(
    pURB, // points to the URB to be filled in
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_STRING_DESCRIPTOR_TYPE,
    i, // index of string descriptor
    langID, // language ID of string.
    &USD, // points to a USB_STRING_DESCRIPTOR.
    NULL,
    sizeof(USB_STRING_DESCRIPTOR),
    NULL
);
pFullUSD = ExAllocatePool(NonPagedPool, USD.bLength);
UsbBuildGetDescriptorRequest(
    pURB, // points to the URB to be filled in
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_STRING_DESCRIPTOR_TYPE,
    i, // index of string descriptor
    langID, // language ID of string
    pFullUSD,
    NULL,
    USD.bLength,
    NULL
);