Дескрипторы строк USB

Дескрипторы устройств, конфигурации и интерфейса могут содержать ссылки на дескрипторы строк. В этом разделе описывается, как получить определенный дескриптор строки с устройства.

Дескрипторы строк ссылаются по одному номеру индекса. Дескриптор строки содержит одну или несколько строк Юникода; каждая строка — это перевод других на другой язык.

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). Драйверы могут запрашивать специальный номер индекса нуля, чтобы определить, какие идентификаторы языков поддерживает устройство. Для этого специального значения устройство возвращает массив идентификаторов языка, а не строку Юникода.

Так как дескриптор строки состоит из данных переменной длины, драйвер должен получить его двумя шагами. Сначала драйвер должен выдать запрос, передав достаточно большой буфер данных для хранения заголовка для дескриптора строки, 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
);