Condividi tramite


Funzione ZwAllocateVirtualMemory (ntifs.h)

La routine ZwAllocateVirtualMemory riserva, commit o entrambi, 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. Usare la macro NtCurrentProcess , definita in Ntddk.h, per specificare il processo corrente.

[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 è diverso da NULL, l'area viene allocata a partire dall'indirizzo virtuale specificato arrotondato al limite di indirizzi della pagina host successivo. Se il valore iniziale di questo parametro è NULL, il sistema operativo determinerà dove allocare l'area.

[in] ZeroBits

Numero di bit di indirizzi ad ordine elevato che devono essere 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 di 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 successivo. *RegionSize non può essere zero sull'input.

[in] AllocationType

Maschera di bit contenente flag che specificano il tipo di allocazione da eseguire. La tabella seguente descrive questi flag.

Contrassegno Significato
MEM_COMMIT L'area specificata delle pagine deve essere eseguito il commit. È necessario impostare uno dei MEM_COMMIT, MEM_RESET o MEM_RESERVE.
MEM_PHYSICAL Allocare memoria fisica. Questo flag è usato esclusivamente con la memoria AWE (Address Windowing Extensions). Se MEM_PHYSICAL è impostato, è 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 uno dei 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 zero. 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 è zero. Il parametro Protect non viene usato, ma deve essere impostato su un valore valido. È necessario impostare uno dei MEM_COMMIT, MEM_RESET o MEM_RESERVE; se MEM_RESET è impostato, non è possibile impostare alcun altro flag.
MEM_TOP_DOWN L'area specificata deve essere creata all'indirizzo virtuale più alto possibile in base a ZeroBits.

[in] Protect

Maschera di bit contenente flag di protezione pagina che specificano la protezione desiderata per l'area di commit delle pagine. La tabella seguente descrive questi flag.

Contrassegno Significato
PAGE_NOACCESS Non è consentito l'accesso all'area di commit delle pagine. Un tentativo di lettura, scrittura o esecuzione dell'area di commit genera un'eccezione di violazione di accesso, denominata errore generale di protezione (GP).
PAGE_READONLY È consentito l'accesso di sola lettura ed esecuzione all'area di commit delle pagine. Un tentativo di scrittura dell'area di commit comporta una violazione di accesso.
PAGE_READWRITE È consentito leggere, scrivere ed eseguire l'accesso all'area di 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 l'accesso all'area di commit delle pagine. Un tentativo di lettura o scrittura nell'area di commit comporta una violazione di accesso.
PAGE_EXECUTE_READ L'esecuzione e l'accesso in lettura all'area di commit delle pagine sono consentiti. Un tentativo di scrittura nell'area di commit comporta una violazione di accesso.
PAGE_EXECUTE_READWRITE È consentito eseguire, leggere e scrivere l'accesso all'area di commit delle pagine.
PAGE_GUARD Le pagine nell'area diventano pagine guardie. Qualsiasi tentativo di lettura o scrittura in una pagina di protezione causa l'aumento di un'eccezione STATUS_GUARD_PAGE. Le pagine guardino quindi fungono da allarme di accesso uno colpo. Questo flag è un modificatore di protezione pagina, valido solo quando 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 guard, la protezione della pagina sottostante assume il ruolo. Se si verifica un'eccezione di pagina guard 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 utilizzabile. PAGE_NOCACHE non è consentito per le sezioni.
PAGE_WRITECOMBINE Consente la combinazione di scrittura, ovvero la fusione delle scritture dalla cache alla memoria principale, in cui l'hardware lo supporta. Questo flag viene usato principalmente per la memoria del buffer frame in modo che le scritture nella stessa riga della cache vengano combinate se possibile prima di essere scritte nel dispositivo. Ciò può ridurre notevolmente le scritture nel bus in (ad esempio) memoria video. Se l'hardware non supporta la combinazione di scrittura, il flag viene ignorato. Questo flag è un modificatore di protezione pagina, valido solo quando 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 degli errori possibili includono quanto segue:

Commenti

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 e eseguire il commit di un'area di pagine gratuite.

I driver in modalità kernel possono usare ZwAllocateVirtualMemory per riservare un intervallo 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 dello spazio indirizzi virtuale senza usare l'archiviazione fisica fino a quando non è necessario.

Ogni pagina nello spazio indirizzi virtuale del processo si trova in uno dei tre stati descritti nella tabella seguente.

State Significato
FREE La pagina non è sottoposta a commit o riservata e non è accessibile al processo. ZwAllocateVirtualMemory può riservare, o contemporaneamente riservare e eseguire il commit, 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 ha alcuna risorsa di archiviazione fisica associata. ZwAllocateVirtualMemory può eseguire il commit di una pagina riservata, ma non può riservarlo una seconda volta. ZwFreeVirtualMemory può rilasciare una pagina riservata, rendendola una pagina gratuita.
IMPEGNATI L'archiviazione fisica viene allocata per la pagina e l'accesso è controllato da un codice di protezione. Il sistema inizializza e carica ogni pagina di commit in memoria fisica solo al primo tentativo di lettura o scrittura in tale pagina. Al termine del processo, il sistema rilascia l'archiviazione per le pagine di commit. ZwAllocateVirtualMemory può eseguire il commit di una pagina già commit. Ciò significa che è possibile eseguire il commit di un intervallo di pagine, indipendentemente dal fatto che siano già stati sottoposti a commit e che la funzione non avrà esito negativo. ZwFreeVirtualMemory può decommettere una pagina di commit, rilasciare l'archiviazione della pagina o rilasciare contemporaneamente una pagina di 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 di Windows.

Nota

Se la chiamata alla funzione ZwAllocateVirtualMemory si verifica in modalità utente, è necessario usare il nome "NtAllocateVirtualMemory" anziché "ZwAllocateVirtualMemory".

Per le chiamate dai driver in modalità kernel, le versioni NtXxx e ZwXxx 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 Uso di nt e zw versioni delle routine di Servizi di sistema nativo.

Requisiti

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 HwStorPortProhibitedDDDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

Vedi anche

Uso di nt e zw versioni delle routine di Servizi di sistema nativo

ZwFreeVirtualMemory