Share via


Funzione NtAllocateVirtualMemory (ntifs.h)

La routine NtAllocateVirtualMemory riserva, esegue commit o entrambe, un'area di pagine all'interno dello spazio indirizzi virtuale in modalità utente di un processo specificato.

Sintassi

__kernel_entry NTSYSCALLAPI NTSTATUS NtAllocateVirtualMemory(
  [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 , 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 BaseAddress è diverso da 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 BaseAddress è NULL, il sistema operativo determinerà dove allocare l'area.

[in] ZeroBits

Numero di bit di indirizzi di ordine elevato che devono essere zero nell'indirizzo di base della visualizzazione sezione. Usato solo quando il sistema operativo determina dove allocare l'area, come quando BaseAddress* è NULL. Si noti che quando ZeroBits è maggiore di 32, diventa una maschera di bit.

[in, out] RegionSize

Puntatore a una variabile che riceverà le dimensioni effettive, in byte, dell'area allocata delle pagine. Il valore iniziale di RegionSize specifica le dimensioni, in byte, dell'area e viene arrotondato fino al limite delle dimensioni della pagina host successiva. RegionSize non può essere zero all'input.

[in] AllocationType

Maschera di bit contenente flag che specificano il tipo di allocazione da eseguire per l'area di pagine specificata. Nella tabella seguente vengono descritti i flag più comuni. Per un elenco completo dei flag e delle descrizioni possibili, vedere VirtualAlloc .

Nota

È necessario impostare uno dei MEM_COMMIT, MEM_RESET o MEM_RESERVE.

Contrassegno Significato
MEM_COMMIT L'area specificata delle pagine deve essere sottoposta a commit.
MEM_RESERVE L'area specificata delle pagine deve essere riservata.
MEM_RESET Reimpostare lo stato dell'area specificata in modo che, se le pagine si trovano nel file di paging, vengono eliminate e vengono immesse 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 è zero. Il parametro Protect non viene usato, ma deve essere impostato su un valore valido. Se MEM_RESET è impostato, non è possibile impostare alcun altro flag.
Altri flag MEM_XXX Vedere VirtualAlloc.

[in] Protect

Maschera di bit contenente i flag di protezione delle pagine che specificano la protezione desiderata per l'area di pagine di cui è stato eseguito il commit. Nella tabella seguente vengono descritti questi flag.

Contrassegno Significato
PAGE_NOACCESS Non è consentito l'accesso all'area di cui è stato eseguito il commit delle pagine. Un tentativo di lettura, scrittura o esecuzione dell'area di cui è stato eseguito il commit genera un'eccezione di violazione di accesso, denominata errore di protezione generale .An attempt to read, write, or execute the committed region results in an access violation exception, called a general protection (GP) fault.
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 in 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 genera una violazione di accesso.
PAGE_EXECUTE_READ L'accesso in esecuzione e in lettura all'area di cui è stato eseguito il commit delle pagine è consentito. Un tentativo di scrittura nell'area di cui è stato eseguito il commit comporta una violazione di accesso.
PAGE_GUARD Le pagine nell'area diventano pagine sorvegliate. Qualsiasi tentativo di lettura o scrittura in una pagina di protezione fa sì che il sistema generi un'eccezione STATUS_GUARD_PAGE. Le pagine sorvegliate fungono quindi da allarme di accesso monorigine. 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 della 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 modificabile. PAGE_NOCACHE non è consentito per le sezioni.
PAGE_WRITECOMBINE Abilita la combinazione di scrittura, ovvero l'unione di scritture dalla cache alla memoria principale, in cui l'hardware lo supporta. Questo flag viene usato principalmente per la memoria del buffer dei fotogrammi 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

NtAllocateVirtualMemory restituisce STATUS_SUCCESS o un codice di stato di errore. I codici di stato di errore possibili includono quanto segue:

  • STATUS_ACCESS_DENIED
  • STATUS_ALREADY_COMMITTED
  • STATUS_COMMITMENT_LIMIT
  • STATUS_CONFLICTING_ADDRESSES
  • STATUS_INSUFFICIENT_RESOURCES
  • STATUS_INVALID_HANDLE
  • STATUS_INVALID_PAGE_PROTECTION
  • STATUS_NO_MEMORY
  • STATUS_OBJECT_TYPE_MISMATCH
  • STATUS_PROCESS_IS_TERMINATING

Commenti

NtAllocateVirtualMemory può eseguire le operazioni seguenti:

  • Eseguire il commit di un'area di pagine riservate da una chiamata precedente a NtAllocateVirtualMemory.
  • Riservare un'area di pagine gratuite.
  • Riservare ed eseguire il commit di un'area di pagine gratuite.

I driver in modalità kernel possono usare NtAllocateVirtualMemory per riservare un intervallo di indirizzi virtuali accessibili dall'applicazione nel processo specificato e quindi effettuare chiamate aggiuntive a NtAllocateVirtualMemory per eseguire il commit di singole pagine dall'intervallo riservato. In questo modo, un processo può riservare un intervallo dello spazio di 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. NtAllocateVirtualMemory può riservare o riservare e confermare contemporaneamente 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. NtAllocateVirtualMemory può eseguire il commit di una pagina riservata, ma non può riservarla una seconda volta. NtFreeVirtualMemory 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. NtAllocateVirtualMemory 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. NtFreeVirtualMemory può decommettere una pagina di commit, rilasciare l'archiviazione della pagina o rilasciare contemporaneamente una pagina di commit.

La memoria allocata chiamando NtAllocateVirtualMemory deve essere liberata chiamando NtFreeVirtualMemory.

Per altre informazioni sulla gestione della memoria, vedere Gestione della memoria per i driver di Windows.

Nota Se la chiamata alla funzione NtAllocateVirtualMemory 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, PowerIrpDDis, SpNoWait, StorPortStartIo

Vedi anche

NtFreeVirtualMemory