Подтвердить что ты не робот

Roll My Own Windows Джойстик HID Driver?

У меня USB-джойстик, и я хочу написать свой собственный HID-драйвер для него. В частности, я хочу ввести задержку между приходом ввода джойстика в Windows и уведомлением моего приложения о этом событии ввода. Я также хотел бы изменить личность джойстика, полученную моим приложением. Я никогда не писал драйвер, не говоря уже о HID-драйвере, для Windows. Может ли кто-нибудь дать мне советы или рекомендации о том, как это сделать?

4b9b3361

Ответ 1

Когда вы нажимаете ручки на джойстике, электрические сигналы доставляются в операционную систему (и в игру) в виде 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;
    ...
}

Чтобы отложить переадресацию внутри CallbackDelayForwarding, вы должны использовать функции из семейства KeInitializeTimer для имитации своего рода сна (возможно, в сочетании с блокировки), KeDelayExecutionThread и т.д.

Чтобы установить драйвер фильтра в цепочку драйверов джойстика, вы можете использовать . inf files.

Проверьте образец драйвера фильтра тостера в 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

Ответ 2

То, что вы пытаетесь сделать, это драйвер фильтра.

Драйверы фильтра - это дополнительные драйверы, которые добавляют значение или изменяют поведение устройства. Драйвер фильтра может обслуживать одно или несколько устройств. источник: http://msdn.microsoft.com/en-us/library/ff545890.aspx

Я думаю, что WDK содержит образцы, которые вам нужно скачать здесь: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx

WDK, вероятно, содержит пример кода для создания фильтра.

Существует также следующая загрузка на сайте microsoft: http://support.microsoft.com/kb/176417

Вероятно, он немного устарел, поскольку USB не поддерживался до NT5.0, но, возможно, он по-прежнему имеет значение.

Ответ 3

Возможно, вы захотите использовать Autohotkey. Это язык script для окон, который может переназначать все клавиши мыши/клавиатуры/джойстика. Если вы закроете ключ через script и вставьте задержку перед отправкой правой клавиши/макроса в активное приложение, вы можете найти часть решения своей проблемы.

Ответ 4

У меня создалось впечатление, что вы можете использовать <dinput.h>

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

тогда события Джойстика будут запускать события WM_JOYMOVE, хотя те сообщения wParam и lParam для сообщения я не знаю.

Затем, когда ваша программа закрывается или вы больше не хотите joyReleaseCapture(JOYSTICKID1) и т.д.
это могут быть только пустые параметры, которые затем говорят вам использовать функции joyGetPos или joyGetPosEx чтобы найти данные для себя с USB-устройства.