2010-06-24 13 views
17

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

12

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

3

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.

+0

Ich musste Tippfehler in den zweiten und dritten Link setzen, um den Spamfilter zu manipulieren, weil ich ein neuer Benutzer bin. :( – David

+0

Ich habe die Links wieder für Sie bearbeitet :). –

1

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.

2

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.