滚动我自己的Windows操纵杆HID驱动程序?

时间:2010-06-24 02:29:30

标签: usb hid joystick

我有一个USB操纵杆,我想为它编写自己的HID驱动程序。值得注意的是,我希望在Windows收到操纵杆输入和我的应用程序收到输入事件通知之间注入延迟。我还想改变我的应用程序所获得的操纵杆的身份。我从来没有为Windows编写驱动程序,更不用说HID驱动程序了。任何人都可以向我提供有关如何进行此操作的建议或指示吗?

5 个答案:

答案 0 :(得分:14)

当您按下操纵杆上的旋钮时,电子信号通过驱动链以IRP's的形式到达操作系统(并进入游戏)。在某些时候拦截这些IRP并将转发延迟到下一个驱动程序可能会延迟操纵杆输入。这可以通过driver filters实现。

要编写Windows驱动程序,您需要使用WinDDK

Windows驱动程序的入口点是DriverEntry function。在这个函数中,你将挂钩你要拦截的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 files

检查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

答案 1 :(得分:3)

您要做的是过滤器驱动程序。

  

过滤器驱动程序是可选的驱动程序,可为设备的行为增加价值或修改其行为。过滤器驱动程序可以为一个或多个设备提供服   来源: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

可能有点过时,因为在NT5.0之前不支持USB,但它可能仍然相关。

答案 2 :(得分:2)

您可能想要使用Autohotkey。这是一种Windows脚本语言,可以重新映射鼠标/键盘/操纵杆的每个键。如果您通过脚本捕获密钥并在将正确的密钥/宏发送到活动应用程序之前插入延迟,则可能是问题的一部分解决方案。

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)