2015-09-15 114 views
8

我正在为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; 
} 

都失败...

+0

可能是相关的,每次我做这样的事情我的名字开始是'“本地\\”'或'“环球\\”'你可能需要追加'“Local \\”'到你名字的前面。 – Serdalis

+0

创建文件映射时,您大概需要使用'Global \ MySharedMem'。一旦你这样做了,使用'winobj'(可从MS网站获得)查看内核命名空间并找到它。 –

+0

我试着用'Global \\ MySharedMemame'在用户空间创建共享内存,但是在这种情况下,我得到'STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003BL'错误' –

回答

4

关于CreateFileMapping

从会话其他日创建全局命名空间文件映射对象会话零需要SeCreateGlobalPrivilege特权。

KB191840

[T]他对象总是在一个进程的用户地址空间(下面为0x80000000)映射(不管对象是否在内核模式或用户模式创建的)只有在过程的上下文中访问该地址,该地址才有效。

的KB继续:

不建议并且通过低级别的设备驱动程序,因为,如前面所解释的,该地址的范围仅限于该方法中使用至少该方法该对象被映射,并且它不能在DPC或ISR中访问。 [重点矿山]

的修复程序可以是:

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

我试图在内核模式下创建共享内存,但访问数据指针时失败。我将尝试IOCTL。 –

+0

现在我明白你的评论(x64):在驱动程序中分配的对象'obj'具有这个地址0xffffe000d44ae510,而共享存储器指针'pSM'在'0x000000e81bf20000'。在内核代码中,'p​​SM'地址不能从'obj'访问。 –

+0

我找到了我假设的示例代码[here](http://www.winvistatips.com/threads/how-to-share-a-section-between-driver-and-user-mode-application.192587/)它正在工作...... –

相关问题