Общая память между режимом пользователя и режимом ядра

Я пишу некоторый код стороны ядра для Windows7 для доступа к общей памяти, созданной в пользовательском режиме, как предложено Вот.
Общая память создается в пространстве пользователя с именем:

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

Все не удается …

8

Решение

Что касается CreateFileMapping:

Создание объекта сопоставления файлов в глобальном пространстве имен из сеанса, отличного от нуля сеанса, требует SeCreateGlobalPrivilege привилегия.

От KB191840:

[T] он всегда отображается в адресном пространстве пользователя (ниже 0x80000000) процесса (независимо от того, создан ли объект в режиме ядра или режиме пользователя), адрес действителен, только если к нему обращаются в контексте процесса ,

КБ продолжается:

Этот метод не рекомендуется и меньше всего используется низкоуровневыми драйверами устройств, потому что, как объяснено ранее, область действия адреса ограничена процессом, в котором отображается объект, и к нему нельзя получить доступ в DPC или ISR. [Акцент на мой]

Исправление:

  1. Создайте отображение файлов в режиме ядра. (Предложено в статье КБ.)
  2. использование IOCTL
4

Другие решения


По вопросам рекламы [email protected]