自己编写Windows操纵杆HID驱动程序?

18

我有一个USB手柄,想要编写自己的HID驱动程序。特别是我想在Windows接收到手柄输入和我的应用程序被通知该输入事件之间注入延迟。我还希望更改应用程序所感知到的手柄身份。我从未为Windows编写过驱动程序(尤其是HID驱动程序)。是否有人可以提供关于如何实现这一点的建议或指导?

4个回答

15
当您按下摇杆上的旋钮时,电信号通过驱动程序链以IRP的形式到达操作系统(并进入游戏)。在某些点拦截这些IRP并延迟转发到下一个驱动程序可以延迟摇杆输入。这可以通过使用驱动程序过滤器来实现。
编写Windows驱动程序需要使用WinDDK
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中的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


4
你想做的是一个过滤驱动程序。
过滤驱动程序是可选驱动程序,可以为设备增加价值或修改其行为。过滤驱动程序可以为一个或多个设备提供服务。 来源:http://msdn.microsoft.com/en-us/library/ff545890.aspx 我认为WDK包含示例代码。您需要从此处下载Windows Driver Kit: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx WDK可能包含一个创建过滤器的示例代码。
Microsoft网站上还有以下下载链接:http://support.microsoft.com/kb/176417。这可能有点过时,因为USB不支持NT5.0之前的版本,但也许仍然相关。

2

您可能想使用Autohotkey。这是一个用于Windows的脚本语言,可以重新映射鼠标/键盘/游戏手柄的任何按键。如果您通过脚本捕获键并在将正确的键/宏发送到活动应用程序之前插入延迟,您可能已经解决了问题的一部分。


1

我以为你可以使用 <dinput.h>

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

然后,操纵杆事件将触发WM_JOYMOVE事件,但是我不知道消息的wParamlParam是什么。

然后,当您的程序关闭或您不再需要joyReleaseCapture(JOYSTICKID1)等时,
它可以只是空参数,然后告诉您使用joyGetPosjoyGetPosEx函数 从USB设备中自行查找数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接