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(§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;
}
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(§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;
}
Tutto fallisce ...
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
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. –
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' –