我有一个 USB 操纵杆,我想为它编写自己的 HID 驱动程序。值得注意的是,我想在 Windows 接收到操纵杆输入和通知我的应用程序该输入事件之间注入延迟。我还想更改我的应用程序感知到的操纵杆的身份。我从来没有为 Windows 编写过驱动程序,更不用说 HID 驱动程序了。任何人都可以为我提供有关如何执行此操作的建议或指示吗?
4 回答
当您按下操纵杆上的旋钮时,电信号通过驱动程序链以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 中的烤面包机过滤器驱动程序示例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 可能包含用于创建过滤器的示例代码。
微软网站上也有以下下载:http: //support.microsoft.com/kb/176417
它可能有点过时,因为在 NT5.0 之前不支持 USB,但也许它仍然相关。
您可能想使用Autohotkey。这是一种 Windows 脚本语言,可以重新映射鼠标/键盘/操纵杆的每个键。如果您通过脚本捕获密钥并在将正确的密钥/宏发送到活动应用程序之前插入延迟,您可能会找到解决问题的一部分。
我的印象是你可以使用<dinput.h>
joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)
然后操纵杆事件将触发WM_JOYMOVE
事件,尽管我不知道消息是什么wParam
和消息。lParam
然后,当您的程序关闭或您不再需要joyReleaseCapture(JOYSTICKID1)
等
时,它可能只是空参数,然后告诉您使用joyGetPos
或joyGetPosEx
功能从 USB 设备中为自己查找数据。