【问题标题】:Roll My Own Windows Joystick HID Driver?滚动我自己的 Windows 操纵杆 HID 驱动程序?
【发布时间】:2011-03-07 14:50:04
【问题描述】:

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

【问题讨论】:

    标签: usb hid joystick


    【解决方案1】:

    您正在尝试做的是一个过滤器驱动程序。

    过滤器驱动程序是为设备增加价值或修改设备行为的可选驱动程序。过滤器驱动程序可以服务一个或多个设备。 来源:http://msdn.microsoft.com/en-us/library/ff545890.aspx

    我认为 WDK 包含示例您必须从此处下载 Windows 驱动程序工具包:http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx

    WDK 可能包含用于创建过滤器的示例代码。

    微软网站上也有以下下载:http://support.microsoft.com/kb/176417

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

    【讨论】:

      【解决方案2】:

      当您按下操纵杆上的旋钮时,电信号通过驱动链以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

      【讨论】:

        【解决方案3】:

        我的印象是你可以使用<dinput.h>

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-04
            • 2021-01-26
            • 2016-05-26
            • 1970-01-01
            • 1970-01-01
            • 2012-11-29
            • 2021-10-16
            相关资源
            最近更新 更多