我正在爲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(§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
。
另外創建共享內存爲"Global\\MySharedMem"
不起作用。
我在做什麼錯?
我試圖創建在內核模式下的共享內存,我得到ZwCreateSection
和ZwMapViewOfSection
成功,但我得到訪問衝突,當我訪問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(§ionName,stringBuffer);
InitializeObjectAttributes(&objectAttributes,§ionName,Attributes,NULL,NULL);
status= ZwCreateSection(§ionHandle_,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;
}
都失敗...
可能是相關的,每次我做這樣的事情我的名字開始是'「本地\\」'或'「環球\\」'你可能需要追加'「Local \\」'到你名字的前面。 – Serdalis
創建文件映射時,您大概需要使用'Global \ MySharedMem'。一旦你這樣做了,使用'winobj'(可從MS網站獲得)查看內核命名空間並找到它。 –
我試着用'Global \\ MySharedMemame'在用戶空間創建共享內存,但是在這種情況下,我得到'STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003BL'錯誤' –