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 请求类型(如控制传输、批量传输、中断传输等)而有所不同。

posted @ 2025-08-13 19:19  cupid8505  阅读(119)  评论(0)    收藏  举报