2015-09-15 14 views
8

Sto scrivendo un codice lato kernel per Windows7 per accedere alla memoria condivisa creata in modalità utente, come suggerito here.
La memoria condivisa è creato nello spazio utente con il nome:Memoria condivisa tra modalità utente e modalità kernel

"MySharedMem" 

Apertura della memoria condivisa in opere spazio utente.
Apertura della stessa memoria condivisa in modalità kernel chiamando ZwOpenSection fallisce tornando:

#define STATUS_OBJECT_NAME_NOT_FOUND  ((NTSTATUS)0xC0000034L) 

Il codice del kernel è:

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

Ho provato diversi nomi (L"\\MySharedMem" o L"MySharedMem") ma ho avuto altri errori come STATUS_OBJECT_PATH_INVALID oppure STATUS_OBJECT_PATH_NOT_FOUND.
Anche la creazione della memoria condivisa come "Global\\MySharedMem" non funziona.

Cosa sto sbagliando?

ho cercato di creare la memoria condivisa in modalità kernel, ottengo successo su ZwCreateSection e ZwMapViewOfSection ma ottengo violazione di accesso quando accedo il puntatore pSharedData_ per testare il buffer:

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

Tutto fallisce ...

+0

possono essere connesse, ogni volta che faccio qualcosa di simile miei nomi iniziano con uno ' "locale \\"' 'o "Global \\"', potrebbe essere necessario aggiungere "Local" nella parte anteriore dei nomi. – Serdalis

+0

Probabilmente dovresti usare 'Global \ MySharedMem' quando crei il mapping dei file. Una volta fatto ciò, usa 'winobj' (disponibile dal sito Web di MS) per guardare attraverso lo spazio dei nomi del kernel e trovarlo. –

+0

Ho provato questo creare la memoria condivisa nello spazio utente con 'globali \\ MySharedMemame' ma in questo caso ho l'errore' STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003BL' –

risposta

4

per quanto riguarda CreateFileMapping:

Creazione di un oggetto di file di mapping nel namespace globale da una sessione di altri esimo una sessione zero richiede il privilegio SeCreateGlobalPrivilege.

Da KB191840:

[T] egli scopo viene sempre mappato nello spazio di indirizzi utente (sotto 0x80000000) di un processo (indipendentemente dal fatto che l'oggetto viene creato in modalità kernel o modalità utente) l'indirizzo è valido solo se è accessibile nel contesto del processo.

Il KB continua:

Questo metodo non è consigliato e viene utilizzato almeno dai driver di basso livello perché, come spiegato in precedenza, l'ambito dell'indirizzo è limitato al processo quale oggetto è mappato e non è possibile accedervi in ​​un DPC o ISR. [Sottolineatura mia]

La correzione è o:

  1. Creare il mapping dei file in modalità kernel. (Suggerito da l'articolo KB.)
  2. Usa IOCTL
+0

Ho cercato di creare la memoria condivisa in modalità kernel, ma viene a mancare quando si accede al puntatore di dati. Proverò IOCTL. –

+0

Ora capisco il tuo commento (x64): l'oggetto 'obj' allocato nel driver ha questo indirizzo' 0xffffe000d44ae510', mentre il puntatore di memoria condivisa 'pSM' è qui a' 0x000000e81bf20000'. 'Indirizzo pSM' non è possibile accedere da' obj' nel codice del kernel. –

+0

Ho trovato il codice di esempio [qui] (http://www.winvistatips.com/threads/how-to-share-a-section-between-driver-and-user-mode-application.192587/) che ho assunto stava funzionando ... –

Problemi correlati