我有一个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 事件,虽然是什么 wParamlParam 因为消息是我不知道。

然后,当您的程序关闭或您不再想要 joyReleaseCapture(JOYSTICKID1) 等等
它可能只是空参数,然后告诉您使用 joyGetPos 或者 joyGetPosEx 功能可以从USB设备自己找到数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top