usb学习之四: USB Request Block (URB)
因为我们是在windows下使用wireshark抓包,这里就必须了解URB的相关知识点。这样方便于后面的抓包数据分析。
一、USB Request Block
在Windows系统中,URB(USB Request Block,USB请求块) 是一个用于USB设备通信的核心数据结构,它封装了USB客户端驱动程序与USB驱动程序堆栈之间通信的所有必要信息。
URB的定义与作用
URB是一个可变长度的数据结构,用于描述USB客户端驱动程序向USB驱动程序堆栈发送的请求。它包含请求的详细信息以及请求完成后的状态信息。客户端驱动程序通过URB执行所有特定于设备的操作,包括数据传输。
URB的组成
每个URB都以一个标准固定大小的标头(_URB_HEADER)开头,其主要成员包括:
Length:指定URB的大小(以字节为单位)。
Function:指定一个数字代码,指示此URB的请求操作类型。
Status:USB驱动程序堆栈使用此成员返回特定于USB的状态代码。
URB还包含多种具体的操作请求结构,例如:
URB_FUNCTION_CONTROL_DESCRIPTOR_REQUEST:用于在USB设备上检索或设置描述符。
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:用于在大容量管道或中断管道上进行数据传输。
URB_FUNCTION_ISOCH_TRANSFER:用于进行时序传输。
URB的使用场景
在Windows驱动程序模型(WDM)中,USB客户端驱动程序不能直接与USB设备通信,而是通过创建URB并将其提交到USB驱动程序堆栈来处理请求。常见的使用场景包括:
设备枚举:主机通过URB请求设备描述符、配置描述符等信息。
数据传输:客户端驱动程序通过URB在控制、批量、中断或时序管道上进行数据传输。
设备控制:例如,通过URB设置设备地址、配置设备、清除或设置特征。
**二、URB的头部结构以及示例 **
URB 头部的长度通常是固定的,为 28 字节。这 28 字节包含了 URB 的所有控制信息,使得操作系统能够正确处理 USB 请求。如下例所示:
| 字段 | 长度(字节) | 偏移 | 值(十六进制) | 值(十进制) | 含义 |
|---|---|---|---|---|---|
| Length | 2 | 0-1 | 0x1c00 |
7168 | URB 数据包总长度(28 字节) |
| IRP ID | 8 | 2-9 | 0x503adb c287c0ffff |
- | I/O 请求包的唯一标识符 |
| IRP USBD STATUS | 4 | 10-13 | 0x00000000 |
0 | 请求成功 |
| URB Function | 2 | 14-15 | 0x0008 |
8 | URB_FUNCTION_CONTROL_TRANSFER |
| Flags | 1 | 16 | 0x00 |
0 | 无特殊标志 |
| URB bus id | 2 | 17-18 | 0x0001 |
1 | USB 总线 ID |
| Device address | 2 | 19-20 | 0x0008 |
8 | 设备地址 |
| Endpoint | 1 | 21 | 0x80 |
128 | 端点地址(方向为 IN) |
| URB transfer type | 1 | 22 | 0x02 |
2 | 控制传输 |
| Packet Data Length | 4 | 23-26 | 0x0000000b |
11 | 数据包长度(11 字节) |
| Control transfer stage | 1 | 27 | 0x01 |
1 | 控制传输阶段:数据阶段(Data Phase) |
三、其它说明
URB 是 Windows 特有的,而不是 USB 标准协议的一部分。
在 URB 头部之后,URB 包含了标准的 USB 协议数据。这些数据根据具体的 USB 请求类型(如控制传输、批量传输、中断传输等)而有所不同。

浙公网安备 33010602011771号