Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ KMDF的多线程设备控制_C++_C_Windows_Driver_Kmdf - Fatal编程技术网

C++ KMDF的多线程设备控制

C++ KMDF的多线程设备控制,c++,c,windows,driver,kmdf,C++,C,Windows,Driver,Kmdf,在回答我的问题之前,我将回顾一下我目前的工作内容,以便您对我已经做过/尝试过的工作有一个大致的了解 我有一个多线程的usermode Windows桌面应用程序,它向KMDF驱动程序发出DeviceIOControl调用—纯粹是软件,而不是硬件。有5个独立的线程不断地对驱动程序进行相同的自定义IOCTL调用。这项请求包括: PsLookupProcessByProcessId以获取要从中读取内存的进程。 MmCopyVirtualMemory将请求的内存复制到提供的缓冲区中。 ObjectRef

在回答我的问题之前,我将回顾一下我目前的工作内容,以便您对我已经做过/尝试过的工作有一个大致的了解

我有一个多线程的usermode Windows桌面应用程序,它向KMDF驱动程序发出DeviceIOControl调用—纯粹是软件,而不是硬件。有5个独立的线程不断地对驱动程序进行相同的自定义IOCTL调用。这项请求包括:

PsLookupProcessByProcessId以获取要从中读取内存的进程。 MmCopyVirtualMemory将请求的内存复制到提供的缓冲区中。 ObjectReferenceObject以减少引用计数。 驱动程序目前正在串行地执行此操作,而我的usermode应用程序中的主要瓶颈是等待内存读取完成,并且在渲染场景之前,所有内容都需要完成


我已经尽可能减少了DeviceIOControl请求的数量,所以现在我一直在研究重叠IO,并允许每个线程异步发送请求。我的问题是,这是否值得尝试,因为我不知道是否可以在驱动程序中使用多个线程同时读取不同的地址。

好的,您的问题最重要的部分似乎在这里:

我一直在进行广泛的搜索,试图找出在WDF处理IOCTL请求时,以重叠方式打开文件的实际变化[…]

它不会改变任何事情;对设备驱动程序的所有请求都是异步的

在同步句柄上执行I/O时,Windows会代表您向驱动程序发出异步I/O请求,并等待该请求完成。据我所知,驱动程序甚至无法判断原始请求是同步的还是重叠的。[编辑:这不是真的。正如RbMm在评论中指出的,内核实际上区分了同步I/O和异步I/O,但从实际角度看,这对您来说并不重要。]

无论如何,如果驱动程序当前仅在一个线程上运行,那么使用重叠I/O将没有帮助。您必须修改驱动程序。相反,修改驱动程序就足够了;您可能不需要更改应用程序。例外情况:我不确定从多个线程同时使用同一个同步句柄是否合法,因此我建议每个线程向设备打开自己的句柄,至少在您确定驱动程序按预期工作之前是这样


我不熟悉WDF,但MSDN条目看起来很相关。

好的,您的问题最重要的部分似乎在这里:

我一直在进行广泛的搜索,试图找出在WDF处理IOCTL请求时,以重叠方式打开文件的实际变化[…]

它不会改变任何事情;对设备驱动程序的所有请求都是异步的

在同步句柄上执行I/O时,Windows会代表您向驱动程序发出异步I/O请求,并等待该请求完成。据我所知,驱动程序甚至无法判断原始请求是同步的还是重叠的。[编辑:这不是真的。正如RbMm在评论中指出的,内核实际上区分了同步I/O和异步I/O,但从实际角度看,这对您来说并不重要。]

无论如何,如果驱动程序当前仅在一个线程上运行,那么使用重叠I/O将没有帮助。您必须修改驱动程序。相反,修改驱动程序就足够了;您可能不需要更改应用程序。例外情况:我不确定从多个线程同时使用同一个同步句柄是否合法,因此我建议每个线程向设备打开自己的句柄,至少在您确定驱动程序按预期工作之前是这样


我不熟悉WDF,但MSDN条目看起来很相关。

首先,用户模式如何在同步或异步模式下打开文件非常重要?CreateFile的文件\u标志\u重叠或ZwOpenFile或ZwCreateFile的文件\u同步\u IO\u[NO]NALERT

如果在同步模式下打开文件,则同步IO将位于文件对象中。标记I/O子系统将所有请求序列化为文件-这样,在上一个请求完成之前,它不会向设备发送新请求。使用异步文件对象-没有这样的限制-requestIRP将只发送到您的设备

如果你这么说

然而,线程本身是相互独立的

如果线程共享单个文件句柄文件对象,或者每个线程必须在设备上单独打开自己的私有文件,则需要以异步方式打开文件,并重叠文件标志。考虑更好的共享异步文件

从驱动程序端,必须使用WDFIOQUEDISPATCHPARALLEL队列调度类型。所以只要接受请求IRP处理它,并完成我如何理解你不发送它 s请求给另一个驱动程序,或放入另一个队列

本质上我要问的是,对于重叠IO,它是 相当于我的驱动程序处理每个线程的一个实例,或者 仍然有一个驱动程序从5个线程和 努力跟上

您总是有一个驱动程序实例,并精确计算您创建它的设备数量。如果您只创建一个设备-并且将仅创建这一个设备。将在此设备上打开所有文件。来自任何进程/线程的所有请求都将发送到此单个设备实例


如果您对所有线程使用相同的文件,并且它将是同步文件—I/O子系统将所有请求序列化到驱动程序—这对您不利。驱动程序设备的客户端必须以异步方式打开文件,或者每个客户端都打开自己的私有文件。从驱动程序方面看,您需要WDFIOQUEUEDDISPATCH并行队列调度类型,因为我如何理解所有请求是独立的,并且您不需要在请求之间进行同步

首先,用户模式如何以同步或异步模式打开文件非常重要?CreateFile的文件\u标志\u重叠或ZwOpenFile或ZwCreateFile的文件\u同步\u IO\u[NO]NALERT

如果在同步模式下打开文件,则同步IO将位于文件对象中。标记I/O子系统将所有请求序列化为文件-这样,在上一个请求完成之前,它不会向设备发送新请求。使用异步文件对象-没有这样的限制-requestIRP将只发送到您的设备

如果你这么说

然而,线程本身是相互独立的

如果线程共享单个文件句柄文件对象,或者每个线程必须在设备上单独打开自己的私有文件,则需要以异步方式打开文件,并重叠文件标志。考虑更好的共享异步文件

从驱动程序端,必须使用WDFIOQUEDISPATCHPARALLEL队列调度类型。所以,只需接受请求IRP处理它,并完成我如何理解您不将此请求发送给其他驱动程序或放入其他队列

本质上我要问的是,对于重叠IO,它是 相当于我的驱动程序处理每个线程的一个实例,或者 仍然有一个驱动程序从5个线程和 努力跟上

您总是有一个驱动程序实例,并精确计算您创建它的设备数量。如果您只创建一个设备-并且将仅创建这一个设备。将在此设备上打开所有文件。来自任何进程/线程的所有请求都将发送到此单个设备实例


如果您对所有线程使用相同的文件,并且它将是同步文件—I/O子系统将所有请求序列化到驱动程序—这对您不利。驱动程序设备的客户端必须以异步方式打开文件,或者每个客户端都打开自己的私有文件。从驱动程序端-您需要WDFIOQUEDISPATCHPARALLEL queue DISPATCHTYPE,因为我如何理解所有请求是独立的,并且您不需要在请求之间进行同步

@HarryJohnston在每个线程中,读取取决于前面的读取,以便返回正确的数据。然而,这些线本身是相互独立的。如果我以重叠方式打开文件,并在设备控制功能中等待IOCTL完成或超时,我是否仍会看到由于驱动程序非串行处理5个线程而导致的性能提高?本质上,我要问的是,对于重叠IO,它是否相当于我的驱动程序处理每个线程的一个实例,还是仍然有一个驱动程序收到来自5个线程的大量请求并努力跟上?@HarryJohnston抱歉,我找不到合适的词来表达我的问题。我一直在进行广泛的搜索,试图找出在WDF处理IOCTL请求的过程中,以重叠方式打开文件究竟会发生什么变化,但我所找到的只是实现。每个请求是否都会产生一个线程或等效线程,以便在我的驱动程序中并行处理请求,或者我的驱动程序调度是否只是按顺序通过队列,由我来实现读取的并行化?好吧,忘记我之前的大多数评论-我还没有完全确定您正在使用WDF,因此,I/O请求进入队列,而不是直接发送到代码。我的错误;抱歉。驱动程序当前正在连续执行此操作-所以您使用WDFIOQUEDISPATCHSEQUENAL?为什么不使用WDFIOqueDispatchParallel?我如何理解用户模式必须在您的设备上创建文件,且文件\u标志\u重叠或没有文件\u同步\u IO\u[NO]NALERT标志。来自己方的驱动程序必须使用WDFIOqueDispatchParallel队列type@HarryJohnston在每个线程中,读取依赖于前面的线程,以便返回正确的数据。然而,这些线本身是相互独立的。如果我以重叠方式打开文件,并在设备控制功能中等待IOCTL完成或超时,我还会看到由于驱动程序处理5个非串行线程而导致的性能提高吗
是吗?本质上,我要问的是,对于重叠IO,它是否相当于我的驱动程序处理每个线程的一个实例,还是仍然有一个驱动程序收到来自5个线程的大量请求并努力跟上?@HarryJohnston抱歉,我找不到合适的词来表达我的问题。我一直在进行广泛的搜索,试图找出在WDF处理IOCTL请求的过程中,以重叠方式打开文件究竟会发生什么变化,但我所找到的只是实现。每个请求是否都会产生一个线程或等效线程,以便在我的驱动程序中并行处理请求,或者我的驱动程序调度是否只是按顺序通过队列,由我来实现读取的并行化?好吧,忘记我之前的大多数评论-我还没有完全确定您正在使用WDF,因此,I/O请求进入队列,而不是直接发送到代码。我的错误;抱歉。驱动程序当前正在连续执行此操作-所以您使用WDFIOQUEDISPATCHSEQUENAL?为什么不使用WDFIOqueDispatchParallel?我如何理解用户模式必须在您的设备上创建文件,且文件\u标志\u重叠或没有文件\u同步\u IO\u[NO]NALERT标志。来自己方的驱动程序必须使用WDFIOQUEDISPATCHPARALLEL队列类型。真正的驱动程序可以确定操作是否同步-@RbMm:注意;谢谢你知道为什么司机会区分这两种情况吗?可能是某种优化?主要文件系统驱动程序使用这种优化。看看这个例子。例如,仅当操作synchronousif SynchronousIo&&时,FS才会更新当前文件位置!PagingIo{FileObject->CurrentByteOffset.QuadPart=StartingLbo+Irp->IoStatus.Information;}调用公共设置例程,如果同步-如果操作同步-客户端将在某个位置被阻止,直到请求未完成。所以司机可以自己等。如果操作是异步的,最好的做法是不阻塞客户端。如果我们无法完成,只需保存请求并返回待处理状态。稍后再完成。但所有这些对于足够复杂的情况来说,真正的驱动程序能够确定的是操作同步-@RbMm:noted;谢谢你知道为什么司机会区分这两种情况吗?可能是某种优化?主要文件系统驱动程序使用这种优化。看看这个例子。例如,仅当操作synchronousif SynchronousIo&&时,FS才会更新当前文件位置!PagingIo{FileObject->CurrentByteOffset.QuadPart=StartingLbo+Irp->IoStatus.Information;}调用公共设置例程,如果同步-如果操作同步-客户端将在某个位置被阻止,直到请求未完成。所以司机可以自己等。如果操作是异步的,最好的做法是不阻塞客户端。如果我们无法完成,只需保存请求并返回待处理状态。稍后再完成。但所有这些都足以应付复杂的案件