Mi sono imbattuto in questa situazione con la funzione MapViewOfFile
di WinAPI. Una ricerca su Internet non ha evidenziato alcuna correzione apparente, quindi condividerò qui il mio problema e la mia soluzione.Perché MapViewOfFile non riesce con ERROR_ACCESS_DENIED?
Si consideri il seguente frammento di codice:
const char *name = "Global\\Object_Name";
unsigned long size = get_object_size();
HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
size,
name);
if (!handle || handle == INVALID_HANDLE_VALUE)
exit(GetLastError());
bool created = GetLastError() == 0;
void *block = MapViewOfFile(handle,
FILE_MAP_ALL_ACCESS,
0,
0,
size);
if (block == NULL)
exit(GetLastError());
In un caso particolare, CreateFileMapping
stava tornando con successo una maniglia. GetLastError
restituiva ERROR_ALREADY_EXISTS
, quindi created == false
. Ora, la chiamata a MapViewOfFile
, utilizzando la stessa dimensione che ho passato a CreateFileMapping
, restituisce NULL
e GetLastError
restituisce 0x05
: ERROR_ACCESS_DENIED
. Il processo era in esecuzione con i privilegi di amministratore.
La documentazione MSDN non indica in realtà alcun motivo per cui si verificherebbe questa situazione. Quindi, perché CreateFileMapping
ha esito positivo, ma MapViewOfFile
non riesce?