Поделиться через


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

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

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

Клиентские драйверы используют UsbBuildGetDescriptorRequest с DescriptorType = USB_STRING_DESCRIPTOR_TYPE для создания запроса для получения дескриптора строки. Параметр Index указывает номер индекса, а параметр LanguageID — идентификатор языка (используются те же значения, что и в значениях MICROSOFT Win32 LANGID). Драйверы могут запросить специальный номер индекса, равный нулю, чтобы определить, какие идентификаторы языков поддерживает устройство. Для этого специального значения устройство возвращает массив идентификаторов языка, а не строку Юникода.

Так как дескриптор строки состоит из данных переменной длины, драйвер должен получить его в два этапа. Сначала драйвер должен выдать запрос, передав буфер данных, достаточно большой для хранения заголовка для дескриптора строки, структуры USB_STRING_DESCRIPTOR. Элемент bLength USB_STRING_DESCRIPTOR указывает размер всего дескриптора в байтах. Затем драйвер выполняет тот же запрос с буфером данных размера bLength.

В следующем коде показано, как запросить дескриптор i-й строки с идентификатором языка 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
);