0

USBPcap 附加为所有根集线器的上层过滤器。它通过为 {36FC9E60-C465-11CF-8056-444553540000} 类添加 UpperFilters 条目来实现。然后在 AddDevice 函数中检索 PDO 并获取硬件 ID 列表。然后检查列表中的 USB\ROOT_HUB 和 USB\ROOT_HUB20 条目。如果它在列表中,则该设备被视为 Root Hub,否则不是。上述函数的源代码可在 github 获得:https ://github.com/desowin/usbpcap/blob/master/USBPcapDriver/USBPcapHelperFunctions.c#L725

此解决方案不适用于 USB 3.0 根集线器。由于 USB 3.0 控制器有许多不同的驱动程序,因此没有标准的 USB\ROOT_HUB30 条目。基本上每个驱动程序都有自己的硬件 ID。我宁愿避免列出所有根集线器的硬件 ID。

我想知道是否有任何方法可以可靠地确定设备是否是根集线器,而不仅仅依赖于硬件 ID。

我考虑过检查设备是否具有 GUID_DEVINTERFACE_USB_HUB 并且其父设备是否具有 GUID_DEVINTERFACE_USB_HOST_CONTROLLER,但我不知道如何(以及是否)可以在 AddDevice 回调中调用的函数内部的内核模式下完成。

4

1 回答 1

0

我通过在用户空间应用程序中生成非标准硬件 ID 列表(标准硬件 ID 我的意思是 USB\ROOT_HUB 和 USB\ROOT_HUB20)硬件 ID 并将其存储在注册表中解决了这个问题。我枚举了所有 GUID_DEVINTERFACE_USB_HOST_CONTROLLER 实例并假设子节点是根集线器。

驱动程序检查用户空间应用程序生成的注册表项中是否存在硬件 ID。如果匹配,则将其视为根集线器。

于 2013-07-09T11:12:27.737 回答