2015-09-15 19 views
8

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(&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; 
} 

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 ZwCreateSectionZwMapViewOfSection 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(&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; 
} 

Tất cả mọi thứ không ...

+0

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

+0

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ó. –

+0

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' –

Trả lời

4

về CreateFileMapping:

Tạo một đối tượng tập tin bản đồ trong không gian tên toàn cầu từ một kỳ họp thứ khác một phiên không yêu cầu đặc quyền SeCreateGlobalPrivilege.

Từ KB191840:

[T] ông đối tượng luôn được ánh xạ trong không gian địa chỉ dùng (bên dưới 0x80000000) của một quá trình (bất kể đối tượng được tạo ra trong kernel mode hoặc chế độ người dùng) địa chỉ chỉ hợp lệ nếu nó được truy cập trong ngữ cảnh của tiến trình.

Các KB tiếp tục:

Phương pháp này không được khuyến khích và được sử dụng ít nhất bằng trình điều khiển thiết bị cấp thấp bởi vì, như đã giải thích ở trên, phạm vi của địa chỉ được giới hạn ở những quá trình trong đối tượng nào được ánh xạ và không thể truy cập đối tượng đó trong DPC hoặc ISR. [Mine Nhấn mạnh]

Việc sửa chữa là một trong hai:

  1. Tạo ánh xạ tập tin trong kernel mode. (Đề nghị bởi bài viết KB.)
  2. Sử dụng IOCTL
+0

Tôi đã cố gắng tạo bộ nhớ chia sẻ ở chế độ lõi, nhưng nó không thành công khi truy cập vào con trỏ dữ liệu. Tôi thử dùng IOCTL. –

+0

Bây giờ tôi hiểu chú thích của bạn (x64): đối tượng 'obj' được cấp phát trong trình điều khiển có địa chỉ này là' 0xffffe000d44ae510', trong khi con trỏ bộ nhớ chia sẻ 'pSM' ở đây tại' 0x000000e81bf20000'. Không thể truy cập địa chỉ 'pSM' từ' obj' trong mã hạt nhân. –

+0

Tôi tìm thấy mã mẫu [ở đây] (http://www.winvistatips.com/threads/how-to-share-a-section-between-driver-and-user-mode-application.192587/) mà tôi giả định nó đang hoạt động ... –

Các vấn đề liên quan