BusHound抓包的USTS数据内容来源介绍
在Windows操作系统下开发USB设备驱动程序,或者分析USB设备固件通讯的时候,难免遇到一个错误信息,其中一项重要的数据条目就是USTS的显示。如:
Device Phase Data Description Cmd.Phase.Ofs(rep)
------ ----- ------------------------------------------------------------------
20.0 CTL 21 0a 00 00 00 00 00 00 SET IDLE 7.1.0
20.0 USTS c0000004 stall pid 7.2.0
当然,USTS的显示也只是当系统的URB错误在BUSHOUND抓包中显示,如果正确,也就不显示了。
在BUSHOUND中要抓取USTS需要配置一下:
这个USTS的数据内容,在之前的文章有介绍:http://www.usbzh.com/article/detail-645.html ,我们可以通过这些数据内容来判决USB通讯的错误信息,然后帮助我们来调试分析USB设备的通讯。
USTS数据来源
BUSHOUND抓取的USB通讯数据包是按IRP来显示了,所以这里的一个IRP不是一个事务,也不是一个包,而是一次USB的标准请求,所以可能包括多个事务。
在Windows USB驱动架构中,一个IRP其实包括一个URB,这个URB中包括了该次请求的所有数据信息。
我们在之前的文章中也进行了手动分析URB,其内容包括:
- 手动分析使用BUSHOUND抓取同步传输的URB http://www.usbzh.com/article/detail-647.html
- 使用BUSHOUND手动分析USB控制传输的URB http://www.usbzh.com/article/detail-648.html
- 使用BUSHOUND手动分析USB批量传输的URB http://www.usbzh.com/article/detail-649.html
当然,我们也弄了相关的在线分析工具:
- USB中断批量传输X64 URB数据在线分析 http://www.usbzh.com/tool/urb-bulk-or-interrupt.html
- USB同步传输X64 URB数据在线分析 http://www.usbzh.com/tool/urb-iso.html
如果大家对这些工具熟练应用或者经常手动分析URB内容的时候,可能会留意到一个字段USBD_STATUS,该字段位于URB的子结构体URB_HEADER中。该结构体是每种USB通讯对应的URB的公共头结构。
struct _URB_HEADER {
USHORT Length;
USHORT Function;
USBD_STATUS Status;
PVOID UsbdDeviceHandle; // Reserved
ULONG UsbdFlags; // Reserved
};
而在微软的官方文档中,指明了USBD_STATUS Status的含义。
The USBD_STATUS data type defines USB status values for USB requests.
USBD_STATUS文档地址:https://docs.microsoft.com/en-us/previous-versions/windows/hardware/drivers/ff539136(v=vs.85)?redirectedfrom=MSDN
所以这里我们可以看到,经常见到的0xC0000004,表示STALL PID(USBD_STATUS_STALL_PID).当然,这里的错误信息并不一一定代表真实的错误信息,正如我们之前分析的STALL PID的错误来源一样,情况比较复杂,需要根据实际情况来判断。详见:http://www.usbzh.com/article/detail-560.html
USTS的头文件
USTSC的定义在usb.h中,如本人使用的版本路径为:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared\usb.h