У меня есть USB-джойстик, и я хочу написать для него свой собственный HID-драйвер. В частности, я хочу ввести задержку между тем, когда Windows получает ввод с джойстика, и когда мое приложение уведомляется об этом событии ввода. Я также хотел бы изменить идентификатор джойстика, воспринимаемый моим приложением. Я никогда не писал драйвер, не говоря уже о драйвере HID, для Windows. Может ли кто-нибудь дать мне совет или указатели о том, как это сделать?
Свернуть мой собственный драйвер Windows Joystick HID?
Ответы (4)
Когда вы нажимаете ручки на джойстике, электрические сигналы поступают в операционную систему (и в игру) в виде 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.
Проверьте пример драйвера фильтра тостера в 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
То, что вы пытаетесь сделать, это драйвер фильтра.
Драйверы фильтров — это необязательные драйверы, которые повышают ценность устройства или изменяют его поведение. Драйвер фильтра может обслуживать одно или несколько устройств. источник: http://msdn.microsoft.com/en-us/library/ff545890.aspx
Я думаю, что WDK содержит образцы. Вам необходимо загрузить комплект драйверов Windows отсюда: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
WDK, вероятно, содержит пример кода для создания фильтра.
На сайте Microsoft также имеется следующая загрузка: http://support.microsoft.com/kb/176417< /а>
Вероятно, он немного устарел, так как USB не поддерживался до NT5.0, но, возможно, он все еще актуален.
Вы можете использовать Autohotkey. Это язык сценариев для Windows, который может переназначать все клавиши мыши/клавиатуры/джойстика. Если вы захватите ключ с помощью сценария и вставите задержку перед отправкой правильного ключа/макроса в активное приложение, у вас может быть часть решения вашей проблемы.
У меня сложилось впечатление, что вы могли бы использовать <dinput.h>
joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)
тогда события джойстика будут запускать события WM_JOYMOVE
, хотя какие будут wParam
и lParam
для сообщения, я понятия не имею.
Затем, когда ваша программа закрывается или вам больше не нужны joyReleaseCapture(JOYSTICKID1)
и т. д.
, это могут быть просто пустые параметры, которые затем говорят вам использовать функции joyGetPos
или joyGetPosEx
для поиска данных для себя с USB-устройства.