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
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
Un buen punto de partida sería: http://www.microsoft.com/whdc/device/input/default.mspx
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.
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.
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.
- 1. Controlador de mouse no HID en NT
- 2. Soporte de joystick en Java
- 3. Emulando el joystick programáticamente
- 4. Joystick virtual en Java
- 5. Implementación de eventos en mi propio objeto
- 6. Escribiendo mi propio método de bloqueo
- 7. Definición de iterador de mi propio contenedor
- 8. ¿Puedo crear mi propio certificado digital en C# o Windows?
- 9. Desarrollando mi propio CMS
- 10. Cómo vincular el controlador de eventos de socket.io (en nodejs) a mi propio ámbito?
- 11. Impresión en rollo de papel
- 12. crear mi propio lenguaje de programación
- 13. ¿Cómo crear mi propio motor de recomendación?
- 14. funcionamiento de mi propio servidor Jabber/XMPP
- 15. ¿Debo escribir mi propio software de foro?
- 16. ¿Cómo puedo escribir mi propio 'sistema de archivos' dentro de Windows?
- 17. Escribiendo un controlador de Windows para un dispositivo de entrada emulado
- 18. Escribiendo mi propio compilador C++
- 19. ¿Cómo comenzaría a escribir mi propio firewall?
- 20. ¿Crear mi propio instalador desde C#?
- 21. Instalación de un servicio de Windows de desarrollo propio
- 22. ¿Tengo que escribir mi propio controlador USB del lado del host para un dispositivo CDC
- 23. Protocolo HID USB pregunta
- 24. file_get_contents() conexión rechazada para mi propio sitio
- 25. Escribiendo un controlador de impresora de Windows
- 26. control de trackball three.js sin el rollo
- 27. TVS RP-45 rollo de impresión
- 28. conexión de registro de Android a Windows como un cliente HID
- 29. Crear un dispositivo HID virtual
- 30. Descriptor de informe HID (con iPhone)
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
He editado los enlaces para ti :). –