【发布时间】:2016-05-07 04:00:34
【问题描述】:
我目前正在使用 Windows 内核驱动程序,以便更好地了解 Windows 内部结构。作为一个玩具项目,我编写了一个内核驱动程序,其作用是分配可以在进程之间共享的内存。
应用程序可以要求驱动程序创建任意大小的内存缓冲区。然后驱动程序在 KernelSpace 中使用 MmAllocatePagesForMdl 创建这个缓冲区,然后在用户模式下使用 MmMapLockedPagesSpecifyCache 映射这个缓冲区。结果指针被返回给应用程序,该应用程序可以像在任何普通缓冲区中一样直接写入它。然后另一个应用程序可以要求驱动程序访问该内存以读取它(甚至写入);驱动程序只需要在新进程的上下文中对已经存在的缓冲区调用 MmMapLockedPagesSpecifyCache。到目前为止,一切都运行良好。
在这个小小的成功之后,我想在内核空间中创建一个更大的缓冲区,但我碰壁了。一个 MDL 最多只能管理“4Go - PAGE_SIZE”。
我的第一个想法是使用 MmAllocatePagesForMdl 创建多个 MDL,直到满足大小请求,使用 Next 指针链接 MDL,然后将指针返回给用户空间使用 MmMapLockedPagesSpecifyCache。但是 MmMapLockedPagesSpecifyCache 不适用于链式 MDL,它只能在用户空间映射第一个 MDL。
到目前为止,我还没有找到一种方法来从用户空间的内核空间返回超过 4Go 的连续虚拟内存。内核空间中的分配不是问题,因为我使用内存分页,因此物理内存不必是连续的,但我找不到如何将它们映射到连续的虚拟内存中以在用户空间中使用。
那我是不是太贪心了,这是不可能的?还是我错过了什么?
有关信息,它是仅 64 位驱动程序和 64 位应用程序,因此此处没有 32 位限制。
【问题讨论】:
标签: c++ driver windows-kernel