gpt4 book ai didi

windows - 如何在 Windows 中监控 USB 设备枚举和删除?

转载 作者:可可西里 更新时间:2023-11-01 09:38:15 25 4
gpt4 key购买 nike

我想监控运行 Windows 的计算机的 USB 总线的(未)插入事件。当设备插入(未)插入时,我想知道它的 USB 地址、供应商 ID、根集线器 ID 和设备上方的集线器端口。例如usb_addr: 10, vendor_id: 1234, product_id: 5678, bus_id: 2, port_path: 5/4/3

这意味着它是总线 ID 2 端口 5 上的设备,并且插入了另一个集线器,在该集线器的端口 4 上有另一个集线器,在该集线器的端口 3 上是正在报告的设备。

我正在尝试编写一小段特定于操作系统的代码来执行 USB 设备热插拔检测,以集成到更大的跨平台(Linux、Windows、Mac)测试程序中。使用此热插拔代码的代码是用 Python 3 编写的,所以我更愿意用 Python 编写热插拔代码,但我对此有点灵活,但我真的想避免任何需要我支付的费用获得许可证。

似乎有两个主要选择:

我看过一些关于 Windows API 函数 RegisterDeviceNotification 的讨论,但我不清楚是否可以注册以接收所有 USB 设备的事件,或者您是否需要知道特定设备接口(interface)的 GUID(例如. 键盘、鼠标等)。如果是这样的话,这个解决方案似乎不会起作用,因为我想监控所有 USB 设备。

另一个选项似乎涉及称为“WMI”的东西,它似乎主要出现在讨论“托管”代码时,这将迫使我用 C# 或 IronPython 等 .NET 语言编写此组件。这个问题 ( Get List of connected USB Devices ) 询问如何查询 USB 设备并提供了一个示例,但它不处理热插拔事件,用户“Nedko”建议类 Win32_USBControllerDevice应该使用而不是 Win32_USBHub。我真的不明白 Win32_USBControllerDevice 对象实际建模的是什么。似乎 Dependent 成员可能是对 CIM_LogicalDevice 对象的引用,但即便如此,它似乎也缺少我正在寻找的 USB 特定信息。

我应该查看哪些 API 来解决这个问题?

最佳答案

您看到的是 USB 设备类。还有接口(interface)类。传递 GUID_DEVINTERFACE_USB_DEVICE(usbiodef.h,驱动程序文档)为任何 USB 事件生成事件。另一个可能的候选者,GUID_DEVCLASS_USB,似乎是针对无法识别的 USB 设备。我在测试期间无法触发它。

请注意 an article by Doran Holan (微软开发人员)似乎声称传递接口(interface)类 GUID 不起作用。他的文章是2006年之前this answer (2009) 已发布,声称我详述的方法有效。

如果您需要与 Windows 的低级功能进行交互,您将在尝试通过 Python(大约 2018 年)进行一场艰苦的战斗。 IronPython 可能会很顺利。 C# 是命中注定的——通常你会发现缺少重要的功能。任何给定库的绑定(bind)通常都无法正常工作。

要像在 C# 中一样在 C++ 中使用 WMI(例如使用 ManagementObjectSearcherManagementObject),您应该实例化一个 IWbemServices使用 IWbemLocator::ConnectServer然后调用IWbemServices::ExecQuery .

您可以查看 WMI C++ Application Examples想要查询更多的信息。

关于windows - 如何在 Windows 中监控 USB 设备枚举和删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16044418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com