簡體   English   中英

如何在Windows中監控USB設備枚舉和刪除?

[英]How can I monitor USB device enumeration and removal in Windows?

我想監視運行Windows的計算機的USB總線(un)插件事件。 當(未)插入設備時,我想知道它的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編寫hotplug代碼,但我對此有點靈活,但我真的想避免任何需要我支付的東西獲得許可證。

似乎有兩個主要選擇:

我已經看過一些關於Windows API函數RegisterDeviceNotification的討論,但是我不清楚是否可以注冊接收所有USB設備的事件,或者是否需要知道特定設備接口的GUID(例如鍵盤,老鼠等)。 如果是這種情況,似乎這個解決方案無法正常工作,因為我想監控所有USB設備。

另一個選項似乎涉及一些名為“WMI”的東西,它似乎主要出現在“托管”代碼的討論中,這將迫使我用.NET語言(如C#或IronPython)編寫這個組件。 這個問題( 獲取連接的USB設備列表 )詢問如何查詢USB設備並提供一個示例,但它不處理hotplug事件,用戶“Nedko”建議應該使用類Win32_USBControllerDevice而不是Win32_USBHub。 我真的不明白Win32_USBControllerDevice對象實際建模的內容。 似乎Dependent成員可能是對CIM_LogicalDevice對象的引用,但即便如此,它似乎也缺少我正在尋找的USB特定信息。

我應該考慮哪些API來解決這個問題?

你看到的是USB設備類。 還有接口類。 傳遞GUID_DEVINTERFACE_USB_DEVICEusbiodef.h ,驅動程序文檔)會為任何USB活動生成事件。 另一個可能的候選者GUID_DEVCLASS_USB似乎是用於無法識別的USB設備。 我在測試期間無法觸發它。

請注意, Doran Holan (Microsoft開發人員)的文章似乎聲稱傳遞接口類GUID不起作用。 他的文章是在2006年,在此答案 (2009年)發布之前,聲稱我詳細說明的方法是有效的。

如果您需要與Windows的低級功能進行交互,那么您將嘗試從Python(大約2018年)開始進行一場艱苦的戰斗。 IronPython可能會很好。 C#是命中注定 - 通常你會發現缺少重要的功能。 任何給定庫的綁定通常都不會很好。

要像在C#中那樣使用C ++中的WMI(例如使用ManagementObjectSearcherManagementObject ),您應該使用IWbemLocator::ConnectServer實例化IWbemServices ,然后調用IWbemServices::ExecQuery

您可以查看WMI C ++應用程序示例以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM