Funzione NtAllocateVirtualMemory (ntifs.h)
Il NtAllocateVirtualMemory riserve di routine, 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.hper 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 daNULL, l'area viene allocata a partire dall'indirizzo virtuale specificato arrotondata 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 pari a zero nell'indirizzo di base della visualizzazione sezione. Utilizzato 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 di dimensioni della pagina host successiva. RegionSize non può essere uguale a zero per l'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, vedere VirtualAlloc.
Nota
È necessario impostare una delle MEM_COMMIT, MEM_RESET o MEM_RESERVE.
Bandiera | Significato |
---|---|
MEM_COMMIT | È necessario eseguire il commit dell'area di pagine specificata. |
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 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. Se MEM_RESET è impostato, non è possibile impostare altri flag. |
Altri flag diXXX MEM_ | Vedere VirtualAlloc. |
[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_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
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
Osservazioni
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. 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. 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 dispone di 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. |
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. NtAllocateVirtualMemory 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. NtFreeVirtualMemory può decommettere una pagina di cui è stato eseguito il commit, rilasciare lo spazio di archiviazione della pagina oppure decommettere e rilasciare contemporaneamente una pagina di cui è stato eseguito il 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 windows.
Nota Se la chiamata alla funzione ntAllocateVirtualMemory viene eseguita in modalità utente, è necessario usare il nome "NtAllocateVirtualMemory" anziché "ZwAlloVirtualMemory".
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, PowerIrpDDis, SpNoWait, StorPortStartIo |