WDM:给定设备FDO/PDO确定它是否';s USB根集线器

WDM:给定设备FDO/PDO确定它是否';s USB根集线器,usb,wdm,windows-kernel,filter-driver,Usb,Wdm,Windows Kernel,Filter Driver,USBPcap作为所有根集线器的上过滤器连接。它通过为{36FC9E60-C465-11CF-8056-444553540000}类添加UpperFilters条目来实现。然后在AddDevice函数中检索PDO并获取硬件ID列表。然后检查列表中的USB\ROOT\u HUB和USB\ROOT\u HUB20条目。如果它在列表中,则该设备被视为根集线器,否则不被视为根集线器。 上述函数的源代码可从github获得: 此解决方案无法与USB 3.0根集线器配合使用。由于USB 3.0控制器有许多不

USBPcap作为所有根集线器的上过滤器连接。它通过为{36FC9E60-C465-11CF-8056-444553540000}类添加UpperFilters条目来实现。然后在AddDevice函数中检索PDO并获取硬件ID列表。然后检查列表中的USB\ROOT\u HUB和USB\ROOT\u HUB20条目。如果它在列表中,则该设备被视为根集线器,否则不被视为根集线器。 上述函数的源代码可从github获得:

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

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


我考虑过检查设备是否有GUID\u DeviceInterface\u USB\u HUB,其父设备是否有GUID\u DeviceInterface\u USB\u HOST\u控制器,但我不知道如何(以及是否)在AddDevice回调中调用的函数中以内核模式执行此操作。

我通过生成非标准的列表解决了此问题(所谓标准硬件ID,我指的是用户空间应用程序中的USB\ROOT\u HUB和USB\ROOT\u HUB20)硬件ID,并将其存储在注册表中。我枚举了所有GUID\u DeviceInterface\u USB\u HOST\u控制器实例,并假设子项是根集线器

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