1

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

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

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

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

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

我的问题是:

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

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

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

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

4

1 回答 1

1

回答您的问题

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

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

  3. 不知道你能比仅仅实现最小调度方法更精益多少。

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

于 2021-02-23T22:25:14.017 回答