2010-06-24 26 views
17

Tengo un Joystick USB, y quiero escribir mi propio controlador HID para él. En particular, quiero inyectar demora entre cuando Windows recibe la entrada del joystick y cuando se notifica a mi aplicación de ese evento de entrada. También me gustaría cambiar la identidad del joystick percibido por mi aplicación. Nunca he escrito un controlador, y mucho menos un controlador HID, para Windows. ¿Alguien puede darme consejos o indicaciones sobre cómo hacer esto?¿Rollo de mi propio controlador de joystick de Windows HID?

Respuesta

12

Al presionar las perillas del Joystick, las señales eléctricas llegan al sistema operativo (y al juego) en forma de IRP's a través de la cadena de controladores. Interceptar estos IRP en algún punto y demorar el reenvío al siguiente controlador puede retrasar la entrada del joystick. Esto se puede lograr con driver filters.

Para escribir controladores de Windows necesita usar WinDDK.

El punto de entrada de un controlador de Windows es el DriverEntry function. En esta función conectará qué IRP quiere interceptar y las funciones de devolución de llamada que tienen que ver con ellos, en nuestro caso, las funciones de devolución de llamada que retrasan el reenvío.

Por ejemplo, dicen que nuestra IRP que se retrase es IRP_MJ_READ y nuestra función de devolución de llamada se llama 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; 
    ... 
} 

para retrasar el reenvío dentro CallbackDelayForwarding, debe utilizar las funciones de la familia KeInitializeTimer para simular una especie de dormir (tal vez junto con cerraduras), KeDelayExecutionThread etc.

Para instalar su controlador de filtro en la cadena del controlador del joystick, puede usar .inf files.

Compruebe el toaster filter driver sample en WinDDK, lo puede encontrar en INSTALL_DIR/src/general/toaster/ ver también here.

Enlaces relacionados:
http://www.rootkit.com/newsread.php?newsid=187
http://www.techtalkz.com/microsoft-device-drivers/269654-toaster-filter-driver.html

3

Lo que usted está tratando de hacer es un controlador de filtro.

Los controladores de filtro son controladores opcionales que agregan valor o modifican el comportamiento de un dispositivo. Un controlador de filtro puede dar servicio a uno o más dispositivos. fuente: http://msdn.microsoft.com/en-us/library/ff545890.aspx

creo que el WDK contiene muestras Usted Uld tiene que descargar el Kit de controladores de Windows desde aquí: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx

El WDK probablemente contiene un código de ejemplo para crear un filtro.

También existe la siguiente descarga en el sitio de Microsoft: http://support.microsoft.com/kb/176417

Es probablemente un poco anticuado desde USB no fue apoyada pre-NT5.0, pero tal vez todavía es relevante.

+0

Tuve que poner errores tipográficos en el segundo y tercer enlace para engañar al filtro de correo no deseado porque soy un usuario nuevo. :( – David

+0

He editado los enlaces para ti :). –

1

estaba bajo la impresión de que podría utilizar <dinput.h>

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

continuación eventos Joystick dispararían WM_JOYMOVE eventos, a pesar de lo que el wParam y lParam para el mensaje Sería que no tengo idea.

Después, cuando el programa se cierra o que ya no quiere joyReleaseCapture(JOYSTICKID1) etc.
podría ser sólo params vacíos que luego le dicen a utilizar joyGetPos o joyGetPosEx funciones para encontrar los datos por sí mismo desde el dispositivo USB.

2

Es posible que desee utilizar Autohotkey. Este es un lenguaje de script para Windows que puede reasignar todas las teclas del mouse/teclado/joysticks. Si captura la clave a través de un script e inserta un retraso antes de enviar la clave/macro correcta a la aplicación activa, es posible que tenga una parte de la solución a su problema.

Cuestiones relacionadas