本主题提供了一个示例,以说明如何使用 USB ETW 和 Netmon 对 Windows 无法识别 USB 设备进行故障排除。
对于此示例,我们插入了一个设备,该设备在设备管理器和其他用户界面 (UI) 部分中显示为未知设备。硬件 ID 为 USB\UNKNOWN。为了做进一步诊断,我们拔下了设备,开始 ETW 跟踪,并再次插入了设备。当设备显示为未知设备后,我们停止跟踪。
关于未知设备问题
为了调试未知 USB 设备问题,当用户将设备插入系统时,这有助于理解 USB 驱动程序堆栈枚举设备所执行的操作。有关 USB 枚举的信息,请参阅标题为 USB 堆栈如何枚举设备?的博客文章。
通常,如果 USB 驱动程序堆栈枚举设备失败,集线器驱动程序仍然会向 Windows 报告已插入设备,但是在设备管理器中会将设备标记为未知设备。设备的设备 ID 为 USB\VID_0000&PID_0000,硬件 ID 和兼容 ID 为 USB\UNKNOWN。以下事件会导致 USB 集线器驱动程序将 USB 设备枚举为未知设备:
- 枚举过程中端口重置请求超时。
- USB 设备的设置地址请求失败。
- 对 USB 设备的设备描述符请求失败。
- USB 设备描述符已损坏且验证失败。
- 对配置描述符的请求失败。
- USB 配置描述符已损坏且验证失败。
在 Windows 7 中,枚举失败的未知设备在设备管理器中标有故障代码 43。
如果设备在设备管理器中标有故障代码 28,则设备会枚举成功,但是仍然是未知设备。此故障代码表示设备在枚举过程中未提供产品产品 ID 字符串,Windows 无法找到设备的匹配 INF 来安装驱动程序。
启动事件跟踪分析
由于这是因设备故障而造成的,我们建议你将 Netmon 与 USB 分析器结合使用来分析日志文件。
查看事件跟踪日志
- 运行 Netmon,依次单击“文件”->“打开”->“捕获”,然后选择文件。
- 在“帧摘要”窗格中选择第一个事件,其中具有有关 SystemTrace 的说明。 此图像将显示在选择第一个事件后屏幕所呈现的外观。
- 若要自定义 Netmon 显示的列,请右键单击列名称并选择“选择列”。
- 第一个事件(标识为类型 SystemTrace)包含有关日志的常规信息。你可以通过在“帧详细信息”窗格中展开信息树,来查看诸如已丢失事件的数目和跟踪的开始时间等信息。
USB 设备摘要事件
事件 2 是日志中的第一个 USB 事件。此事件以及数个后续事件描述启动跟踪时连接到系统的 USB 主机控制器、集线器和设备。我们可将这一组事件称为设备摘要事件(或摘要事件)。如同第一个事件一样,摘要事件不描述驱动程序活动。摘要事件记录日志会话开始时的设备状态。其他事件表示总线上发生的活动、与客户端驱动程序或系统的交互,或是内部状态的变化。
USB 集线器和 USB 端口驱动程序都会记录摘要事件。记录事件的驱动程序在协议名称列中标识。例如,USB 端口驱动程序记录的事件具有 USBPort_MicrosoftWindowsUSBPORT 协议名称。USB 事件跟踪通常包含一系列端口摘要事件,后跟一系列集线器摘要事件。许多