Sto tentando di utilizzare VirtualAlloc per riservare e memorizzare un blocco di memoria e quindi di nuovo per estendere tale blocco. Sfortunatamente, restituisce NULL con errore ERROR_INVALID_ADDRESS nonostante VirtualQuery affermi che l'intervallo di indirizzi richiesto è libero. Ecco il mio codice:Errore VirtualAlloc
void* allocation = VirtualAlloc(NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
void* desiredNextAllocation = (char*)allocation + 4096;
MEMORY_BASIC_INFORMATION info;
size_t memory_info = VirtualQuery(desiredNextAllocation, &info, sizeof(info));
void* extended = VirtualAlloc(desiredNextAllocation, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
La prima allocazione restituisce 0x00000000000d0000. La chiamata ai risultati VirtualQuery nei seguenti dati in 'info':
BaseAddress 0x00000000000d1000 void *
AllocationBase 0x0000000000000000 void *
AllocationProtect 0x00000000 unsigned long
RegionSize 0x00000000000ff000 unsigned __int64
State 0x00010000 unsigned long
Protect 0x00000001 unsigned long
Type 0x00000000 unsigned long
ho interpretare che per significare che ci sono pagine disponibili 0xff inizio alle 0xd1000, che si trovano nello stato MEM_FREE. Allora perché il mio tentativo di impegnare la pagina su 0xd1000 fallisce?
Sono in esecuzione Windows 7 e questa è una build a 64 bit.
Ho letto diversi post StackOverflow su VirtualAlloc ma sembrano tutti implicare che questo codice dovrebbe funzionare come la mia comprensione della documentazione.