Windows 驱动程序 - 来自用户模式的共享内存 -> 内核模式

Posted

技术标签:

【中文标题】Windows 驱动程序 - 来自用户模式的共享内存 -> 内核模式【英文标题】:Windows drivers - shared memory from user mode->kernel mode 【发布时间】:2013-12-12 23:36:37 【问题描述】:

我正在搞乱一些驱动程序开发,并且在让我的一些代码工作时遇到问题。我不确定这是我不知道的 API 的怪癖还是什么。

我有一个用户应用程序,它使用 CreateFileMapping、MapViewOfFile 等在 BaseNamedObjects 下创建了一个命名共享对象。我正在尝试使用 ZwOpenSection 和 ZwMapViewOfSection 在我的驱动程序代码中读取这个共享对象

问题代码如下:

char *sharedData = NULL;
SIZE_T vs = 256;

InitializeObjectAttributes(&myAttributes,&sectionName,OBJ_KERNEL_HANDLE,NULL,NULL);
ZwOpenSection(&sectionHandle,SECTION_MAP_READ,&myAttributes)

ZwMapViewOfSection(&sectionHandle, ZwGetCurrentProcess(), (PVOID *)sharedData, 0, 256, 
NULL, &vs, ViewUnmap, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

对 ZwOpenSection 的调用成功完成,我正确获取了对象,但第二次调用失败。返回的状态表明这是第九个参数的问题,但我已经尝试了我能想到的所有组合,但没有任何显示,所以我不确定是否是导致第 9 个参数的不同参数的问题“不正确”或者我遗漏了其他内容

谢谢。

【问题讨论】:

MEM_COMMIT 是不允许的,MEM_RESERVE 没有意义。在这里使用 0。 【参考方案1】:

创建该部分时使用的访问权限与您在此处传递的访问权限相同吗?

MEM_COMMIT 不允许在此函数中直接调用。如果您仍然想提交和保留页面,请尝试调用 virtualalloc(),否则只需在第 8 个参数中传递 NULL。

【讨论】:

以上是关于Windows 驱动程序 - 来自用户模式的共享内存 -> 内核模式的主要内容,如果未能解决你的问题,请参考以下文章

2022国赛15:Windows——文件共享

从我的应用程序关闭Windows 10控制台“标记”模式

freenas 实现内网smb共享,传输速度达到2G

PostgreSQL 模式操作

PostgreSQL模式介绍

Windows Server 2012 R2 访问网络文件