2012-01-30 8 views
6

誰もが助けることができるのだろうか、それに専門家の問題が少しあります。Windows USB Class Driverをカスタムドライバに置き換えますか?

私は、多数のUSBデバイスを読み込んで分析する必要があるアプリケーションを持っています(同時ではなく、それぞれ別々のテストで実行され、理論上は異なるマシンで実行できます)。

各USBデバイスはUSB HIDクラスに基づいており、異なる会社によって製造されていますが、これらのUSBデバイスはいずれもPC上で動作するようには設計されていませんが、異なるプラットフォーム用ですクライアントがテストアプリケーションがPCから実行されることを要求したデバイスをテストします。

一部のデバイスが起動し、ウィンドウに組み込まれた汎用HIDクラスドライバを使用して正しく初期化され、起動されるウィンドウで認識され、テスト対象のデータの正しいデータパケットが送信されます。

デバイスのいくつかは起動し、起動しようとするウィンドウで認識されますが、完全に初期化されずに半初期化された状態になります。ビーグルプロトコルアナライザーを使って本物のプラットフォームから初期化パケットを取得し、LibUSBDotNetライブラリーを使用して初期化シーケンスの残りのパケットを複製し、パケットを正しく送信するようにすることができます。

私が持っている問題は、ある特定のデバイスにあります(しかし、まだいくつかテストされていませんので、それらのうちの1つでは同じ問題が発生する可能性があります)。問題は、Windows HIDクラスドライバがデバイスを認識して初期化して起動しようとすることです。これはファッションの後に動作し、デバイスはデータの送信を開始します。

問題は、送信されるデータが正規のプラットフォーム(完全なデータのサブセットのみを含む)に送信されるデータと異なることです。 Windowsがデバイスを別のモードに初期化したようです。

USBプロトコルアナライザを使用してPCと純正プラットフォームの両方から初期化パケットをキャプチャすると、Windowsはわずかに異なる初期化パケットを送信しています。一度Windowsが既にデバイスを起動してしまえば、LibUSBDotNetを使って正しいパケットを再送信することは効果がないようです。

私の問題は、標準のHIDクラスドライバを使用してデバイスを初期化しようとするのを止める必要があることです。デバイスマネージャでドライバを削除しようとしましたが、まだ初期化しています(そしてドライバは魔法のようにデバイスマネージャー)。私はいくつかの調査を行ってきたし、可能な選択肢があります。その後、私は正しいを送信するためにLibUSBDotNetを使用することができ、

  1. は、Windowsが特定のVIDデバイスの/ PIDに割り当てる固有のドライバを作成しますが、それは何もしません私自身のコードからデバイスへの初期化シーケンス。

  2. 使用1.

のようなデバイスのための適切なドライバを作成する(または多分「死んだ」ドライバを作成するためのWinUSBのようなものは、特定のVID/PIDを持つドライバーはで使用される定義されますUSBハイドのクラスドライバを優先して設定していますか?そうでなければ、このルートを辿る時間が無駄になりますか?

my macは問題のデバイスを正しく初期化しています。アプリケーションはMac向けに開発することができ、彼らの答えはWindowsだけで欲求不満でした。

私は比較的低レベルでUSBと話をした経験がありますが(私はその部分があまり心配しないように)、適切なWindowsドライバを書いた経験はありません。誰もが私の選択した行動コースが私が必要なものを提供することができないことを見つけるためにのみPCのためのドライバを書く方法を調べる潜在的に何週間も無駄にする前に、行動の良いコースを提案することができます。

何か助けてください、または非常に感謝してください。

おかげで、 リッチ


追加は下の提案を試した後:

私はLibUsbDotNet INFウィザード必要なファイルを作成し、それらをインストールして使用してみました、これは仕事に登場 - 確かにデバイスでしたlibusb-win32デバイスとしてDevice Managerに表示され、HIDデバイスではなく、関連付けられたドライバはlibusbドライバでした。これを行った後も、デバイスは初期化されて間違ったタイプのデータパケットを送信し始めているように見えますが、これらのパケットはもはやクラスドライバによって処理されなくなり、失われます。

また、WinUSB用の同様のinf作成ウィザードを持つZadigも出てきましたが、まったく同じ結果でした。

同僚は、デバイスをこのモードに切り替えるウィンドウ自体ではなく、デバイスがWindowsマシンに接続されていることを識別し、このモードに切り替えることを示唆しています。私はこれが事実だと思う。その場合、私は立ち往生している - クライアントと別の会話をする時間です。

多くのご協力ありがとうございます。

+1

この質問をより簡潔にすることはできますか?私は多くの人がそれをすべて読むとは思っていません。 –

答えて

4

フィルタドライバとしてlibusb-win32を使用しています。つまり、HidUsbデバイスドライバがデバイスに割り当てられ、ロードされていますが、libusb-win32ドライバが一番上にロードされ、ハードウェアへの妨げにならないアクセスが可能になります。

HidUsb(または他のクラスドライバ)が "あなたの代わりに"通信を実行しないようにするには、デバイスドライバとしてlibusb-win32をハードウェアに関連付けます。このためには、各USBデバイスのVID/PID/Revisionに関連付ける.INFファイルを作成する必要があります。 libusb-win32にこのような.INFファイルを生成するユーティリティが付属しています。

この.INFファイルをインストールすると、 PnpUtil.exe(Vista以上で使用可能)であれば、引き続きHIDドライバよりも優れていても、HIDドライバは選択されたままで問題が発生する可能性があります。

一般的なHIDドライバは、(優先度が高い)ハードウェアIDで一致させる間に、互換性のあるID(つまりUSBインターフェイスクラス)でデバイスを照合します。ただし、Windowsは、ドライバが署名されていないなど、他の側面を優先する場合があります。読む:How Windows Selects Drivers

幸いにも、でもそのシナリオでは、自己生成された証明書と署名のドライバは(CertUtil.exeMakeCat.exeSignTool.exeを使用することは)あまりにも難しいことではありません。

+0

ありがとう、そこには本当に役に立つ情報がたくさんあります。はい、私はLibUSBDotNet経由でインストールしたフィルタを使用しています。あなたが提案してinfファイル経由でインストールするときに私は試してみます。私はあなたのすべての提案を調査し、私がどのように乗っているかを伝えます。 –

+0

上記のコメントを参照してください。あなたのソリューションはクラスドライバがロードされるのを防ぎ、クラスドライバによる後続の処理を停止します。残念ながら、ウィンドウがデバイスを識別し、代替ドライバをロードするのに必要です。 。助けてくれてありがとう、それはデバイスドライバなどについて学習するのに非常に便利な練習でした。 –

+0

単純なデバイスでは、Windowsは珍しい "デバイスディスクリプタの取得"と "設定ディスクリプタの取得"を行います。コンポジットデバイスの場合、より多くのディスクリプタが取得されます。この段階でWindowsはエンドポイントへの読み書きや奇妙な制御要求を行うことはありません。 「代替ドライバ」と言えば、別のドライバが実際にデバイスのために読み込みますか?もしそうなら、それはどのドライバですか? – Ilya

関連する問題