7

CreateFile()APIを使用してUSBデバイスに対して読み取り/書き込みを行うライブラリがあります。デバイスは、MicrosoftのHIDクラスドライバーと互換性があるように、HIDデバイスプロファイルを実装します。

システムにインストールされている他のアプリケーションが、共有モードのない読み取り/書き込みモードでデバイスを開いています。これにより、私のライブラリ(およびそれを消費するもの)がデバイスで機能しなくなります。これは、HID互換デバイスであることに問題があると思います。他のドライバーソフトウェア(マウス、コントローラー、PHIDGETSなど)は非協調的である可能性があります。

とにかく、デバイスファイルのパスは次の形式です。

1:「\\?\ hidden#hpqremhiddevice&col01#5&21ff20e7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}」。

2:「\\?\ hidden#vid_045e&pid_0023#7&34aa9ece&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}」。

3:「\?\ hidden#vid_056a&pid_00b0&col01#6&5b05f29&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}」。

そして、私は次のようなコードを使用してそれを開こうとしています:

//  First, open it with minimum permissions, this device may not be ours.
//  we'll re-open it later in read/write
hid_device_ref = CreateFile(
    device_path, GENERIC_READ,
    0, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

SysInternalsのFileMonやProcessMonitorのようなツールを検討しました。しかし、上記のようなデバイスファイルハンドルの使用状況を報告することはできないようです。

4

4 に答える 4

4

sysinternalsのhandleというツールは試しましたか?

とにかく、どちらのウィンドウもこれを行いません (デバイスをロックしたアプリケーションの名前を表示します): USB デバイスを取り出そうとすると、Windows はデバイスが現在使用中であり、今は削除できないとだけ言います。

于 2008-09-05T14:02:08.967 に答える
1

デバイスハンドルを開いて読み取りと書き込みのどちらのアクセス許可も要求せず、機能レポートのみを使用してデバイスハンドルを操作するというトリックがあります。 Jan Axelsonは、USBHIDデバイスに関する彼女の本の中でこのトリックについて言及しています。これは、Windowsがシステムキーボードまたはマウスと見なすデバイスへのハンドルを開こうとしたときに発生する排他ロックの問題を回避すると思います。ハンドルの読み取りまたは書き込みができない場合でも、を使用して機能レポートをデバイスに送信し、を使用しHidD_SetFeatureてデバイスからレポートを読み取ることができます。HidD_GetFeature。このような状況で入力レポートを読んだり出力レポートを送信したりする方法がわからないので、おそらく不可能ですが、特にデバイスが「あなたの」デバイスである場合は、どちらも必要ないかもしれません。ファームウェアを制御すること。厳密に言えば、これは質問に答えるには何の役にも立ちませんが、潜在的に関連があるように思われたので、私はそれをそこに捨てると思いました。

于 2009-04-09T18:48:39.583 に答える
1

これは私がMagtekカードリーダーから読み取るために使用するものです。

//Open file on the device
deviceHandle = 
    CreateFile (deviceDetail->DevicePath, 
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, 0, NULL);

これらのオプションを試して、少なくともデバイスから読み取ることができるかどうかを確認してください。

ここであなたの苦痛を理解しています...USBHIDのドキュメントが基本的にいくつかの場所で間違っていることがわかりました。

[編集]この問題についてはあまりありません。これは、下部のスレッドで主題に軽く触れるコードプロジェクトリンクです。キーボードやマウスのウィンドウがそれを独占的につかんでいるのかもしれません。

于 2008-08-22T19:11:44.750 に答える
0

クール - これらのオプションを試してみるつもりです. 残念ながら、自分のデバイスがそこにあることはわかっており、最終的には後で読み取り/書き込みアクセスが必要になります (記述子を調べて、それが実際に自分のデバイスにあることを確認したら)。

つまり、私の本当の目標は、それを使用しているものを知ることなので、顧客/ユーザーに次のように通知できます。 SuperWidget アプリケーション。」(アプリケーション レベルでない場合は、少なくとも電話サポート レベルで。)

GetLastError() によって報告される Windows エラーは次のとおりであることを忘れていました。

0x20。ファイルが別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。

(したがって、他のプロセスに代わって FILE_SHARE_NONE がないと仮定すると、共有の代替手段はおそらくファイルを開くでしょう)。

[編集]

ええ、痛いですよ。Windows がマウスとキーボードからの読み取りに使用するものによって、マウスとキーボードがロックされるのを見てきました。また、多くの人が OS X の Parallels のような VM 内で問題を抱えているのを見てきました。この場合、HID クラス ドライバーがデバイスを排他的に開いており、VM が標準の USB 要求を使用できないようになっています。

ProcessMonitorの動作を再現するコードを見てきました。SysInternals がデバイス ハンドルを無視することを選択しているだけかもしれませんが、ここで同じ方法 (またはわずかなバリエーション) を使用して PID を決定することができます。

マイク

于 2008-08-22T19:20:33.140 に答える