Udostępnij przez


Deskryptory ciągów USB

Deskryptory urządzeń, konfiguracji i interfejsu mogą zawierać odwołania do deskryptorów ciągów. W tym temacie opisano sposób uzyskiwania deskryptora określonego ciągu z urządzenia.

Deskryptory ciągów odwołują się do ich jedno opartego na numerze indeksu. Deskryptor ciągu zawiera co najmniej jeden ciąg Unicode; każdy ciąg jest tłumaczeniem innych do innego języka.

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). Sterowniki mogą zażądać specjalnej liczby indeksu zero, aby określić, które identyfikatory języków obsługuje urządzenie. W przypadku tej wartości specjalnej urządzenie zwraca tablicę identyfikatorów języków, a nie ciąg Unicode.

Ponieważ deskryptor ciągu składa się z danych o zmiennej długości, sterownik musi uzyskać go w dwóch krokach. Najpierw sterownik musi wydać żądanie, przekazując bufor danych wystarczająco duży, aby pomieścić nagłówek deskryptora ciągu, struktury 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
);