学習課題として、Windows 7 64 ビットで有線 XBox 360 コントローラー用のフィルター ドライバーを作成しようとしています。このコントローラーは HID ジョイスティックとして表示されるので、簡単なように思えます。
マウスの左ボタンと右ボタンを入れ替えるサンプル フィルター ドライバーを作成しました。これは、WDK に付属する moufiltr と firefly のサンプルに基づいています。ただし、この例を XBox 360 コントローラーで動作するように変換するのに問題があります。
コントローラーを接続すると、デバイス マネージャーに 3 つの異なるデバイスが表示されます。
- ヒューマン インターフェイス デバイス/HID準拠のゲーム コントローラー
- ヒューマン インターフェース デバイス/USB ヒューマン インターフェース デバイス
- 共通コントローラー for Windows Class/Xbox 360 Controller for Windows
これらのどれにドライバーを接続する必要がありますか?
マウス フィルター ドライバーを使用すると、firefly サンプルのインストール手順に従うことができました。デバイス マネージャーでマウスを右クリックし、[ドライバーの更新] を選択します。XBox 360 コントローラーでは、どのデバイス用のドライバーをインストールすればよいかわかりません。それとも、それらはすべて独立してハードウェアと通信しており、それぞれにフィルターをインストールする必要がありますか?
フィルター ドライバーで使用できる IOCTL を出力するために、3 つのデバイスのそれぞれにフィルター ドライバーを接続しようとしたことに注意してください。「USB ヒューマン インターフェイス デバイス」の場合、フィルターは IOCTL を受け取りませんでした。
HID 準拠のゲーム コントローラーの場合、以下を受け取りました。
- IOCTL_HID_GET_COLLECTION_INFORMATION (複数回)
- IOCTL_HID_GET_COLLECTION_DESCRIPTOR (複数回)
- IOCTL_GET_SYS_BUTTON_CAPS
Xbox 360 Controller for Windows の場合、シンボリック名を追跡できない一連の IOCTL を受け取ります。
- 0x80006000 (複数回)
- 0x8000e00c (複数回)
- 0x8000e008
- 0x8000a010
- 0x8000e018
- 0x8000e014
残念ながら、どのデバイスをフィルタリングしようとしているのか、まだわかりません。(そのうちの 1 つがジョイスティックに相当する IOCTL_INTERNAL_MOUSE_CONNECT を受け取ることを望んでいましたが、そうではないようです。)