我正在为Windows7编写一些内核端代码,以访问在用户模式下创建的共享内存,如建议的 这里 。
共享内存是在具有名称的用户空间中创建的:
"MySharedMem"
在用户空间中打开共享内存是可行的。
在内核模式下打开相同的共享内存,调用 ZwOpenSection 失败,返回:
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(§ionName,stringBuffer); OBJECT_ATTRIBUTES myAttributes; InitializeObjectAttributes(&myAttributes,§ionName,0,NULL,NULL); NTSTATUS status0 = ZwOpenSection(§ionHandle_,SECTION_MAP_READ|SECTION_MAP_WRITE,&myAttributes); NTSTATUS status = ZwMapViewOfSection(§ionHandle_, ZwCurrentProcess(), (PVOID *)&pSharedData_, 0, 0, NULL, &vs, ViewShare, 0, PAGE_READWRITE); return status; }
我尝试了几个名称( L"\\MySharedMem" 或 L"MySharedMem" ),但我得到了其他错误,如 STATUS_OBJECT_PATH_INVALID 或 STATUS_OBJECT_PATH_NOT_FOUND 。
L"\\MySharedMem"
L"MySharedMem"
STATUS_OBJECT_PATH_INVALID
STATUS_OBJECT_PATH_NOT_FOUND
另外,由于 "Global\\MySharedMem" 不能工作,所以创建共享内存。
"Global\\MySharedMem"
我做错了什么?
我试图在内核模式下创建共享内存,我在 ZwCreateSection 和 ZwMapViewOfSection 上获得了成功,但是当我访问pSharedData_指针来测试缓冲区时,我得到了访问冲突:
ZwCreateSection
ZwMapViewOfSection
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(§ionName,stringBuffer); InitializeObjectAttributes(&objectAttributes,§ionName,Attributes,NULL,NULL); status= ZwCreateSection(§ionHandle_,SECTION_ALL_ACCESS,&objectAttributes,&MaxSize,PAGE_READWRITE,SEC_COMMIT,NULL);