2012-01-30 71 views
6

我想知道是否有人可以幫忙,這有點專家的問題。我有一個應用程序,需要閱讀和分析一些USB設備(不同時,他們每個運行在單獨的測試,理論上可以在不同的機器上運行)。用自定義驅動程序替換Windows USB類驅動程序?

每個USB設備都基於USB HID類別,由不同的公司生產,這些USB設備都不是爲在PC上運行而設計的,而是針對不同的平臺,但是出於測試客戶請求從PC運行測試應用程序的設備。

某些設備將啓動,被windows識別,它將使用Windows內置的通用HID類驅動程序進行初始化和正確啓動,然後設備將開始發送要測試的數據的正確數據包。

某些設備將啓動,被Windows識別,它將嘗試啓動它們,但無法完全初始化它們,使它們處於半初始化狀態。這很好,因爲我可以使用我的Beagle協議分析器從真正的平臺捕獲初始化數據包,然後使用LibUSBDotNet庫複製初始化序列中的剩餘數據包,並讓它們開始正確發送數據包。

我遇到的問題是一個特定的設備(雖然還有一些我還沒有測試過,所以很可能其中的一個也可能會出現同樣的問題)。問題在於Windows HID類驅動程序識別設備並嘗試初始化並啓動它,這可以在流行和設備開始發送數據之後生效。

問題是發送的數據與發送到真正平臺(僅包含完整數據的子集)的數據不同。就好像Windows已經將設備初始化爲不同的模式。

當我使用USB協議分析器從PC和正版平臺捕獲初始化數據包時,我發現Windows正在發送一些稍微不同的初始化數據包。一旦Windows已經啓動設備,使用LibUSBDotNet重新發送正確的數據包似乎沒有效果。

我的問題是,我需要停止嘗試使用標準HID類驅動程序初始化設備的窗口,我試過在設備管理器中刪除驅動程序,但它仍然初始化它(並且驅動程序在設備中奇蹟般地重新分配經理)。我做了一些調查,並有可能的備選方案:

  1. 創建的Windows將分配給特定的VID特定的驅動程序/設備的PID,但是這並沒有什麼,然後我可以使用LibUSBDotNet發送正確從我自己的代碼中初始化設備到設備。

  2. 使用類似了WinUSB來創建用於該設備的合適的驅動程序(或可能創建像1.

「死」驅動程序將具有特定VID駕駛員/ PID限定通過使用Windows優先於它的內置USB HID類驅動程序?如果沒有,那麼我會浪費我的時間沿着這條路線?

請注意,我的Mac初始化問題設備正確,我問客戶的問題是否該應用程序可以爲Mac開發,他們的答案令人沮喪的只有Windows。

我在編寫適當的Windows驅動程序方面沒有任何經驗,儘管我有相當低的USB通話經驗(所以部分不用太擔心)。任何人都可以提出一個好的行動方案(在我可能浪費數週的時間來研究如何爲PC寫驅動程序,但僅僅發現我選擇的行動方案不能滿足我的要求)。

任何幫助或建議非常感謝。

感謝, 豐富


新增嘗試以下建議後:

我使用LibUsbDotNet INF嚮導創建必要的文件和安裝它們試圖與這似乎工作 - 當然,該設備是現在作爲libusb-win32設備出現在設備管理器中 - 而不是HID設備,關聯的驅動程序是libusb驅動程序。即使這樣做後,設備似乎仍然被初始化並開始發送錯誤類型的數據包,儘管現在這些數據包不再由類驅動程序處理並且丟失了。

我也遇到過Zadig,它有一個類似的WinUSB inf創建嚮導,這有完全一樣的結果。

一位同事建議,它可能不是Windows本身,而是將設備切換到此模式,而不是設備識別它連接到Windows機器並切換到此模式。我懷疑是這樣的,在這種情況下,我被困住了 - 有時間與客戶進行另一次對話。

非常感謝您的幫助。

+1

你可以提出這個問題更簡潔嗎?我懷疑很多人會閱讀所有這些。 – 2012-01-30 09:43:44

回答

4

您正在使用libusb-win32作爲過濾驅動程序;也就是說,HidUsb設備驅動程序是爲您的設備分配和加載的,但是隨後libusb-win32驅動程序將加載到您的設備上,併爲您提供無障礙的硬件訪問。

如果您不希望HidUsb(或任何其他類驅動程序)「代表您」執行任何通信,只需將libusb-win32作爲設備驅動程序與您的硬件相關聯即可。爲此,您必須創建一個.INF文件,將其與每個USB設備的VID/PID /修訂版關聯。如果我沒有記錯,libusb-win32甚至附帶一個實用程序來生成這樣的.INF文件。

如果您安裝.INF文件,例如與PnpUtil.exe(可用於Vista或更高版本),您仍可能遇到問題,雖然您比通用HID驅動程序更匹配,但HID驅動程序仍處於選中狀態。

通用HID驅動程序通過其兼容ID(即通過USB接口類)匹配設備,而您將通過硬件ID(具有更高優先級)進行匹配。但是,Windows可能會優先考慮其他方面,例如您的驅動程序未經簽名。閱讀:How Windows Selects Drivers

幸運的是,即使在這種情況下,具有自我生成的證書籤名的驅動程序(使用CertUtil.exeMakeCat.exeSignTool.exe)是不是太困難。

+0

謝謝,那裏有很多真正有用的信息。是的,我正在使用我通過LibUSBDotNet安裝的過濾器。我會按照你的建議嘗試並通過一個inf文件進行安裝。我調查你的所有建議,並讓你知道我如何繼續。 – 2012-02-02 14:48:30

+0

請參閱上面的添加註釋,解決方案的工作原理是阻止類驅動程序被加載並停止類驅動程序的後續處理,不幸的是,窗口需要識別設備並加載替代驅動程序的最低限度仍然足以觸發問題。感謝您的幫助,這是學習設備驅動程序等非常有用的練習。 – 2012-02-02 16:44:52

+0

在一個簡單的設備上,Windows只會執行一個平常的「獲取設備描述符」和「獲取配置描述符」。如果它是一個複合設備,則會獲取更多描述符。在任何情況下,Windows都不會在此階段讀取/寫入端點或執行奇怪的控制請求。 當你說「替代驅動程序」,替代驅動程序是否真的爲設備加載,如果是,它是哪個驅動程序? – Ilya 2012-02-08 08:29:47