在Windows 10驱动程序中将内核空间虚拟地址映射到用户空间虚拟地址

时间:2017-08-08 16:21:31

标签: c windows-10 driver memory-mapping kernel-mode

我在Windows 10(64位)中编写内核模式驱动程序,其主要目的是从DMA读取,我想知道是否不是将内存块中的内存块复制到已分配的缓冲区在用户空间中,我可以以某种方式向用户空间公开地址(当然不是物理地址),并节省内存复制操作。

也许是这样的:

  1. 分配一块连续的物理内存(并将物理地址映射到内核空间中的虚拟地址)。

  2. 将内核空间中的虚拟地址映射到用户空间中的虚拟地址。

  3. 顺便说一句,既然只有一个内核空间,并且系统中运行的进程数量正确(这是正确的吗?),我将不得不使用某种句柄来处理调用进程,以便在适当的进程中获取虚拟地址......

    谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

对于你的(2),使用AccessMode = UserMode的MmMapLockedPagesSpecifyCache()怎么样?请注意重要的警告,"例程返回一个在运行驱动程序的进程的上下文中有效的用户地址,"因此,在执行映射时,您需要确保驱动程序在用户模式应用程序的进程中运行,即通过直接处理来自用户模式代码的调用的驱动程序代码中的映射,例如DeviceIoControl的()。另请注意,要使用此功能,您需要提供描述物理页面的MDL,并且必须锁定这些页面。