我将如何创建一个“游戏 handle ”,它在 DirectInput 应用程序中显示为普通游戏 Controller ,但其控件的状态实际上由软件定义?
最佳答案
编写一个设备驱动程序来伪装成一个。
具体来说,Windows 设备驱动程序通过中断请求协议(protocol)处理所谓的中断请求 - 这归结为驱动程序内部的包装结构和一组缓冲区。
现在您需要知道的下一件事是,许多驱动程序实际上是分层的,或堆叠的,或者您想要使用的任何名称。因此,例如要编写磁盘驱动程序,您可能会与其上方的驱动程序(作为磁盘类)进行交互,但使用其下方的驱动程序(例如 scsi 端口)实际向您的设备发送命令。
这就是真实设备的工作方式。假冒设备需要符合顶级接口(interface)要求,例如磁盘, Controller ,鼠标,或任何东西。然而,在底层他们可以做任何他们喜欢的事情——返回他们喜欢的任何值。
这开启了通过用户模式应用程序控制驱动程序并假装"is"设备的可能性。要向驱动程序发送消息,您可以向它发送 DeviceIoControl
;然后要实际获取这些消息,您可以:
- 将它们填充到构成 DeviceIoControl 的 Irp 中。
- 让驱动程序从您进程的内存空间中读取它们。
驱动程序还可以访问 \\Registry\\Machine
和其他各种非用户特定的非资源管理器注册表区域,因此可以通过这种方式进行通信。
最后,没有人说您不能过滤现有的 IO,而不是通过新设备将其全部组合起来。您可以通过多种选择和方法来实现这一目标。
如果你要这样做,你需要:
- VirtualKD或昂贵的调试器电缆和两台 PC。
您可能还想从 this blog post 上的引用文献开始.您会发现驱动程序代码实际上有无数种不同的名称,因此我将解释其中的一些名称:
- WDM = Windows Driver Model,基本上是混合了(某些)Windows 9x 的 NT 驱动程序模型。
- KMDF = 内核模式驱动程序框架 - 上述类型的驱动程序使用它,另外还有 WDF(Windows Driver Foundation),它是 WDM 之上的一组库,可以更快地使用它。
- UMDF = 用户模式驱动程序框架 - 编写没有内核模式危险的驱动程序。如果可以,请使用它,因为出错的内核模式驱动程序会蓝屏(用驱动程序的说法,错误检查)您的系统。
编辑:我对 DirectInput 的了解不多 - 可能有一种方法可以通过 DLL 重定向等覆盖正在使用的各种 API 控件,这可能比我的方法更简单已经描述过了。
关于windows - 如何创建虚拟游戏 handle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711947/