Свернуть мой собственный драйвер Windows джойстик HID? - PullRequest
18 голосов
/ 24 июня 2010

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

Ответы [ 5 ]

14 голосов
/ 21 июля 2010

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

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

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

3 голосов
/ 20 июля 2010

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

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

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

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

На сайте корпорации Майкрософт также доступна следующая загрузка: http://support.microsoft.com/kb/176417

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

2 голосов
/ 08 января 2012

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

1 голос
/ 06 ноября 2010

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

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

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

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

0 голосов
/ 20 июля 2010

Хорошее начальное место будет: http://www.microsoft.com/whdc/device/input/default.mspx

...