首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户模式和内核模式之间的共享内存

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

Stack Overflow用户
提问于 2015-09-15 21:25:26
回答 1查看 3.1K关注 0票数 9

我正在为Windows7编写一些内核端代码,以访问在用户模式下创建的共享内存,如建议的这里

共享内存是在具有名称的用户空间中创建的:

代码语言:javascript
运行
复制
"MySharedMem"

在用户空间中打开共享内存是可行的。

在内核模式下打开相同的共享内存,调用ZwOpenSection失败,返回:

代码语言:javascript
运行
复制
#define STATUS_OBJECT_NAME_NOT_FOUND     ((NTSTATUS)0xC0000034L)

内核代码是:

代码语言:javascript
运行
复制
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

另外,由于"Global\\MySharedMem"不能工作,所以创建共享内存。

我做错了什么?

我试图在内核模式下创建共享内存,我在ZwCreateSectionZwMapViewOfSection上获得了成功,但是当我访问pSharedData_指针来测试缓冲区时,我得到了访问冲突:

代码语言:javascript
运行
复制
NTSTATUS CModule1::MapUserSection()
{
typedef struct SHARED_SECTION {DWORD i; };
NTSTATUS status = STATUS_SUCCESS;
ULONG Attributes=OBJ_KERNEL_HANDLE | OBJ_FORCE_ACCESS_CHECK;

OBJECT_ATTRIBUTES objectAttributes;
LARGE_INTEGER MaxSize;
SIZE_T ViewSize=sizeof(SHARED_SECTION);
MaxSize.QuadPart=sizeof(SHARED_SECTION);

WCHAR stringBuffer[] =  L"\\MySm2";
UNICODE_STRING  sectionName;
RtlInitUnicodeString(&sectionName,stringBuffer);
InitializeObjectAttributes(&objectAttributes,&sectionName,Attributes,NULL,NULL);

status= ZwCreateSection(&sectionHandle_,SECTION_ALL_ACCESS,&objectAttributes,&MaxSize,PAGE_READWRITE,SEC_COMMIT,NULL);
status = ZwMapViewOfSection(sectionHandle_, ZwCurrentProcess(), (PVOID *)&pSharedData_, 0, 0, NULL, &ViewSize, ViewShare, 0, PAGE_READWRITE); 

//To test the buffer
RtlFillMemory(pSharedData_, '1',ViewSize);
return status;
}

一切都失败了..。

EN

回答 1

Stack Overflow用户

发布于 2015-09-15 22:49:46

事关CreateFileMapping

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

来自KB191840

对象总是映射在进程的用户地址空间(低于0x80000000) (不管对象是以内核模式还是用户模式创建),只有在进程上下文中访问该地址时,该地址才是有效的。

KB继续说:

此方法不建议使用,并且被低级别设备驱动程序使用最少,因为正如前面所解释的,地址的范围仅限于对象被映射的进程,并且不能在DPC或ISR中访问。重点雷

解决办法要么是:

  1. 在内核模式下创建文件映射。(由KB文章建议)
  2. 使用IOCTL
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32595915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档