Funzione ZwAllocateVirtualMemory (ntifs.h)
Il ZwAllocateVirtualMemory riserve di routine, commit o entrambe, un'area di pagine all'interno dello spazio indirizzi virtuale in modalità utente di un processo specificato.
Sintassi
NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in] ULONG_PTR ZeroBits,
[in, out] PSIZE_T RegionSize,
[in] ULONG AllocationType,
[in] ULONG Protect
);
Parametri
[in] ProcessHandle
Handle per il processo per il quale deve essere eseguito il mapping. Utilizzare la macro NtCurrentProcess
[in, out] BaseAddress
Puntatore a una variabile che riceverà l'indirizzo di base dell'area allocata delle pagine. Se il valore iniziale di questo parametro non èNULL, l'area viene allocata a partire dall'indirizzo virtuale specificato arrotondato per difetto al limite dell'indirizzo della pagina host successiva. Se il valore iniziale di questo parametro è NULL, il sistema operativo determinerà dove allocare l'area.
[in] ZeroBits
Numero di bit di indirizzi di ordine elevato che devono essere pari a zero nell'indirizzo di base della visualizzazione sezione. Questo valore deve essere minore di 21 e viene usato solo quando il sistema operativo determina dove allocare l'area, come quando baseAddress è NULL.
[in, out] RegionSize
Puntatore a una variabile che riceverà le dimensioni effettive, in byte, dell'area allocata delle pagine. Il valore iniziale di questo parametro specifica le dimensioni, in byte, dell'area e viene arrotondato fino al limite delle dimensioni della pagina host successiva. * RegionSize non può essere uguale a zero all'input.
[in] AllocationType
Maschera di bit contenente flag che specificano il tipo di allocazione da eseguire. Nella tabella seguente vengono descritti questi flag.
Bandiera | Significato |
---|---|
MEM_COMMIT | È necessario eseguire il commit dell'area di pagine specificata. È necessario impostare una delle MEM_COMMIT, MEM_RESET o MEM_RESERVE. |
MEM_PHYSICAL | Allocare memoria fisica. Questo flag viene usato esclusivamente con la memoria AWE (Address Windowing Extensions). Se è impostata MEM_PHYSICAL, è necessario impostare anche MEM_RESERVE, non è possibile impostare altri flag e Proteggere deve essere impostato su PAGE_READWRITE. |
MEM_RESERVE | L'area specificata delle pagine deve essere riservata. È necessario impostare una delle MEM_COMMIT, MEM_RESET o MEM_RESERVE. |
MEM_RESET | Reimpostare lo stato dell'area specificata in modo che, se le pagine si trovano nel file di paging, vengono rimosse e vengono visualizzate pagine di zeri. Se le pagine sono in memoria e modificate, vengono contrassegnate come non modificate in modo che non vengano scritte nel file di paging. Il contenuto non viene azzerato. Il parametro Protect non viene usato, ma deve essere impostato su un valore valido. È necessario impostare una delle MEM_COMMIT, MEM_RESET o MEM_RESERVE; se MEM_RESET è impostato, non è possibile impostare altri flag. |
MEM_TOP_DOWN | L'area specificata deve essere creata con l'indirizzo virtuale più alto possibile in base ZeroBits. |
[in] Protect
Maschera di bit contenente flag di protezione della pagina che specificano la protezione desiderata per l'area di cui è stato eseguito il commit delle pagine. Nella tabella seguente vengono descritti questi flag.
Bandiera | Significato |
---|---|
PAGE_NOACCESS | Non è consentito l'accesso all'area di cui è stato eseguito il commit delle pagine. Un tentativo di leggere, scrivere o eseguire l'area di cui è stato eseguito il commit genera un'eccezione di violazione di accesso, denominata errore di protezione generale (GP). |
PAGE_READONLY | È consentito l'accesso in sola lettura ed esecuzione all'area di cui è stato eseguito il commit delle pagine. Un tentativo di scrittura dell'area di cui è stato eseguito il commit comporta una violazione di accesso. |
PAGE_READWRITE | È consentito l'accesso in lettura, scrittura ed esecuzione all'area di cui è stato eseguito il commit delle pagine. Se è consentito l'accesso in scrittura alla sezione sottostante, viene condivisa una singola copia delle pagine. In caso contrario, le pagine vengono condivise di sola lettura/copia in scrittura. |
PAGE_EXECUTE | È consentito eseguire l'accesso all'area di cui è stato eseguito il commit delle pagine. Un tentativo di lettura o scrittura nell'area di cui è stato eseguito il commit comporta una violazione di accesso. |
PAGE_EXECUTE_READ | È consentito eseguire e leggere l'accesso all'area di cui è stato eseguito il commit delle pagine. Un tentativo di scrittura nell'area di cui è stato eseguito il commit comporta una violazione di accesso. |
PAGE_EXECUTE_READWRITE | Sono consentiti l'accesso in esecuzione, lettura e scrittura all'area di cui è stato eseguito il commit delle pagine. |
PAGE_GUARD | Le pagine nell'area diventano pagine sorvegliate. Qualsiasi tentativo di leggere o scrivere in una pagina di protezione fa sì che il sistema generi un'eccezione STATUS_GUARD_PAGE. Le pagine di guardia fungono quindi da allarme di accesso singolo. Questo flag è un modificatore di protezione della pagina, valido solo se usato con uno dei flag di protezione della pagina diversi da PAGE_NOACCESS. Quando un tentativo di accesso porta il sistema a disattivare lo stato della pagina di protezione, la protezione della pagina sottostante assume il controllo. Se si verifica un'eccezione di pagina di protezione durante un servizio di sistema, il servizio restituisce in genere un indicatore di stato di errore. |
PAGE_NOCACHE | L'area delle pagine deve essere allocata come non disponibile. PAGE_NOCACHE non è consentito per le sezioni. |
PAGE_WRITECOMBINE | Abilita la combinazione di scrittura, ovvero l'unione delle scritture dalla cache alla memoria principale, in cui l'hardware lo supporta. Questo flag viene usato principalmente per la memoria del buffer di frame, in modo che le scritture nella stessa riga della cache vengano combinate laddove possibile prima di essere scritte nel dispositivo. Ciò può ridurre notevolmente le scritture nel bus nella memoria video (ad esempio). Se l'hardware non supporta la combinazione di scrittura, il flag viene ignorato. Questo flag è un modificatore di protezione della pagina, valido solo se usato con uno dei flag di protezione della pagina diversi da PAGE_NOACCESS. |
Valore restituito
ZwAllocateVirtualMemory restituisce STATUS_SUCCESS o un codice di stato di errore. I codici di stato di errore possibili includono quanto segue:
Osservazioni
ZwAllocateVirtualMemory può eseguire le operazioni seguenti:
Eseguire il commit di un'area di pagine riservate da una chiamata precedente a ZwAllocateVirtualMemory.
Riservare un'area di pagine gratuite.
Riservare ed eseguire il commit di un'area di pagine gratuite.
I driver in modalità kernel possono usare ZwAllocateVirtualMemory per riservare una serie di indirizzi virtuali accessibili dall'applicazione nel processo specificato e quindi effettuare chiamate aggiuntive a ZwAllocateVirtualMemory per eseguire il commit di singole pagine dall'intervallo 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.
Ogni pagina nello spazio indirizzi virtuale del processo si trova in uno dei tre stati descritti nella tabella seguente.
Stato | Significato |
---|---|
GRATUITO | La pagina non è sottoposta a commit o riservata e non è accessibile al processo. ZwAllocateVirtualMemory può riservare o riservare e confermare simultaneamente una pagina gratuita. |
RISERVATO | L'intervallo di indirizzi non può essere usato da altre funzioni di allocazione, ma la pagina non è accessibile al processo e non dispone di alcuna risorsa di archiviazione fisica associata. ZwAllocateVirtualMemory può eseguire il commit di una pagina riservata, ma non può riservarla una seconda volta. ZwFreeVirtualMemory può rilasciare una pagina riservata, rendendola una pagina gratuita. |
IMPEGNATO | L'archiviazione fisica viene allocata per la pagina e l'accesso viene controllato da un codice di protezione. Il sistema inizializza e carica ogni pagina sottoposta a commit in memoria fisica solo al primo tentativo di lettura o scrittura in tale pagina. Al termine del processo, il sistema rilascia la risorsa di archiviazione per le pagine di cui è stato eseguito il commit. ZwAllocateVirtualMemory 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. ZwFreeVirtualMemory può rimuovere il commit di una pagina di cui è stato eseguito il commit, rilasciare lo spazio di archiviazione della pagina o rilasciare contemporaneamente una pagina di cui è stato eseguito il commit. |
La memoria allocata chiamando ZwAllocateVirtualMemory deve essere liberata chiamando ZwFreeVirtualMemory.
Per altre informazioni sulla gestione della memoria, vedere Gestione della memoria per i driver windows.
Nota
Se la chiamata alla funzione
Per le chiamate da driver in modalità kernel, le NtXxx e ZwXxx versioni di una routine di Windows Native System Services possono comportarsi in modo diverso nel modo in cui gestiscono e interpretano i parametri di input. Per altre informazioni sulla relazione tra le versioni NtXxx e ZwXxx di una routine, vedere Using Nt and Zw Versions of the Native System Services Routines.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows 2000 |
piattaforma di destinazione | Universale |
intestazione |
ntifs.h (include Ntifs.h) |
libreria |
NtosKrnl.lib |
dll | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
regole di conformità DDI | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport) |
Vedere anche
uso di versioni Nt e Zw delle routine di Servizi di sistema nativi