WDM:给定设备FDO / PDO确定它是否是USB Root Hub

时间:2013-05-06 17:13:31

标签: usb wdm windows-kernel filter-driver

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

获得

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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