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

Winapi Windows上与用户客户端的自定义软件驱动程序通信,winapi,driver,nt-native-api,Winapi,Driver,Nt Native Api,编辑:通过论坛上的另一个问题,我了解到DeviceIoControl可以是异步的,所以问题4现在只是问题2 我发现,大量的Windows驱动程序文档几乎没有说明客户端用户模式应用程序如何直接与特定设备通信。我知道通常这样的操作是由Win32 api管理的,但对于特定的设备或(我感兴趣的)软件驱动程序,我不知道有多少方法可以做到这一点 文档中说,可以使用“打开”驱动程序作为“文件”,然后从/到驱动程序进行r/w,如果需要,可以异步进行。这听起来不错,但感觉这不是所有事情的最佳选择,也不是唯一的选择

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

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

文档中说,可以使用“打开”驱动程序作为“文件”,然后从/到驱动程序进行r/w,如果需要,可以异步进行。这听起来不错,但感觉这不是所有事情的最佳选择,也不是唯一的选择。可以有特定的控制代码,您可以像那样命令一个驱动程序,但是我在文档中看不到任何异步功能

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

使用Valorant的Vanguard作为示例软件驱动程序,我高度怀疑它仅仅是从运行中的“文件”中研发出来的-它似乎太抽象而不能快速,或者对于一个复杂的系统来说不够具体,因为您所能做的只是读取和写入,而没有任何真正的参数化-对吗

我的问题是:

  • 软件驱动程序必须为文档推荐的所有程序编写例程,即使它们与硬件无关

  • 除了与特定(软件)驱动程序通信的技术和功能外,是否还有其他技术

  • 当我们的软件驱动程序像Vanguard那样完全针对目标用户应用程序定制时,是否有高效的“精简”解决方案

  • (忽略)/file操作是否是以多线程异步方式完成此操作的唯一方法,其中客户端提交许多可能重叠的调用,或者可以利用线程和异步性


  • 回答你的问题

  • 不需要。并非所有调度调用都需要为软件驱动程序实现。我认为只需要实现创建/关闭/设备控制。您甚至不需要实现卸载,但这样就无法卸载测试所需的驱动程序。如果有任何其他必需的分派方法,您可以简单地从这些实现返回NotImplemented

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

  • 不确定你能得到多大程度的精益,而不仅仅是实施最小分派方法

  • 您可以使用多线程和同步操作,也可以使用单线程和异步操作。这取决于什么型号最适合你


  • 直接从文档中选择:“要检索设备句柄,请使用该函数。有关详细信息,请参阅备注。”备注部分似乎回答了您的问题。@IInspectable。。。我问这是否是唯一的方法,检索设备句柄不是问题的一部分@IInspectable软件驱动程序开发人员是否仅限于使其接口仅接受bytestream r/w或DeviceIoControl调用?下载Windows驱动程序工具包-WDK以开发驱动程序。大多数外围设备都有空白驱动程序的例子。@i486我不关心外围设备非常感谢您抽出时间阅读我的问题!关于答案4的查询:是否可以为多个线程中的每个线程实例化或存在一个驱动程序,以便每个线程都可以访问其“位”,或者只有一个对象/服务是线程必须排队使用的当您调用CreateFile或OpenFile时,调用函数以打开驱动程序的每个线程都拥有该句柄。因此,如果有多个线程在驱动程序上调用CreateFile/OpenFile,那么它们都将获得自己的句柄,可以独立操作。例如,可以同时从多个线程调用以下函数:-``void TalkToDriver(){HANDLE hDriver=CreateFile(“Driver”):DeviceIoCtrl(hDriver):CloseFile(hDriver);}很抱歉打扰您,(感谢您到目前为止的时间)。。。我注意到,在迄今为止我花时间理解的唯一一个WDK示例中,驱动程序仅在作为运行服务创建之后,才使用CreateFile和DeviceIoControl进行访问。这是必要的吗?所有驱动程序必须首先作为服务运行才能使用吗?服务的概念是驱动程序执行的唯一方式吗?我很确定驱动程序不能用CreateProcess加载,但还有其他范例吗?这是正确的。你必须告诉操作系统你编译的文件是一个驱动程序,而告诉windows的唯一方法就是创建一个服务。在创建服务时,您可以指定驱动程序是在引导期间自动加载的,还是按需加载的,以及是否可以卸载。这是一个重要的步骤,只需要做一次。顺便说一句,我希望你使用虚拟机来测试你的驱动程序,而不是将它加载到你的开发箱中。至于这是唯一的方法,答案不是。如果不想创建服务,则必须为驱动程序指定INF文件(配置文件)。Windows可以解析INF文件并为您创建服务条目。这是一种更复杂的方法,通常创建服务是纯软件驱动程序的首选方法。