我正在为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。另外将共享内存创建为"Global\\MySharedMem"也不起作用。我在做什么错?

我尝试在内核模式下创建共享内存,我在ZwCreateSectionZwMapViewOfSection上获得成功,但是在访问pSharedData_指针以测试缓冲区时遇到访问冲突:
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;
}

一切都失败了...

最佳答案

关于CreateFileMapping:



KB191840:



KB继续:



解决方法是:

  • 以内核模式创建文件映射。 (由知识库文章建议。)
  • 使用IOCTL
  • 关于c++ - 用户模式和内核模式之间的共享内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32595915/

    10-12 20:37