Tôi đang viết một số mã phía hạt nhân cho Windows7 để truy cập bộ nhớ dùng chung được tạo trong chế độ người dùng, như được đề xuất here.
Bộ nhớ chia sẻ được tạo ra trong không gian người dùng với tên:Bộ nhớ chia sẻ giữa chế độ người dùng và chế độ hạt nhân
"MySharedMem"
Mở bộ nhớ chia sẻ trong công trình không gian sử dụng.
Mở cùng chia sẻ bộ nhớ trong chế độ kernel gọi ZwOpenSection
vẫn thất bại trở về:
#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)
Mã hạt nhân là:
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;
}
Tôi đã thử nhiều tên (L"\\MySharedMem"
hoặc L"MySharedMem"
) nhưng tôi đã nhận lỗi khác như STATUS_OBJECT_PATH_INVALID
hoặc STATUS_OBJECT_PATH_NOT_FOUND
.
Đồng thời tạo bộ nhớ dùng chung là "Global\\MySharedMem"
không hoạt động.
Tôi đang làm gì sai?
tôi đã cố gắng để tạo ra các bộ nhớ chia sẻ trong kernel mode, tôi nhận được thành công trên ZwCreateSection
và ZwMapViewOfSection
nhưng tôi nhận được vi phạm truy cập khi tôi truy cập vào con trỏ pSharedData_ để kiểm tra bộ đệm:
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;
}
Tất cả mọi thứ không ...
Có thể liên quan, Mỗi lần tôi làm điều gì đó như thế này tên của tôi bắt đầu với một trong hai ' "Local \\"' hoặc ' "Global \\"', bạn có thể cần phải thêm '" Local \\ "' vào trước tên của bạn. – Serdalis
Bạn có lẽ sẽ cần sử dụng 'Global \ MySharedMem' khi tạo ánh xạ tệp. Một khi bạn đã làm điều đó, sử dụng 'winobj' (có sẵn từ trang web MS) để xem qua vùng tên kernel và tìm nó. –
Tôi đã cố gắng tạo bộ nhớ dùng chung trong không gian người dùng với 'Global \\ MySharedMemame' nhưng trong trường hợp này tôi gặp lỗi' STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003BL' –