USBジョイスティックを持っていますが、そのために独自のHIDドライバーを作成したいと思います。特に、ジョイスティックの入力がWindowsによって受信されてから、アプリケーションにその入力イベントが通知されるまでの間に遅延を挿入したいと思います。また、アプリケーションによって認識されるジョイスティックのIDを変更したいと思います。Windows用のドライバーはもちろんHIDドライバーも書いたことがありません。誰かが私にこれを行う方法についてのアドバイスや指針を提供できますか?
4 に答える
ジョイスティックのノブを押すと、電気信号がドライバー チェーンを介してIRP の形でオペレーティング システム (およびゲーム) に到達します。ある時点でこれらの IRP を傍受し、次のドライバーへの転送を遅らせると、ジョイスティックの入力が遅れる可能性があります。これは、ドライバ フィルタを使用して実現できます。
Windows ドライバーを作成するには、WinDDKを使用する必要があります。
Windows ドライバーのエントリポイントはDriverEntry 関数です。この関数では、インターセプトする IRP と、それらを処理するコールバック関数 (この場合は、転送を遅らせるコールバック関数) をフックします。
たとえば、遅延する IRP がIRP_MJ_READで、コールバック関数が呼び出されたとしCallbackDelayForwardingます。
// the function that delays the IRP
NTSTATUS CallbackDelayForwarding(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
){
// delay the forwarding
}
// this is the driver entrypoint, similar to "main" in user-mode executables
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING RegistryPath
){
pDriverObject->MajorFunction[IRP_MJ_READ] = CallbackDelayForwarding;
...
}
内部で転送を遅らせるには、 KeInitializeTimerCallbackDelayForwardingファミリの関数を使用して、ある種のスリープをシミュレートする必要があります (おそらくロックと組み合わせて)、KeDelayExecutionThread などです。
フィルター ドライバーをジョイスティック ドライバー チェーンにインストールするには、.inf ファイルを使用できます。
WinDDKのトースター フィルター ドライバーのサンプルを確認してください。こちらINSTALL_DIR/src/general/toaster/も参照してください。
関連リンク:
http://www.rootkit.com/newsread.php?newsid=187
http://www.techtalkz.com/microsoft-device-drivers/269654-toaster-filter-driver.html
あなたがやろうとしているのはフィルタードライバーです。
フィルター ドライバーは、デバイスに値を追加したり、デバイスの動作を変更したりするオプションのドライバーです。フィルター ドライバーは、1 つまたは複数のデバイスにサービスを提供できます。ソース: http://msdn.microsoft.com/en-us/library/ff545890.aspx
WDK にはサンプルが含まれていると思います。ここから Windows Driver Kit をダウンロードする必要があります: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
WDK には、フィルターを作成するためのサンプル コードが含まれている可能性があります。
Microsoft のサイトには次のダウンロードもあります: http://support.microsoft.com/kb/176417
USB は NT5.0 より前にはサポートされていなかったため、おそらく少し古くなっていますが、まだ関連している可能性があります。
Autohotkeyを使用することをお勧めします。これは、マウス/キーボード/ジョイスティックのすべてのキーを再マップできる Windows 用のスクリプト言語です。スクリプトを使用してキーをキャプチャし、適切なキー/マクロをアクティブなアプリケーションに送信する前に遅延を挿入すると、問題の解決策の一部が得られる可能性があります。
私はあなたが使うことができるという印象を受けました<dinput.h>
joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)
次に、ジョイスティック イベントがイベントを発生させますが、メッセージのとWM_JOYMOVEが何であるかはわかりません。wParamlParam
次に、プログラムが閉じたり、不要になったりしたときにjoyReleaseCapture(JOYSTICKID1)、USBデバイスから自分のデータを見つけるために使用するか関数
を使用するように指示する空のパラメータである可能性があります。joyGetPosjoyGetPosEx