ユーザモードで作成された共有メモリにアクセスするための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(§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;
}
すべてが失敗しました... CreateFileMappingに関する
が関連している可能性があり、私はこの私の名前のような何かをするたびに、 '「ローカル\\」や' '「グローバル\\」'のいずれかで始まり、あなたの名前の前に '' Local \\ "'を追加する必要があります。 – Serdalis
ファイルマッピングを作成するときは、おそらく 'Global \ MySharedMem'を使う必要があります。これをやったら、winobj(MSのWebサイトから入手可能)を使って、カーネルの名前空間を調べて見つけてください。 –
私はこれを 'Global \\ MySharedMemame'でユーザ空間に作成しようとしましたが、この場合は' STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003BL'というエラーが発生します –