Condividi tramite


Funzione VirtualAllocFromApp (memoryapi.h)

Riserva, commit o modifica lo stato di un'area di pagine nello spazio degli indirizzi virtuali del processo chiamante. La memoria allocata da questa funzione viene inizializzata automaticamente su zero.

Sintassi

PVOID VirtualAllocFromApp(
  [in, optional] PVOID  BaseAddress,
  [in]           SIZE_T Size,
  [in]           ULONG  AllocationType,
  [in]           ULONG  Protection
);

Parametri

[in, optional] BaseAddress

Indirizzo iniziale dell'area da allocare. Se la memoria è riservata, l'indirizzo specificato viene arrotondato al multiplo più vicino della granularità di allocazione. Se la memoria è già riservata e viene eseguito il commit, l'indirizzo viene arrotondato al limite di pagina successivo. Per determinare le dimensioni di una pagina e la granularità di allocazione nel computer host, usare la funzione GetSystemInfo . Se questo parametro è NULL, il sistema determina dove allocare l'area.

[in] Size

Dimensioni dell'area, in byte. Se il parametro baseAddress è null, questo valore viene arrotondato fino al limite di pagina successivo. In caso contrario, le pagine allocate includono tutte le pagine contenenti uno o più byte nell'intervallo compreso tra baseAddress e BaseAddress+Dimensioni. Ciò significa che un intervallo di 2 byte che si allontana da un limite di pagina fa sì che entrambe le pagine vengano incluse nell'area allocata.

[in] AllocationType

Tipo di allocazione di memoria. Questo parametro deve contenere uno dei valori seguenti.

Valore Significato
MEM_COMMIT
0x00001000
Alloca i costi di memoria (dalle dimensioni complessive della memoria e dei file di paging su disco) per le pagine di memoria riservate specificate. La funzione garantisce anche che quando il chiamante accede inizialmente alla memoria, il contenuto sarà zero. Le pagine fisiche effettive non vengono allocate a meno che/fino a quando non si accede effettivamente agli indirizzi virtuali.

Per riservare ed eseguire il commit delle pagine in un unico passaggio, chiamare VirtualAllocFromApp con MEM_COMMIT | MEM_RESERVE.

Il tentativo di eseguire il commit di un intervallo di indirizzi specifico specificando MEM_COMMIT senza MEM_RESERVE e unNULLBaseAddress ha esito negativo a meno che l'intero intervallo non sia già stato riservato. Il codice di errore risultante è ERROR_INVALID_ADDRESS.

Un tentativo di eseguire il commit di una pagina già sottoposta a commit non causa l'esito negativo della funzione. Ciò significa che è possibile eseguire il commit delle pagine senza prima determinare lo stato di impegno corrente di ogni pagina.

MEM_RESERVE
0x00002000
Riserva un intervallo di spazio indirizzi virtuale del processo senza allocare alcuna risorsa di archiviazione fisica effettiva in memoria o nel file di paging su disco.

È possibile eseguire il commit di pagine riservate nelle chiamate successive alla funzione VirtualAllocFromApp. Per riservare ed eseguire il commit delle pagine in un unico passaggio, chiamare VirtualAllocFromApp con MEM_COMMIT | MEM_RESERVE.

Altre funzioni di allocazione della memoria, ad esempio malloc e LocalAlloc, non possono usare un intervallo di memoria riservato finché non viene rilasciato.

MEM_RESET
0x00080000
Indica che i dati nell'intervallo di memoria specificato da baseAddress e dimensioni non sono più di interesse. Le pagine non devono essere lette o scritte nel file di paging. Tuttavia, il blocco di memoria verrà usato di nuovo in un secondo momento, quindi non deve essere decommesso. Questo valore non può essere utilizzato con altri valori.

L'utilizzo di questo valore non garantisce che l'intervallo utilizzato con MEM_RESET contenga zeri. Se si desidera che l'intervallo contenga zeri, decommettere la memoria e quindi ricommetterla.

Quando si specifica MEM_RESET, la funzione VirtualAllocFromApp ignora il valore di Protection. Tuttavia, è comunque necessario impostare Protection su un valore di protezione valido, ad esempio PAGE_NOACCESS.

VirtualAllocFromApp restituisce un errore se si utilizza MEM_RESET e l'intervallo di memoria viene mappato a un file. Una visualizzazione condivisa è accettabile solo se è mappata a un file di paging.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO deve essere chiamato solo su un intervallo di indirizzi a cui MEM_RESET è stato applicato correttamente in precedenza. Indica che i dati nell'intervallo di memoria specificato da baseAddress e Size sono di interesse per il chiamante e tentano di invertire gli effetti di MEM_RESET. Se la funzione ha esito positivo, significa che tutti i dati nell'intervallo di indirizzi specificato sono intatti. Se la funzione ha esito negativo, almeno alcuni dei dati nell'intervallo di indirizzi sono stati sostituiti con zere.

Questo valore non può essere utilizzato con altri valori. Se MEM_RESET_UNDO viene chiamato su un intervallo di indirizzi non MEM_RESET precedente, il comportamento non è definito. Quando si specifica MEM_RESET, la funzione VirtualAllocFromApp ignora il valore di Protection. Tuttavia, è comunque necessario impostare Protection su un valore di protezione valido, ad esempio PAGE_NOACCESS.

 

Questo parametro può anche specificare i valori seguenti, come indicato.

Valore Significato
MEM_LARGE_PAGES
0x20000000
Alloca memoria usando supporto di pagine di grandi dimensioni.

Le dimensioni e l'allineamento devono essere un multiplo del minimo di pagina di grandi dimensioni. Per ottenere questo valore, usare la funzione GetLargePageMinimum.

Se si specifica questo valore, è necessario specificare anche MEM_RESERVE e MEM_COMMIT.

MEM_PHYSICAL
0x00400000
Riserva un intervallo di indirizzi che può essere utilizzato per eseguire il mapping pagine delle estensioni di finestra degli indirizzi (AWE).

Questo valore deve essere usato con MEM_RESERVE e nessun altro valore.

MEM_TOP_DOWN
0x00100000
Alloca la memoria al più alto indirizzo possibile. Questo può essere più lento rispetto alle allocazioni regolari, soprattutto quando sono presenti molte allocazioni.
MEM_WRITE_WATCH
0x00200000
Fa sì che il sistema rintraccia le pagine scritte nell'area allocata. Se si specifica questo valore, è necessario specificare anche MEM_RESERVE.

Per recuperare gli indirizzi delle pagine scritte in dopo l'allocazione dell'area o la reimpostazione dello stato di rilevamento delle scritture, chiamare la funzione GetWriteWatch. Per reimpostare lo stato di rilevamento della scrittura, chiamare GetWriteWatch o ResetWriteWatch. La funzionalità di rilevamento delle scritture rimane abilitata per l'area di memoria fino a quando l'area non viene liberata.

[in] Protection

Protezione della memoria per l'area delle pagine da allocare. Se viene eseguito il commit delle pagine, è possibile specificare una delle costanti di protezione della memoria . Le costanti seguenti generano un errore:

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

Valore restituito

Se la funzione ha esito positivo, il valore restituito è l'indirizzo di base dell'area allocata delle pagine.

Se la funzione ha esito negativo, il valore restituito è NULL. Per ottenere informazioni estese sull'errore, chiamare GetLastError.

Osservazioni

Puoi chiamare VirtualAllocFromApp dalle app di Windows Store con funzionalità JIT (Just-In-Time) per usare la funzionalità JIT. L'app deve includere la funzionalità codeGeneration nel file manifesto dell'app per usare le funzionalità JIT.

Ogni pagina ha uno stato di pagina associato. La funzione VirtualAllocFromApp può eseguire le operazioni seguenti:

  • Eseguire il commit di un'area di pagine riservate
  • Riservare un'area di pagine gratuite
  • Riservare ed eseguire il commit simultaneo di un'area di pagine gratuite
VirtualAllocFromApp non può riservare una pagina riservata. Può eseguire il commit di una pagina già sottoposta a commit. Ciò significa che è possibile eseguire il commit di un intervallo di pagine, indipendentemente dal fatto che sia già stato eseguito il commit e che la funzione non abbia esito negativo.

È possibile usare VirtualAllocFromApp per riservare un blocco di pagine e quindi effettuare altre chiamate a VirtualAllocFromApp per eseguire il commit di singole pagine dal blocco riservato. Ciò consente a un processo di riservare un intervallo di spazio indirizzi virtuale senza consumare spazio di archiviazione fisico fino a quando non è necessario.

Se il parametro baseAddress non è null, la funzione usa il BaseAddress e i parametri Size per calcolare l'area delle pagine da allocare. Lo stato corrente dell'intero intervallo di pagine deve essere compatibile con il tipo di allocazione specificato dal parametro allocationType . In caso contrario, la funzione ha esito negativo e nessuna delle pagine viene allocata. Questo requisito di compatibilità non impedisce il commit di una pagina già sottoposta a commit, come indicato in precedenza.

VirtualAllocFromApp non consente la creazione di pagine eseguibili.

La funzione VirtualAllocFromApp può essere usata per riservare un'area di Address Windowing Extensions (AWE) di memoria all'interno dello spazio indirizzi virtuale di un processo specificato. Questa area di memoria può quindi essere usata per eseguire il mapping delle pagine fisiche all'interno e all'esterno della memoria virtuale in base alle esigenze dell'applicazione. I valori MEM_PHYSICAL e MEM_RESERVE devono essere impostati nel parametro AllocationType . Il valore MEM_COMMIT non deve essere impostato. La protezione della pagina deve essere impostata su PAGE_READWRITE.

La funzione VirtualFree può decommettere una pagina di cui è stato eseguito il commit, rilasciare lo spazio di archiviazione della pagina oppure decommettere e rilasciare simultaneamente una pagina di cui è stato eseguito il commit. Può anche rilasciare una pagina riservata, rendendola una pagina gratuita.

Quando si crea un'area eseguibile, il programma chiamante è responsabile della coerenza della cache tramite una chiamata appropriata a FlushInstructionCache una volta impostato il codice. In caso contrario, i tentativi di eseguire codice dall'area appena eseguibile possono produrre risultati imprevedibili.

Fabbisogno

Requisito Valore
client minimo supportato Windows 10 [app desktop | App UWP]
server minimo supportato Windows Server 2016 [app desktop | App UWP]
piattaforma di destinazione Finestre
intestazione memoryapi.h (include Windows.h)
libreria WindowsApp.lib
dll Kernel32.dll

Vedere anche

funzioni di gestione della memoria

funzioni di memoria virtuale

VirtualAlloc

VirtualAllocEx

VirtualFree

VirtualLock

VirtualProtectFromApp

VirtualQuery