Ich habe einen USB-Joystick, und ich möchte meinen eigenen HID-Treiber dafür schreiben. Insbesondere möchte ich eine Verzögerung zwischen dem Empfang der Joystick-Eingabe durch Windows und der Benachrichtigung meiner Anwendung über dieses Eingabeereignis eingeben. Ich möchte auch die Identität des Joysticks, der von meiner Anwendung wahrgenommen wird, ändern. Ich habe nie einen Treiber, geschweige denn einen HID-Treiber für Windows geschrieben. Kann mir jemand Ratschläge geben oder Hinweise geben, wie man das macht?Roll meinen eigenen Windows Joystick HID Driver?
Antwort
Wenn Sie Knöpfe am Joystick drücken, erreichen die elektrischen Signale das Betriebssystem (und das Spiel) in Form von IRP's über die Treiberkette. Das Abfangen dieser IRPs an einem bestimmten Punkt und das Verzögern der Weiterleitung an den nächsten Treiber kann die Joystickeingabe verzögern. Dies kann mit driver filters erreicht werden.
Um Windows-Treiber zu schreiben, müssen Sie WinDDK verwenden.
Der Einstiegspunkt eines Windows-Treibers ist DriverEntry function. In dieser Funktion haken Sie ab, welche IRPs Sie abfangen wollen und welche Callback-Funktionen mit ihnen umgehen, in unserem Fall die Callback-Funktionen, die die Weiterleitung verzögern.
Zum Beispiel, sagen unsere IRP verzögert werden soll IRP_MJ_READ
und unsere Callback-Funktion wird CallbackDelayForwarding
genannt:
// 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;
...
}
die Weiterleitung innerhalb CallbackDelayForwarding
zu verzögern, müssen Sie Funktionen aus der KeInitializeTimer Familie eine Art zu simulieren Schlaf (möglicherweise in Verbindung mit Schlössern), KeDelayExecutionThread usw.
Um Ihren Filtertreiber in der Joystick-Treiberkette zu installieren, können Sie .inf files verwenden.
Überprüfen Sie die toaster filter driver sample in der WinDDK, finden Sie unter INSTALL_DIR/src/general/toaster/
siehe auch here.
Weiterführende Links:
http://www.rootkit.com/newsread.php?newsid=187
http://www.techtalkz.com/microsoft-device-drivers/269654-toaster-filter-driver.html
wäre ein guter Ausgangspunkt sein: http://www.microsoft.com/whdc/device/input/default.mspx
Was Sie versuchen, ist ein Filtertreiber zu tun.
Filtertreiber sind optionale Treiber, die das Verhalten eines Geräts verbessern oder dessen Verhalten ändern. Ein Filtertreiber kann ein oder mehrere Geräte bedienen. Quelle: http://msdn.microsoft.com/en-us/library/ff545890.aspx
Ich denke, die WDK enthält Beispiele Sie haben Ould das Windows Driver Kit zum Download von hier: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
Die WDK wahrscheinlich enthält einen Beispielcode, einen Filter zu erstellen.
Es gibt auch die folgenden Download auf der Microsoft-Website: http://support.microsoft.com/kb/176417
Es ist wahrscheinlich ein bisschen veraltet, da USB nicht vorge NT5.0 unterstützt wurde, aber vielleicht ist es immer noch relevant.
Ich hatte den Eindruck, könnten Sie <dinput.h>
joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)
dann Ereignisse Joystick würde WM_JOYMOVE
Ereignisse ausgelöst, obwohl das, was die wParam
und lParam
für die Nachricht Ich hätte keine Ahnung. Dann
, wenn Ihr Programm schließt oder Sie wollen nicht länger joyReleaseCapture(JOYSTICKID1)
usw.
es könnte nur leer params sein, die dann sagen joyGetPos
oder joyGetPosEx
Funktionen nutzen die Daten für sich selbst aus dem USB-Gerät zu finden.
Sie könnten Autohotkey verwenden möchten. Dies ist eine Skriptsprache für Windows, die jede Taste von Maus/Tastatur/Joystick neu zuordnen kann. Wenn Sie den Schlüssel über ein Skript erfassen und eine Verzögerung einfügen, bevor Sie den richtigen Schlüssel/das richtige Makro an die aktive Anwendung senden, haben Sie möglicherweise einen Teil einer Lösung für Ihr Problem.
Ich musste Tippfehler in den zweiten und dritten Link setzen, um den Spamfilter zu manipulieren, weil ich ein neuer Benutzer bin. :( – David
Ich habe die Links wieder für Sie bearbeitet :). –