2015-09-15 103 views
8

ユーザモードで作成された共有メモリにアクセスするための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"として作成することはできません。

私は間違って何をしていますか?私は、カーネルモードでの共有メモリを作成しようとしました

、私はZwCreateSectionZwMapViewOfSectionに成功を得るが、私はバッファをテストするために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; 
} 

すべてが失敗しました... CreateFileMappingに関する

+0

が関連している可能性があり、私はこの私の名前のような何かをするたびに、 '「ローカル\\」や' '「グローバル\\」'のいずれかで始まり、あなたの名前の前に '' Local \\ "'を追加する必要があります。 – Serdalis

+0

ファイルマッピングを作成するときは、おそらく 'Global \ MySharedMem'を使う必要があります。これをやったら、winobj(MSのWebサイトから入手可能)を使っ​​て、カーネルの名前空間を調べて見つけてください。 –

+0

私はこれを 'Global \\ MySharedMemame'でユーザ空間に作成しようとしましたが、この場合は' STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003BL'というエラーが発生します –

答えて

4

:セッション他の目からグローバル名前空間にファイルマッピングオブジェクトを作成

セッションゼロにはSeCreateGlobalPrivilege特権が必要です。 KB191840から

[T]彼オブジェクトは常に(関わらず、オブジェクトがカーネル・モードまたはユーザ・モードで作成されているかどうかの)プロセスの(0x80000000の下)のユーザアドレス空間にマッピングされていますそのアドレスはプロセスのコンテキストでアクセスされる場合にのみ有効です。

キロバイトは継続:この方法は推奨されず、先に説明したように、アドレスの範囲はプロセスにおけるこれらに限定されているので、低レベルのデバイスドライバにより少なくとも使用さ

オブジェクトはマップされ、DPCまたはISRではアクセスできません。 [重点鉱山]

修正はどちらかである:

  1. は、カーネルモードでのファイル・マッピングを作成します。 (KBの記事で示唆された。)
  2. 使用IOCTL
+0

カーネルモードで共有メモリを作成しようとしましたが、データポインタにアクセスすると失敗します。私はIOCTLを試みます。 –

+0

私はあなたのコメント(x64)を理解しています:ドライバに割り当てられたオブジェクト 'obj'はこのアドレス' 0xffffe000d44ae510'を持ち、共有メモリポインタ 'pSM'は' 0x000000e81bf20000'にあります。 'pSM'アドレスはカーネルコードの' obj'からアクセスできません。 –

+0

私が仮定したサンプルコード[here](http://www.winvistatips.com/threads/how-to-share-a-section-between-driver-and-user-mode-application.192587/)が見つかりましたそれは働いていた... –

関連する問題