【问题标题】:Custom software driver communication with user client on Windows在 Windows 上与用户客户端进行自定义软件驱动程序通信
【发布时间】:2021-05-24 15:20:33
【问题描述】:

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

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

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

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

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

我的问题是:

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

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

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

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

【问题讨论】:

  • 直接来自DeviceIoControl 文档:“要检索设备句柄,请使用CreateFile 函数。有关详细信息,请参阅备注。” 备注 部分似乎回答了您的问题。
  • @IInspectable ...我问这是否是唯一的方法,检索设备句柄不是问题的一部分!
  • @IInspectable 是软件驱动程序开发人员仅限于使其接口仅接受字节流 r/w 或 DeviceIoControl 调用吗?
  • 下载 Windows Driver Kit - WDK 以开发驱动程序。大多数外围设备都有空白驱动程序示例。
  • @i486 我不关心外围设备

标签: winapi driver nt-native-api


【解决方案1】:

回答你的问题

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

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

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

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

【讨论】:

  • 非常感谢您花时间阅读我的问题!询问答案 4:是否可以为多个线程中的每个线程实例化或存在驱动程序,以便每个线程都可以访问其“位”,或者是否只有一个对象/服务线程必须排队使用
  • 当您调用 CreateFile 或 OpenFile 时,调用该函数以打开驱动程序的每个线程都拥有该句柄。因此,如果您有多个线程在驱动程序上调用 CreateFile/OpenFile,它们都将获得自己的句柄,它们可以独立操作。例如,可以同时从多个线程调用以下函数:- ``` void TalkToDriver() { HANDLE hDriver = CreateFile("Driver"): DeviceIoCtrl(hDriver): CloseFile(hDriver); }
  • 抱歉打扰了,(感谢您到目前为止的时间)...我注意到,在我花时间了解的唯一 WDK 示例中,驱动程序只能通过 CreateFile 访问和 DeviceIoControl 首先创建为正在运行的服务。这是必要的吗 - 所有驱动程序都必须首先作为要使用的服务运行吗?服务的概念是驱动程序执行的唯一方法吗?我很确定驱动程序不能用 CreateProcess 加载,但还有另一种范式吗?
  • 没错。你必须告诉操作系统你编译的文件是一个驱动程序,而告诉 Windows 的唯一方法是创建一个服务。创建服务时,您可以指定驱动程序是在引导期间自动加载,还是按需加载驱动程序以及是否可以卸载。这是一个重要步骤,只需执行一次。顺便说一句 - 我希望您使用虚拟机来测试您的驱动程序,而不是将其加载到您的开发盒上。
  • 至于只有这样,答案是没有。如果您不想创建服务,则必须为您的驱动程序指定 INF 文件(这是一个配置文件)。 Windows 可以解析 INF 文件并为您创建一个服务条目。这是一种更复杂的方式,通常创建服务是纯软件驱动程序的首选方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多