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 回调中调用的函数内部的内核模式下完成。