USB学习之七:设备描述符请求与回应
一、抓取USB数据包
拔插USB设备,可以抓取到数据如下:

当然,我们可以使用过滤方法,找到需要观察的数据包:
usb.addr == 1.3.0 || usb.addr == 1.3.1
二、设备地址
在USB(通用串行总线)协议中,设备地址(Device Address)是主机用来唯一标识连接到USB总线上的设备的标识符。USB设备地址的格式通常是一个层次化的结构,用于表示设备在USB总线上的位置。你提到的 usb.addr == 1.3.0 是一种常见的表示方法,但需要明确其具体含义。
- USB设备地址的层次结构
USB设备地址通常包括以下几个层次:
Bus Number(总线号):表示USB总线的编号。
Device Number(设备号):表示在特定总线上的设备编号。
Interface Number(接口号):表示设备中的特定接口编号。
Endpoint Number(端点号):表示接口中的特定端点编号。 - 地址格式的解释
你提到的 usb.addr == 1.3.0 可以解释为:
1:总线号(Bus Number)
3:设备号(Device Number)
0:接口号(Interface Number)
这种表示方法通常用于描述USB设备在系统中的位置。例如:
1.3.0 表示在总线号为1的USB总线上,设备号为3的设备的接口号为0的接口。
三、URB头部示例
请参考章节usb学习之四: USB Request Block (URB)

四、bRequestType和bRequest
请参考章节usb学习之三: bRequestType 和 bRequest字段
bRequestType |
二进制 | 方向 | 类型 | 接收者 | bRequest |
请求名称 | 描述 |
|---|---|---|---|---|---|---|---|
0x00 |
0000 0000 |
主机到设备 | 标准 | 设备 | 0x00 |
GET_STATUS |
获取设备的状态信息 |
0x00 |
0000 0000 |
主机到设备 | 标准 | 设备 | 0x03 |
SET_FEATURE |
设置设备的特征(如端点停滞) |
0x00 |
0000 0000 |
主机到设备 | 标准 | 设备 | 0x01 |
CLEAR_FEATURE |
清除设备的特征(如端点停滞) |
0x00 |
0000 0000 |
主机到设备 | 标准 | 设备 | 0x05 |
SET_ADDRESS |
设置设备的地址 |
0x00 |
0000 0000 |
主机到设备 | 标准 | 设备 | 0x09 |
SET_CONFIGURATION |
设置设备的配置 |
0x80 |
1000 0000 |
设备到主机 | 标准 | 设备 | 0x06 |
GET_DESCRIPTOR |
获取设备的描述符(如设备描述符、配置描述符等) |
0x80 |
1000 0000 |
设备到主机 | 标准 | 设备 | 0x00 |
GET_STATUS |
获取设备的状态信息 |
0x80 |
1000 0000 |
设备到主机 | 标准 | 设备 | 0x07 |
GET_CONFIGURATION |
获取当前的设备配置 |
0x00 |
0000 0000 |
主机到设备 | 标准 | 设备 | 0x0B |
SET_INTERFACE |
设置接口的配置 |
0x80 |
1000 0000 |
设备到主机 | 标准 | 设备 | 0x0A |
GET_INTERFACE |
获取当前接口的配置 |
0x40 |
0100 0000 |
主机到设备 | 类 | 设备 | 0x01 |
SET_IDLE |
设置HID设备的空闲状态 |
0x40 |
0100 0000 |
主机到设备 | 类 | 设备 | 0x03 |
SET_PROTOCOL |
设置HID设备的协议 |
0xC0 |
1100 0000 |
设备到主机 | 类 | 设备 | 0x00 |
GET_REPORT |
获取HID设备的报告 |
0xC0 |
1100 0000 |
设备到主机 | 类 | 设备 | 0x01 |
GET_IDLE |
获取HID设备的空闲状态 |
0xC0 |
1100 0000 |
设备到主机 | 类 | 设备 | 0x02 |
GET_PROTOCOL |
获取HID设备的协议 |
0x20 |
0010 0000 |
主机到设备 | 厂商 | 设备 | 自定义 | 自定义请求 | 厂商自定义的请求 |
0xA0 |
1010 0000 |
设备到主机 | 厂商 | 设备 | 自定义 | 自定义请求 | 厂商自定义的请求 |
五、协议分析
设备描述符请求:
0000 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 00
0010 00 01 00 03 00 80 02 08 00 00 00 00 80 06 00 01
0020 00 00 12 00
这段URB数据包是一个控制传输请求,具体是请求设备描述符。以下是解析后的详细信息:
| 字段 | 字节范围 | 值 | 含义 |
|---|---|---|---|
| Length | 0-1 | 0x001C |
URB数据包总长度(28字节) |
| IRP ID | 2-9 | 0x0000000000000000 |
I/O请求包的唯一标识符(未使用) |
| IRP USBD STATUS | 10-13 | 0x00000000 |
请求成功 |
| URB Function | 14-15 | 0x000B |
URB_FUNCTION_CONTROL_TRANSFER(控制传输) |
| Flags | 16 | 0x00 |
无特殊标志 |
| URB bus id | 17-18 | 0x0001 |
USB总线ID(1) |
| Device address | 19-20 | 0x0003 |
设备地址(3) |
| Endpoint | 21 | 0x80 |
端点地址(方向为IN,端点号为0) |
| URB transfer type | 22 | 0x02 |
控制传输 |
| Packet Data Length | 23-26 | 0x00000008 |
数据包长度(8字节) |
| Control transfer stage | 27 | 0x00 |
控制传输阶段:SETUP阶段(SETUP(0)) |
| bmRequestType | 28 | 0x80 |
请求类型:从设备到主机,标准请求,设备 |
| bRequest | 29 | 0x06 |
请求代码:GET_DESCRIPTOR(获取描述符) |
| wValue | 30-31 | 0x1200 |
描述符类型:0x12(设备描述符),索引:0x00 |
| wIndex | 32-33 | 0x0000 |
语言ID(对于设备描述符,通常为0) |
| wLength | 34-35 | 0x0012 |
请求的数据长度(18字节) |
设备描述符响应:
0000 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00
0010 01 01 00 03 00 80 02 12 00 00 00 03 12 01 10 01
0020 00 00 00 08 ef 17 8d 60 10 01 01 02 00 01
URB头部解析:
| 字段 | 长度(字节) | 偏移 | 值(十六进制) | 值(十进制) | 含义 |
|---|---|---|---|---|---|
| Length | 2 | 0-1 | 1c 00 |
28 | URB数据包总长度(28字节) |
| IRP ID | 8 | 2-9 | 00 00 00 00 00 00 00 00 |
0 | I/O请求包的唯一标识符(未使用) |
| IRP USBD STATUS | 4 | 10-13 | 00 00 00 00 |
0 | 请求成功 |
| URB Function | 2 | 14-15 | 08 00 |
8 | URB_FUNCTION_CONTROL_TRANSFER(控制传输) |
| Flags | 1 | 16 | 00 |
0 | 无特殊标志 |
| URB bus id | 2 | 17-18 | 01 00 |
1 | USB总线ID(1) |
| Device address | 2 | 19-20 | 03 00 |
3 | 设备地址(3) |
| Endpoint | 1 | 21 | 80 |
128 | 端点地址(方向为IN,端点号为0) |
| URB transfer type | 1 | 22 | 02 |
2 | 控制传输 |
| Packet Data Length | 4 | 23-26 | 12 00 00 00 |
18 | 数据包长度(18字节) |
| Control transfer stage | 1 | 27 | 03 |
3 | 控制传输阶段:数据阶段(Data Phase) |
| Data | 18 | 28-45 | 12 01 10 01 00 00 08 ef 17 8d 60 10 01 01 02 00 01 |
- | 实际传输的数据内容(18字节) |
设备描述符解析
| 字段 | 长度(字节) | 偏移 | 值(十六进制) | 值(十进制) | 含义 |
|---|---|---|---|---|---|
| bLength | 1 | 0 | 12 |
18 | 描述符长度 |
| bDescriptorType | 1 | 1 | 01 |
1 | 描述符类型(设备描述符) |
| bcdUSB | 2 | 2-3 | 10 01 |
1.10 | USB规范版本(1.10) |
| bDeviceClass | 1 | 4 | 00 |
0 | 设备类代码(0 表示无特定类) |
| bDeviceSubClass | 1 | 5 | 00 |
0 | 设备子类代码 |
| bDeviceProtocol | 1 | 6 | 00 |
0 | 设备协议代码 |
| bMaxPacketSize0 | 1 | 7 | 08 |
8 | 端点 0 的最大包大小 |
| idVendor | 2 | 8-9 | ef 17 |
6145 | 厂商 ID |
| idProduct | 2 | 10-11 | 8d 60 |
24269 | 产品 ID |
| bcdDevice | 2 | 12-13 | 10 01 |
1.00 | 设备版本号 |
| iManufacturer | 1 | 14 | 01 |
1 | 制造商字符串索引 |
| iProduct | 1 | 15 | 02 |
1 | 产品字符串索引 |
| iSerialNumber | 1 | 16 | 00 |
2 | 序列号字符串索引 |
| bNumConfigurations | 1 | 17 | 01 |
1 | 支持的配置数量 |
说明
- Length:URB数据包的总长度为28字节。
- IRP ID:I/O请求包的唯一标识符,这里未使用。
- IRP USBD STATUS:状态码为0,表示请求成功。
- URB Function:
URB_FUNCTION_CONTROL_TRANSFER,表示这是一个控制传输请求。 - Flags:无特殊标志。
- URB bus id:USB总线ID为1。
- Device address:设备地址为3。
- Endpoint:端点地址为0x80,表示方向为IN,端点号为0。
- URB transfer type:控制传输。
- Packet Data Length:数据包长度为18字节。
- Control transfer stage:控制传输阶段为数据阶段(Data Phase)。
- Data:实际传输的数据内容为
12 01 10 01 00 00 08 ef 17 8d 60 10 01 01 02 00 01,共18字节。
数据部分解析
- Data:
12 01 10 01 00 00 08 ef 17 8d 60 10 01 01 02 00 01- bLength:
0x12(18字节) - bDescriptorType:
0x01(设备描述符) - bcdUSB:
0x0110(USB 1.10) - bDeviceClass:
0x00(无特定类) - bDeviceSubClass:
0x00(无特定子类) - bDeviceProtocol:
0x00(无特定协议) - bMaxPacketSize0:
0x08(8字节) - idVendor:
0x17EF(厂商ID:6145) - idProduct:
0x608D(产品ID:24269) - bcdDevice:
0x0110(设备版本号:1.00) - iManufacturer:
0x01(制造商字符串索引:1) - iProduct:
0x02(产品字符串索引:1) - iSerialNumber:
0x00(序列号字符串索引:2) - bNumConfigurations:
0x01(支持1种配置)
- bLength:
这个URB请求设备的状态信息,数据包长度为18字节,符合USB控制传输的标准格式。

浙公网安备 33010602011771号