题
我有一个USB操纵杆,我想为此写自己的HID驱动程序。值得注意的是,我想在Windows接收到操纵杆输入以及我的应用程序通知该输入事件时注入延迟。我还想更改我的应用程序所掌握的操纵杆的身份。我从来没有为窗户写司机,更不用说隐藏驱动程序了。谁能为我提供有关如何执行此操作的建议或指示?
解决方案
当您在操纵杆上按旋钮时,电信号以 IRP的 通过驱动器链。在某个时候拦截这些IRP并将转发延迟到下一个驾驶员可能会延迟操纵杆输入。这可以通过 驱动器过滤器.
要编写Windows驱动程序,您需要使用 温德克.
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
其他提示
您要做的是过滤驱动程序。
过滤器驱动程序是可选的驱动程序,可为设备的行为增加或修改值。过滤器驱动程序可以为一个或多个设备提供服务。来源: 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的支持,但也许仍然很重要,这可能有点过时了。
您可能想使用 Autohotkey. 。这是一种用于窗口的脚本语言,可以重新删除鼠标/键盘/操纵杆的每个键。如果您通过脚本捕获键并在将正确的键/宏发送到Active应用程序之前插入延迟,则您可能有一部分解决问题的方法。
我的印象是你可以使用的 <dinput.h>
joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)
然后操纵杆活动将开火 WM_JOYMOVE
事件,虽然是什么 wParam
和 lParam
因为消息是我不知道。
然后,当您的程序关闭或您不再想要 joyReleaseCapture(JOYSTICKID1)
等等
它可能只是空参数,然后告诉您使用 joyGetPos
或者 joyGetPosEx
功能可以从USB设备自己找到数据。