2010-06-24 1 views
17

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

ответ

12

Когда вы нажимаете кнопки на джойстике, электрические сигналы достигают операционной системы (и на игру) в форме IRP's через цепочку драйверов. Перехват этих IRP в какой-то момент и отсрочка пересылки на следующий драйвер может задержать вход джойстика. Этого можно достичь с помощью driver filters.

Для того, чтобы написать драйвер для Windows, вам необходимо использовать WinDDK.

Точка входа драйвера Windows - DriverEntry function. В этой функции вы будете подключать то, что 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.

Проверьте toaster filter driver sample в WinDDK, вы можете найти его на INSTALL_DIR/src/general/toaster/ см. Также here.

Ссылки по теме:
http://www.rootkit.com/newsread.php?newsid=187
http://www.techtalkz.com/microsoft-device-drivers/269654-toaster-filter-driver.html

3

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

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

+0

Мне пришлось поставить опечатку во второй и третьей ссылке, чтобы обмануть фильтр спама, потому что я новый пользователь. :( – David

+0

Я отредактировал ссылки для вас :). –

1

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

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

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

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

2

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