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

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

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

也许是这样的:

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

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

顺便说一句,因为只有一个内核空间,而用户空间的数量与系统中运行的进程数量一样多(对吗?),我将不得不使用某种句柄来处理调用进程,在为了在适当的过程中得到虚拟地址...

感谢您的宝贵时间!

最佳答案

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

关于c - 在 Windows 10 驱动程序中将内核空间虚拟地址映射到用户空间虚拟地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573419/

相关文章:

c - 你如何使用 scanf 在 C 中获取一个 int?

C - scanf() 之后的 printf() 直到下一个 scanf() 才打印

audio - 为什么Windows文件属性对于48 kHz,16位编码显示位速率:1152 kBit/s?

linux - 关于如何在Windows上使用VirtualBox和Vagrant搭建Ubuntu虚拟环境

c - 请求 ProcessBasicInformation 时 ZwQueryInformationProcess 出现奇怪的行为

c - 当 2 个程序映射同一个文件时,mmap 如何工作

c++ - 两次调用timer_settime会产生错误

installation - 从闪存驱动器运行 SAS 9.4

c - 制作我自己的/dev/random,缓冲区不工作,c

c - 删除硬件id对应的oem.inf文件