8

誰かが助けてくれるのではないかと思いますが、これは少し専門家の問題です。

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

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

一部のデバイスは起動し、Windowsによって認識され、Windowsに組み込まれている汎用HIDクラスドライバーを使用して正しく初期化および起動します。その後、デバイスはテスト対象のデータの正しいデータパケットの送信を開始します。

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

私が抱えている問題は、特定の1つのデバイスにあります(まだテストしていないデバイスがいくつかあるため、そのうちの1つでも同じ問題が発生する可能性があります)。問題は、Windows HIDクラスドライバーがデバイスを認識し、初期化して開始しようとすることです。これは、流行の後に機能し、デバイスがデータの送信を開始します。

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

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

私の問題は、Windowsが標準のHIDクラスドライバーを使用してデバイスを初期化しようとするのを止める必要があることです。デバイスマネージャーでドライバーを削除しようとしましたが、それでも初期化されます(そしてドライバーはデバイスマネージャーで魔法のように再割り当てされます)。私はいくつかの調査を行いましたが、可能な代替案があります:

  1. Windowsがデバイスの特定のVID/PIDに割り当てる特定のドライバーを作成しますが、それは何もしません。次に、LibUSBDotNetを使用して、自分のコード内からデバイスに正しい初期化シーケンスを送信できます。

  2. WinUSBのようなものを使用して、デバイスに適切なドライバーを作成します(または、1のような「デッド」ドライバーを作成することもできます。

特定のVID/PIDが定義されたドライバーは、組み込みのUSB HIDクラスドライバーよりもWindowsで使用されますか?そうでなければ、私はこのルートを下るのに時間を無駄にするだろうか?

私のMacは問題のあるデバイスを正しく初期化することに注意してください。クライアントに、アプリケーションをMac用に開発できるかどうかを尋ねましたが、その答えはWindowsだけでイライラしていました。

比較的低レベルでUSBと通信した経験はありますが、適切なWindowsドライバーを作成した経験はありません(そのため、あまり心配する必要はありません)。誰かが良い行動方針を提案できますか(私が選択した行動方針を見つけるためだけにPC用のドライバーを書く方法を調査するのに何週間も無駄にする前に、私が必要なものを提供できません)。

どんな助けや提案も大歓迎です。

ありがとう、リッチ


以下の提案を試した後に追加されました:

LibUsbDotNet infウィザードを使用して必要なファイルを作成し、それらをインストールしようとしましたが、これは機能しているように見えました。確かに、デバイスはHIDデバイスではなくlibusb-win32デバイスとしてデバイスマネージャーに表示され、関連するドライバーはlibusbドライバーでした。これを行った後でも、デバイスは初期化され、間違ったタイプのデータパケットの送信を開始しているように見えますが、これらのパケットはクラスドライバーによって処理されなくなり、失われるだけです。

WinUSB用の同様のinf作成ウィザードを備えたZadigにも出くわしましたが、これはまったく同じ結果でした。

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

助けてくれてありがとう。

4

1 に答える 1

8

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

HidUsb(または他のクラスドライバー)に「ユーザーに代わって」通信を実行させたくない場合は、デバイスドライバーとしてlibusb-win32をハードウェアに関連付けるだけです。このためには、各USBデバイスのVID /PID/リビジョンに関連付ける.INFファイルを作成する必要があります。正しく思い出せば、libusb-win32にはそのような.INFファイルを生成するユーティリティも付属しています。

この.INFファイルをPnpUtil.exe(Vista以降で使用可能)などでインストールすると、一般的なHIDドライバーよりも一致しているにもかかわらず、HIDドライバーが選択されているという問題が発生する可能性があります。

汎用HIDドライバーは、互換性のあるID(つまり、USBインターフェイスクラス)によってデバイスを照合しますが、ハードウェアID(優先度が高い)によって照合します。ただし、Windowsは、ドライバーが署名されていないなど、他の側面を優先する場合があります。読む:Windowsがドライバーを選択する方法

幸いなことに、そのシナリオでも、自己生成証明書(、、および)を使用してドライバーに署名することCertUtil.exeMakeCat.exeそれほどSignTool.exe難しくありません。

于 2012-01-30T12:22:14.067 に答える