用户模式和内核模式之间的共享内存

时间:2015-09-15 21:25:26

标签: c++ windows winapi shared-memory kernel32

我正在为Windows7编写一些内核端代码,以访问在用户模式下创建的共享内存,如建议here。 共享内存在用户空间中创建,名称为:

"MySharedMem"

打开用户空间中的共享内存 在内核模式下打开相同的共享内存,调用ZwOpenSection将无法返回:

#define STATUS_OBJECT_NAME_NOT_FOUND     ((NTSTATUS)0xC0000034L)

内核代码是:

NTSTATUS CModule1::OpenShared()
{
SIZE_T vs = 256;
WCHAR stringBuffer[] =  L"\\BaseNamedObjects\\MySharedMem";
UNICODE_STRING  sectionName;

RtlInitUnicodeString(&sectionName,stringBuffer);

OBJECT_ATTRIBUTES myAttributes;

InitializeObjectAttributes(&myAttributes,&sectionName,0,NULL,NULL);
NTSTATUS status0 = ZwOpenSection(&sectionHandle_,SECTION_MAP_READ|SECTION_MAP_WRITE,&myAttributes);

NTSTATUS status = ZwMapViewOfSection(&sectionHandle_, ZwCurrentProcess(), (PVOID *)&pSharedData_, 0, 0, NULL, &vs, ViewShare, 0, PAGE_READWRITE); 
return status;
}

我尝试了多个名称(L"\\MySharedMem"L"MySharedMem"),但我收到的其他错误为STATUS_OBJECT_PATH_INVALIDSTATUS_OBJECT_PATH_NOT_FOUND
同时创建共享内存为{{ 1}}不起作用。

我做错了什么?

我尝试在内核模式下创建共享内存,我在"Global\\MySharedMem"ZwCreateSection上取得了成功,但是当我访问pSharedData_指针来测试缓冲区时,我得到了访问冲突:

ZwMapViewOfSection

一切都失败了......

1 个答案:

答案 0 :(得分:5)

关于CreateFileMapping

  

从会话零以外的会话在全局命名空间中创建文件映射对象需要SeCreateGlobalPrivilege权限。

来自KB191840

  

[T]对象始终映射到进程的用户地址空间(低于0x80000000)(无论对象是在内核模式还是用户模式下创建),只有在上下文中访问该地址时该地址才有效这个过程。

KB继续:

  

不推荐使用此方法,并且低级设备驱动程序至少使用此方法,因为如前所述,地址范围仅限于对象映射的过程,以及无法在DPC或ISR中访问。 [重点我的]

修复是:

  1. 在内核模式下创建文件映射。 (建议使用知识库文章。)
  2. 使用IOCTL