Свернуть мой собственный драйвер Windows Joystick HID?

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


person vicatcu    schedule 24.06.2010    source источник


Ответы (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

person clyfe    schedule 21.07.2010

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

Драйверы фильтров — это необязательные драйверы, которые повышают ценность устройства или изменяют его поведение. Драйвер фильтра может обслуживать одно или несколько устройств. источник: 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, но, возможно, он все еще актуален.

person David    schedule 19.07.2010

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

person Jul    schedule 08.01.2012

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

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

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

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

person Spadge    schedule 05.11.2010