gpt4 book ai didi

c++ - 在 Windows 内核驱动程序中与用户空间共享来自内核空间的超过 "4Go - PAGE_SIZE"的缓冲区

转载 作者:行者123 更新时间:2023-11-28 05:51:49 25 4
gpt4 key购买 nike

我目前正在研究 windows 内核驱动程序,以便更好地了解 windows 内部结构。作为玩具项目,我编写了一个内核驱动程序,其作用是分配可以在进程之间共享的内存。

应用程序可以要求驱动程序创建任意大小的内存缓冲区。然后,驱动程序使用 MmAllocatePagesForMdl 在 KernelSpace 中创建此缓冲区,然后使用 MmMapLockedPagesSpecifyCache 在用户模式下映射此缓冲区。结果指针返回给应用程序,应用程序可以像在任何普通缓冲区中一样直接写入它。然后另一个应用程序可以要求驱动程序访问此内存以便读取它(甚至写入);驱动程序只需在新进程的上下文中对已存在的缓冲区调用MmMapLockedPagesSpecifyCache。到目前为止,一切都运行良好。

在这个小成功之后,我想在内核空间中创建一个更大的缓冲区,但我碰壁了。一个 MDL 最多只能管理“4Go - PAGE_SIZE”。

我的第一个想法是使用 MmAllocatePagesForMdl 创建多个 MDL,直到我满足大小请求,使用 Next 指针链接 MDL,然后将指针返回到用户空间使用 MmMapLockedPagesSpecifyCache。但是 MmMapLockedPagesSpecifyCache 不适用于链式 MDL,它只在用户空间映射第一个 MDL。

到现在为止,我还没有找到在用户空间从内核空间返回超过4Go的连续虚拟内存的方法。内核空间中的分配不是问题,因为我使用分页内存,因此物理内存不必是连续的,但我找不到如何将连续虚拟内存中的那些映射到用户空间中使用。

所以我是不是太贪心了,这是不可能的?还是我错过了什么才能做到这一点?

有关信息,它只是一个 64 位驱动程序和 64 位应用程序,因此这里没有 32 位限制。

最佳答案

所以到处找了下,用MDL是不行的。要拥有超过 4Go,我必须在我的驱动程序中创建部分。它相当于用户模式下的 CreateFileMapping。但我不想依赖 SharedMemory,因为我在内存分配/映射期间有一些锁。

然后 Alex 在 osr forum 上给了我一个很好的建议为了解决我最初的问题;使用带有 SEC_LARGE_PAGES 选项的 CreateFileMapping。内存锁消失了,我的速度和我的驱动程序一样快,没有这种开发可能导致的所有问题。

关于c++ - 在 Windows 内核驱动程序中与用户空间共享来自内核空间的超过 "4Go - PAGE_SIZE"的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35084162/

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