Question

J'ai une manette de jeu USB, et je veux écrire mon propre pilote HID pour elle. En particulier, je veux injecter délai entre l'entrée du joystick est reçue par Windows et lorsque ma demande est informé de cet événement d'entrée. Je voudrais aussi changer l'identité du joystick percieved par mon application. Je ne l'ai jamais écrit un pilote, et encore moins un pilote HID, pour Windows. Quelqu'un peut-il me donner des conseils ou des pointeurs sur la façon de s'y prendre pour le faire?

Était-ce utile?

La solution

Lorsque vous appuyez sur les boutons sur la manette des signaux électriques atteignent le système d'exploitation (et sur le jeu) sous forme de de IRP par la chaîne de pilotes. Intercepter ces IRP à un moment donné et de retarder la transmission à l'autre conducteur peut retarder l'entrée joystick. Ceci peut être réalisé avec filtres de pilote .

Pour les fenêtres d'écriture pilotes vous devez utiliser winddk.

Le point d'entrée d'un conducteur de fenêtres est la fonction DriverEntry . Dans cette fonction, vous serez ce que IRP accrochage vous voulez intercepter et les fonctions callback qui traitent avec eux, dans notre cas, les fonctions de rappel qui retardent la transmission.

Par exemple, supposons que notre PRI à retarder est IRP_MJ_READ et notre fonction de rappel est appelée 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;
    ...
}

Pour retarder la transmission à l'intérieur CallbackDelayForwarding, vous devez utiliser les fonctions de la la famille de KeInitializeTimer pour simuler une sorte de sommeil (peut-être en liaison avec des serrures), KeDelayExecutionThread etc.

Pour installer votre pilote de filtre dans la chaîne pilote de joystick, vous pouvez utiliser . fichiers .inf.

Vérifiez la grille-pain échantillon pilote de filtre dans le winddk, vous pouvez le trouver à INSTALL_DIR/src/general/toaster/ voir aussi .

Liens connexes:
http://www.rootkit.com/newsread.php?newsid=187
http://www.techtalkz.com/microsoft-device -Pilotes / 269654-grille-pain-filtre-driver.html

Autres conseils

Qu'est-ce que vous essayez de faire est un pilote de filtre.

  

pilotes de filtre sont des facteurs facultatifs qui ajoutent de la valeur ou à modifier le comportement d'un dispositif. Un pilote de filtre peut desservir un ou plusieurs dispositifs.   source: http://msdn.microsoft.com/en-us/library/ ff545890.aspx

Je pense que le WDK contient des échantillons Vous ould devez télécharger le Windows Driver Kit d'ici: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx

Le WDK contient probablement un exemple de code pour créer un filtre.

Il y a aussi le téléchargement suivant sur le site de Microsoft: http://support.microsoft.com/kb / 176417

Il est probablement un peu obsolète depuis USB n'a pas été prise en charge pré-NT5.0, mais peut-être il est toujours pertinent.

Vous pouvez utiliser Autohotkey. C'est un langage de script pour Windows qui ReMap toutes les touches de clavier / souris / joysticks. Si vous capturez la clé via un script et d'insérer un délai avant d'envoyer la bonne clé / macro à l'application active, vous pourriez avoir une partie d'une solution à votre problème.

J'avais l'impression que vous pouvez utiliser <dinput.h>

joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)

puis les événements Joystick tireraient événements WM_JOYMOVE, si ce que l'wParam et lParam pour le message serait que je ne sais pas.

Ensuite, lorsque votre programme se ferme ou vous ne voulez plus joyReleaseCapture(JOYSTICKID1) etc.
il pourrait simplement être params vides qui vous suggèrent d'utiliser les fonctions de joyGetPos ou joyGetPosEx pour trouver les données pour vous-même à partir du périphérique USB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top