Windows 上与用户客户端的自定义软件驱动程序通信

Custom software driver communication with user client on Windows

编辑:通过论坛上的另一个问题,我了解到 DeviceIoControl 可以异步,所以问题 4 现在只是问题 2

我发现,广泛的 Windows 驱动程序文档很少提及客户端用户模式应用程序如何直接与特定设备通信。我知道通常此类操作由 Win32 api 管理,但对于特定设备或(我感兴趣的)软件驱动程序,我不知道有多少方法可以完成

文档说可以使用 CreateFile, ReadFile, WriteFile etc. to "open" the driver as a "file" and then r/w from/to it, maybe asynchronously if you want. That sounds good but it feels like that can't be the best option for everything, nor is it the only option. DeviceIoControl 可以有特定的控制代码,你可以命令这样的驱动程序,但我在那里的文档中看不到任何异步功能。

在驱动程序文档中,很明显驱动程序必须为发送给它的 dispatch calls 编写回调例程,但我不明白这些调度调用从何而来,或者用户模式如何客户可能会直接与之交互。

使用 Valorant 的 Vanguard 作为示例软件驱动程序,我非常怀疑它只是 r/w 来自正在运行的“文件” - 它似乎太抽象以至于无法快速运行,或者对于复杂系统来说不够具体,正如您在 fileapi.h 中所能做的就是读取和写入,没有任何真正的参数化 - 对吧?

我的问题是:

  1. 软件驱动程序是否必须为文档推荐的所有 dispatch calls 编写例程,即使它们与硬件无关?

  2. 除了 R/W file api and the DeviceIoControl 函数之外,还有其他技术可以与特定(软件)驱动程序通信吗?

  3. 当我们的软件驱动程序像 Vanguard 一样完全针对目标用户应用程序定制时,是否存在高效、“精益求精”的解决方案?

  4. (忽略)async R/W file operations the only way to get this done in a multi-threaded async manner, where the client submits many possibly overlapping calls, or can DeviceIoControl 是否利用线程和异步性?

回答您的问题

  1. 没有。并非所有调度调用都需要为软件驱动程序实现。我认为只需要实施CREATE/CLOSE/DEVICE CONTROL。您甚至不需要实施卸载,但您将无法卸载测试所需的驱动程序。如果还有任何其他必需的调度方法,您可以简单地 return 未从这些实现中实现。

  2. 是的。您可以在驱动程序和应用程序之间使用命名管道作为另一种通信方式。

  3. 不确定与仅实施最小分派方法相比,您可以获得多少精益。

  4. 您可以使用多线程和同步操作,也可以使用单线程和异步操作。取决于哪种型号最适合您。