gpt4 book ai didi

c++ - KMDF 的多线程 DeviceIOControl

转载 作者:可可西里 更新时间:2023-11-01 11:47:10 33 4
gpt4 key购买 nike

在回答我的问题之前,我将回顾一下我目前正在使用的东西,以便您对我已经做过/尝试过的事情有一个很好的了解。

我有一个多线程用户模式 ​​Windows 桌面应用程序,它向 KMDF 驱动程序发出 DeviceIOControl 调用(纯软件,无硬件)。有 5 个单独的线程,它们都不断地对驱动程序进行相同的自定义 IOCTL 调用。此请求包括:

  1. PsLookupProcessByProcessId 以获取要从中读取内存的进程。
  2. MmCopyVirtualMemory 将请求的内存复制到提供的缓冲区中。
  3. ObDereferenceObject 减少引用计数。

驱动程序目前正在连续执行此操作,而我的用户模式应用程序中的主要瓶颈是等待内存读取完成,一切都需要完成才能“渲染”场景。

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

最佳答案

好的,看来您问题中最重要的部分在这里:

I've been searching far and wide trying to find out what exactly opening a file as overlapped actually changes with respect to how the WDF handles IOCTL requests [...]

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

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

无论如何,如果驱动程序当前仅在单个线程上运行,使用重叠 I/O 将无济于事。您将不得不修改驱动程序。相反,修改驱动程序就足够了;您可能不需要更改应用程序。 (异常(exception):我不确定从多个线程同时使用同一个同步句柄是否合法,所以我建议每个线程打开自己的设备句柄,至少在您确定驱动程序正常工作之前根据需要。)

我不熟悉 WDF,但是 MSDN 条目 Dispatching Methods for I/O Requests看起来很相关。

关于c++ - KMDF 的多线程 DeviceIOControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42080855/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com