windows - 如何创建虚拟游戏 handle ?

标签 windows virtual gamecontroller

我将如何创建一个“游戏 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/

相关文章:

c# - 如何旋转游戏对象?

ios - 是否可以使用 Xcode 使游戏 Controller 振动?

c# - 快速替换Win32_NetworkAdapter WMI类以获取本地计算机的MAC地址

windows - 是否可以查询特定域用户当前登录的 IP 地址(或机器名称)列表?

windows - 在 WSL2 不工作的情况下在您的网络上创建 React 应用程序

c++ - parent 之间的多重继承类型转换 __vftable 似乎已损坏

C++ Derived class is abstract 错误

ios - 从 swift 中的对象获取哈希值

c - 从适配器获取 DNS 服务器 IP 地址?

linux - 使用虚拟服务器作为开发环境是否安全,符号链接(symbolic link)到主机上的文件?