Roll mój własny sterownik HID joystick Windows?

Mam Joystick USB i chcę do niego napisać własny sterownik HID. W szczególności chcę wprowadzić opóźnienie między momentem, w którym wejście joysticka jest odbierane przez System Windows, a momentem, w którym moja aplikacja zostanie powiadomiona o tym zdarzeniu wejściowym. Chciałbym również zmienić tożsamość joysticka, którego dotyczyła moja aplikacja. Nigdy nie napisałem sterownika, nie mówiąc już o sterowniku HID, Dla Windows. Czy ktoś może mi udzielić porad lub wskazówek, jak to zrobić?

Author: vicatcu, 2010-06-24

5 answers

Po naciśnięciu pokręteł na joysticku sygnały elektryczne docierają do systemu operacyjnego (i do gry) w postaci IRP ' s przez łańcuch sterowników. Przechwycenie tych IRP w pewnym momencie i opóźnienie przekazywania do następnego sterownika może opóźnić wejście joysticka. Można to osiągnąć za pomocą filtrów sterowników .

Aby napisać sterowniki dla systemu windows należy użyć WinDDK .

Punktem wejścia sterownika windows jest funkcja DriverEntry . W tej funkcji będziesz zaczepiać to, co chcesz przechwycić IRP i funkcje zwrotne, które zajmują się nimi, w naszym przypadku funkcje zwrotne, które opóźniają przekazywanie.

Na przykład, powiedzmy, że nasz IRP jest opóźniony to IRP_MJ_READ, a nasza funkcja callback nazywa się 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;
    ...
}

Aby opóźnić przekierowanie wewnątrz CallbackDelayForwarding, musisz użyć funkcji z rodziny KeInitializeTimer, aby symulować jakiś rodzaj snu (może w połączeniu z blokadami), kedelayexecutionthread itd.

Aby zainstalować sterownik filtra w łańcuchu sterowników joysticka, możesz użyć .pliki inf .

Sprawdź próbkę sterownika filtra tostera W WinDDK, można ją znaleźć w INSTALL_DIR/src/general/toaster/ Zobacz również tutaj.

Powiązane links:
http://www.rootkit.com/newsread.php?newsid=187
http://www.techtalkz.com/microsoft-device-drivers/269654-toaster-filter-driver.html{[7]

 12
Author: clyfe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-23 14:44:06

To, co próbujesz zrobić, to sterownik filtra.

Sterowniki filtrów są opcjonalnymi sterownikami, które dodają wartość lub modyfikują zachowanie urządzenia. Sterownik filtra może obsługiwać jedno lub więcej urządzeń. źródło: http://msdn.microsoft.com/en-us/library/ff545890.aspx

Myślę, że WDK zawiera próbki, które musisz pobrać z tego miejsca: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx

WDK prawdopodobnie zawiera przykładowy kod do utworzenia filtra.

Na stronie Microsoftu znajduje się również następujący plik do pobrania: http://support.microsoft.com/kb/176417

Jest to prawdopodobnie trochę przestarzałe, ponieważ USB nie było obsługiwane przed NT5. 0, ale może nadal jest istotne.

 3
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-21 13:11:00

Możesz użyć Autohotkey . Jest to język skryptowy dla systemu windows, który może zmienić wszystkie klawisze myszy / klawiatury / joysticków. Jeśli przechwycisz klucz za pomocą skryptu i wstawisz opóźnienie przed wysłaniem odpowiedniego klucza / makra do aktywnej aplikacji, możesz mieć część rozwiązania problemu.

 2
Author: Jul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-08 17:14:12

Miałem wrażenie, że możesz użyć <dinput.h>

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

Wtedy zdarzenia joysticka odpaliłyby WM_JOYMOVE zdarzenia, choć jakie wParam i lParam dla wiadomości byłyby nie mam pojęcia.

Wtedy, gdy program się zamyka lub nie chcesz już joyReleaseCapture(JOYSTICKID1) itd.
może to być po prostu puste paramy, które następnie każą ci używać funkcji joyGetPos lub joyGetPosEx aby znaleźć dane dla siebie z urządzenia USB.

 1
Author: Spadge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 10:05:47
 0
Author: tlow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-19 23:00:44