USB 字符串描述符

设备、配置和接口描述符可能包含对字符串描述符的引用。 本主题介绍如何从设备获取特定字符串描述符。

字符串描述符由其从 1 开始的索引号引用。 字符串描述符包含一个或多个 Unicode 字符串;每个字符串都是将其他字符串翻译成另一种语言。

客户端驱动程序使用 DescriptorType = USB_STRING_DESCRIPTOR_TYPE 的 UsbBuildGetDescriptorRequest 生成请求以获取字符串描述符。 Index 参数指定索引号,LanguageID 参数指定语言 ID, (与 Microsoft Win32 LANGID 值) 相同的值使用。 驱动程序可以请求特殊索引号 0,以确定设备支持的语言 ID。 对于此特殊值,设备返回语言 ID 数组,而不是 Unicode 字符串。

由于字符串描述符包含可变长度的数据,因此驱动程序必须分两个步骤获取它。 首先,驱动程序必须发出请求,传递足够大的数据缓冲区来保存字符串描述符(USB_STRING_DESCRIPTOR结构)的标头。 USB_STRING_DESCRIPTOR 的 bLength 成员指定整个描述符的大小(以字节为单位)。 然后,驱动程序使用大小 为 bLength 的数据缓冲区发出相同的请求。

以下代码演示如何使用语言 ID langID 请求第 i 个字符串描述符:

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
);