我有一个USB手柄,想要编写自己的HID驱动程序。特别是我想在Windows接收到手柄输入和我的应用程序被通知该输入事件之间注入延迟。我还希望更改应用程序所感知到的手柄身份。我从未为Windows编写过驱动程序(尤其是HID驱动程序)。是否有人可以提供关于如何实现这一点的建议或指导?
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中的toaster filter driver sample,您可以在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
您可能想使用Autohotkey。这是一个用于Windows的脚本语言,可以重新映射鼠标/键盘/游戏手柄的任何按键。如果您通过脚本捕获键并在将正确的键/宏发送到活动应用程序之前插入延迟,您可能已经解决了问题的一部分。
我以为你可以使用 <dinput.h>
joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)
然后,操纵杆事件将触发WM_JOYMOVE
事件,但是我不知道消息的wParam
和lParam
是什么。
然后,当您的程序关闭或您不再需要joyReleaseCapture(JOYSTICKID1)
等时,
它可以只是空参数,然后告诉您使用joyGetPos
或joyGetPosEx
函数
从USB设备中自行查找数据。