2015-09-15 152 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/)它正在工作...... –

相關問題