Funzione ZwFreeVirtualMemory (ntifs.h)
Il ZwFreeVirtualMemory versioni di routine, decommette o entrambe, un'area di pagine all'interno dello spazio indirizzi virtuale di un processo specificato.
Sintassi
NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in, out] PSIZE_T RegionSize,
[in] ULONG FreeType
);
Parametri
[in] ProcessHandle
Handle per il processo nel cui contesto si trovano le pagine da liberare. Utilizzare la macro NtCurrentProcess
[in, out] BaseAddress
Puntatore a una variabile che riceverà l'indirizzo virtuale dell'area liberata delle pagine.
Se il flag MEM_RELEASE è impostato nel parametro FreeType, baseAddress deve essere l'indirizzo di base restituito da ZwAllocateVirtualMemory quando l'area è riservata.
[in, out] RegionSize
Puntatore a una variabile che riceverà le dimensioni effettive, in byte, dell'area liberata delle pagine. La routine arrotonda il valore iniziale di questa variabile fino al limite delle dimensioni della pagina host successiva e scrive nuovamente il valore arrotondato in questa variabile.
Se il flag MEM_RELEASE è impostato nel parametro FreeType
Se il flag MEM_DECOMMIT viene impostato nel parametro
ZwFreeVirtualMemory decommette l'intera area riservata da ZwAllocateVirtualMemory. Se vengono soddisfatte le tre condizioni seguenti, l'intera area entra nello stato riservato:
- Il flag MEM_DECOMMIT è impostato.
- baseAddress è l'indirizzo di base restituito da ZwAllocateVirtualMemory quando l'area è stata riservata.
- RegionSize< è zero.
[in] FreeType
Maschera di bit che contiene flag che descrivono il tipo di operazione gratuita che ZwFreeVirtualMemory verrà eseguita per l'area di pagine specificata. I valori possibili sono i seguenti:
MEM_DECOMMIT
ZwFreeVirtualMemory decommetterà l'area di pagine specificata. Le pagine immettono lo stato riservato.
ZwFreeVirtualMemory non ha esito negativo se si tenta di decommettere una pagina di cui non è stato eseguito il commit. Ciò significa che è possibile decommettere un intervallo di pagine senza prima determinare lo stato di impegno corrente.
MEM_RELEASE
ZwFreeVirtualMemory rilascia l'area specificata delle pagine. Le pagine immettono lo stato libero.
Se si specifica questo flag, la variabile che RegionSize punta a deve essere zero e baseAddress deve puntare all'indirizzo di base restituito da ZwAllocateVirtualMemory quando l'area è stata riservata. ZwFreeVirtualMemory ha esito negativo se una di queste condizioni non viene soddisfatta.
Se è attualmente stato eseguito il commit di qualsiasi pagina nell'area, ZwFreeVirtualMemory prima decomplicazione e quindi le rilascia.
ZwFreeVirtualMemory non ha esito negativo se si tenta di rilasciare pagine in stati diversi, alcune riservate e alcune di cui è stato eseguito il commit. Ciò significa che è possibile rilasciare un intervallo di pagine senza prima determinare lo stato di impegno corrente.
Valore restituito
ZwFreeVirtualMemory restituisce STATUS_SUCCESS o un codice di stato di errore. I codici di stato di errore possibili includono quanto segue.
Codice restituito | Descrizione |
---|---|
STATUS_ACCESS_DENIED | Un processo ha richiesto l'accesso a un oggetto, ma non è stato concesso tali diritti di accesso. |
STATUS_INVALID_HANDLE | È stato specificato un valore di ProcessHandle non valido |
STATUS_OBJECT_TYPE_MISMATCH | Esiste una mancata corrispondenza tra il tipo di oggetto richiesto dall'operazione richiesta e il tipo di oggetto specificato nella richiesta. |
Osservazioni
Ogni pagina nello spazio indirizzi virtuale del processo si trova in uno dei tre stati descritti di seguito.
Lo stato è FREE
La pagina non è né sottoposta a commit né riservata. La pagina non è accessibile al processo. Il tentativo di leggere o scrivere in una pagina libera genera un'eccezione di violazione di accesso.
È possibile usare ZwFreeVirtualMemory per inserire pagine riservate o di cui è stato eseguito il commit nello stato libero.
Lo stato è RESERVED
La pagina è riservata. L'intervallo di indirizzi non può essere utilizzato da altre funzioni di allocazione. La pagina non è accessibile al processo e non dispone di alcuna risorsa di archiviazione fisica associata. Il tentativo di leggere o scrivere in una pagina riservata genera un'eccezione di violazione di accesso.
È possibile usare ZwFreeVirtualMemory per inserire le pagine di memoria di cui è stato eseguito il commit nello stato riservato e per inserire pagine di memoria riservate nello stato libero.
Lo stato è COMMITTED
Viene eseguito il commit della pagina. L'archiviazione fisica in memoria o nel file di paging su disco viene allocata per la pagina e l'accesso è 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.
Quando un processo termina, il sistema rilascia tutte le risorse di archiviazione per le pagine di cui è stato eseguito il commit.
È possibile usare ZwAllocateVirtualMemory per inserire le pagine di memoria di cui è stato eseguito il commit nello stato riservato o libero.
ZwFreeVirtualMemory può eseguire le operazioni seguenti:
- Rimuovere il commit di un'area di pagine di cui è stato eseguito il commit o di cui non è stato eseguito il commit. Dopo questa operazione, le pagine si trovano nello stato riservato.
- Rilasciare un'area di pagine riservate. Dopo questa operazione, le pagine si trovano nello stato libero.
- Rimuovere il commit e rilasciare un'area di pagine di cui è stato eseguito il commit o di cui non è stato eseguito il commit. Dopo questa operazione, le pagine si trovano nello stato libero.
ZwFreeVirtualMemory può decommettere un intervallo di pagine che si trovano in stati diversi, alcuni di cui è stato eseguito il commit e alcuni non inviati. Ciò significa che è possibile decommettere un intervallo di pagine senza prima determinare lo stato di impegno corrente di ogni pagina. Il decommettimento di una pagina rilascia l'archiviazione fisica, in memoria o nel file di paging su disco.
Se una pagina viene decommessa ma non rilasciata, lo stato cambia in riservato. Successivamente è possibile chiamare ZwFreeVirtualMemory per eseguirne il commit oppure ZwFreeVirtualMemory per rilasciarlo. Il tentativo di leggere o scrivere in una pagina riservata genera un'eccezione di violazione di accesso.
ZwFreeVirtualMemory può rilasciare un intervallo di pagine in stati diversi, alcune riservate e alcune di cui è stato eseguito il commit. Ciò significa che è possibile rilasciare un intervallo di pagine senza prima determinare lo stato di impegno corrente di ogni pagina. L'intera gamma di pagine originariamente riservate da ZwAllocateVirtualMemory deve essere rilasciata contemporaneamente.
Se viene rilasciata una pagina, lo stato diventa libero ed è disponibile per le operazioni di allocazione successive. Dopo il rilascio o il decommesso della memoria, non è possibile fare riferimento di nuovo alla memoria. Tutte le informazioni che potrebbero essere state in quella memoria sono andate per sempre. Il tentativo di leggere o scrivere in una pagina libera genera un'eccezione di violazione di accesso. Se sono necessarie informazioni, non decommettere o liberare memoria che contiene tali informazioni.
Per altre informazioni sul supporto della gestione della memoria per i driver in modalità kernel, vedere Memory Management for Windows Drivers.
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, Fltkernel.h) |
libreria |
NtosKrnl.lib |
dll | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
regole di conformità DDI | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |