Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les descripteurs d’appareil, de configuration et d’interface peuvent contenir des références aux 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 un. Un descripteur de chaîne contient une ou plusieurs chaînes Unicode ; chaque chaîne est une traduction des autres dans une autre langue.
Client drivers use UsbBuildGetDescriptorRequest, with DescriptorType = USB_STRING_DESCRIPTOR_TYPE, to build the request to obtain a string descriptor. The Index parameter specifies the index number, and the LanguageID parameter specifies the language ID (the same values are used as in Microsoft Win32 LANGID values). Les pilotes peuvent demander le numéro d’index spécial de 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 l’obtenir en deux étapes. Tout d’abord, le pilote doit émettre la requête, en transmettant 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. The bLength member of USB_STRING_DESCRIPTOR specifies the size in bytes of the entire descriptor. The driver then makes the same request with a data buffer of size bLength.
The following code demonstrates how to request the i-th string descriptor, with language ID 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
);