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

问题描述

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

我发现,大量的 Windows 驱动程序文档几乎没有说明客户端用户模式应用程序如何直接与特定设备通信。我知道通常这些操作是由 Win32 api 管理的,但是在特定设备或(我感兴趣的)软件驱动程序的情况下,我不知道很多方法可以完成

文档说可以使用 CreateFile,ReadFile,WriteFile etc. 将驱动程序“打开”为“文件”,然后从/到它的 r/w,如果您愿意,可以异步。这听起来不错,但感觉这不可能是所有事情的最佳选择,也不是唯一的选择。 DeviceIoControl 可以有特定的控制代码,您可以命令这样的驱动程序,但我在那里的文档中看不到任何异步功能

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

使用 Valorant 的 Vanguard 作为示例软件驱动程序,我非常怀疑它只是从运行中的“文件”中提取的 - 它似乎太抽象而无法快速,或者对于复杂的系统来说不够具体,就像您一样可以在 fileapi.h 中执行读取和写入操作,无需任何实际参数化 - 对吗?

我的问题是:

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

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

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

  4. (忽略)async R/W 文件操作是否是以多线程异步方式完成此操作的唯一方法,客户端提交许多可能重叠的调用,或者可以DeviceIoControl 利用线程和异步性?

解决方法

回答您的问题

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

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

  3. 不知道除了实施最少的调度方法之外,您还能获得多少精益。

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