USB设备语言ID-索引为0的字符串索引

欢迎加入官方QQ群:952873936或联系站长进行技术交流。

对于如设备描描述符等相关的描述符,都会有一些字符串索引。主机通过GET_DESCRIPTOR获取对应的字符串索引内容,可以获取这些关于设备的一些描述符信息。如对于设备描述符的iManufacturer,iProduct和iSerialNumber。

我们又知道,当对于某些设备没有与之对应的字符串时,我们只需要将这些字符串索引的值设为0即可。

但是,我们通过抓包分析的时候,特别是在设备在枚举的时候,设备端会收到一个GET_DESCRIPTOR的请求,描述符的类型为3即字符串类型,并且该字符串的索引为0。

索引为0的字符串索引

前面我们已经知道,对于不需要含有字符串索引的描述符,特别是接口描述符中的iInterface字段,常常将其置为0,那么为什么还会收到这样的请求呢?

其实,当主机向设备发送获取字符串索引为0的字符串类型时,这并不表示要获取索引为0的字符串,而是表示获取的是语言ID.

语言ID描述符的数据结构建如下:

偏移量/字节 字段 大小/字节 说明
0 bLength 1 该描述符的总长度
1 bDescriptorType 1 描述符的类型,这里为3
2 wLANGUAGEID[0] 2 第一个语言ID 的编号
2*n+2 wLANGUAGEID[n] 2 第n+1个语言ID的编号

一般情况下,我们使用的语言ID为0409,且只支持这一种语言ID.
如我们这里提供的示例如下:

BYTE usbzhLangageId[4] = 
{
    0x04, //字符串长度
    0x03, //字符串类型
    0x09, //0X0409为美式英语的语言ID
    0x04
}

如我们当为中文时,可以将语言ID设为0x0804

BYTE usbzhLangageId[4] = 
{
    0x04, //字符串长度
    0x03, //字符串类型
    0x04, //0x0804表示简体中文
    0x08
}

某USB手柄的字符串描述符通过USBTREEVIEW抓取如下:

      -------------------- String Descriptors -------------------
             ------ String Descriptor 0 ------
bLength                  : 0x04 (4 bytes)
bDescriptorType          : 0x03 (String Descriptor)
Language ID[0]           : 0x0409 (English - United States)
Data (HexDump)           : 04 03 09 04                                       ....
             ------ String Descriptor 1 ------
bLength                  : 0x0C (12 bytes)
bDescriptorType          : 0x03 (String Descriptor)
Language 0x0409          : "ZhiXu"
Data (HexDump)           : 0C 03 5A 00 68 00 69 00 58 00 75 00               ..Z.h.i.X.u.
             ------ String Descriptor 2 ------
bLength                  : 0x16 (22 bytes)
bDescriptorType          : 0x03 (String Descriptor)
Language 0x0409          : "Controller"
Data (HexDump)           : 16 03 43 00 6F 00 6E 00 74 00 72 00 6F 00 6C 00   ..C.o.n.t.r.o.l.
                           6C 00 65 00 72 00                                 l.e.r.

更多的语言ID可参见:http://www.cppblog.com/ally-zheng-2009/articles/98570.html

0 篇笔记 写笔记

USB 字符串描述符
字符串描述符是可选的.如果不支持字符串描述符,其设备描述符,配置描述符,接口描述符内的所有字符串描述符索引都必须为0.字符串描述符的功能USB规范中定义了大量的标识,而这些标识都是以十六进制显示的,这个机器来说是很方便的,但对于人来说,就比较麻烦了。总不能看到一个数值标识就去查表吧,当然这对于熟练开......
USB-UAC麦克风 字符串描述符
偏移地址字段长度值描述0bLength10x18描述符长度1bDescriptorType10x03描述符类型:字符串描述符2bString10x00540x00480x00450x00200x00430x004F0x004D0x00500x00410x004E0x0059“THE COMPANY”......
华为UAC耳机 字符串描述符
字符串描述符 -------------------- String Descriptors ------------------- ------ String Descriptor 0 ------bLength : 0x04 (......
USB HID报表描述符与设备描述符、配置描棕符、字符串描述符的通讯格式对比
报表描述符是USB HID规范中一个很重要的概念。USB HID设备报表描述符内容表述了该HID设备的功能及数据传输的格式。USB HID报表描述符在概念上和设备描述符,配置描述符,接口描述符,端点描述符和其它USB设备描述符类似,但是还是有一些细微的区别。我里我们做一个简要的区别:设备描述符、......
USB设备语言ID-索引为0的字符串索引
对于如设备描描述符等相关的描述符,都会有一些字符串索引。主机通过GET_DESCRIPTOR获取对应的字符串索引内容,可以获取这些关于设备的一些描述符信息。如对于设备描述符的iManufacturer,iProduct和iSerialNumber。我们又知道,当对于某些设备没有与之对应的字符串时,......
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!