Funzione ZwFreeVirtualMemory (ntifs.h)
La routine ZwFreeVirtualMemory rilascia, decommits o entrambi, un'area di pagine all'interno dello spazio indirizzi virtuale di un processo specificato.
NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in, out] PSIZE_T RegionSize,
[in] ULONG FreeType
);
[in] ProcessHandle
Handle per il processo nel cui contesto risiedono le pagine da liberare. Usare la macro NtCurrentProcess , definita in Ntddk.h, per specificare il processo corrente.
[in, out] BaseAddress
Puntatore a una variabile che riceverà l'indirizzo virtuale dell'area liberata delle pagine.
Se il flag di MEM_RELEASE è impostato nel parametro FreeType , BaseAddress deve essere l'indirizzo di base restituito da ZwAllocateVirtualMemory quando l'area è stata riservata.
[in, out] RegionSize
Puntatore a una variabile che riceverà le dimensioni effettive, in byte, dell'area liberata delle pagine. La routine esegue il round del valore iniziale di questa variabile fino al limite delle dimensioni della pagina host successiva e scrive il valore arrotondato di nuovo in questa variabile.
Se il flag MEM_RELEASE è impostato nel parametro FreeType , la variabile a cui punta RegionSize deve essere zero. ZwFreeVirtualMemory libera l'intera area riservata nella chiamata di allocazione iniziale a ZwAllocateVirtualMemory.
Se il flag MEM_DECOMMIT è impostato nel parametro FreeType, ZwFreeVirtualMemory decommette tutte le pagine di memoria che contengono uno o più byte nell'intervallo dal parametro BaseAddress a (BaseAddress + RegionSize). Ciò significa, ad esempio, che se un'area a due byte di memoria straddles un limite di pagina, entrambe le pagine vengono decommesse.
ZwFreeVirtualMemory decommette l'intera regione 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 era riservata.
- RegionSize< è zero.
[in] FreeType
Maschera di bit che contiene flag che descrivono il tipo di operazione gratuita eseguita da ZwFreeVirtualMemory per l'area specificata di pagine. Di seguito sono indicati i valori possibili:
MEM_DECOMMIT
ZwFreeVirtualMemory decommiterà l'area specificata di pagine. Le pagine immettono lo stato riservato.
ZwFreeVirtualMemory non riesce se si tenta di decommettere una pagina non eseguita. Ciò significa che è possibile decommettere un intervallo di pagine senza prima determinare lo stato di impegno corrente.
MEM_RELEASE
ZwFreeVirtualMemory rilascia l'area specificata di 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 le pagine nell'area sono attualmente eseguite, ZwFreeVirtualMemory prima decommits e quindi le rilascia.
ZwFreeVirtualMemory non riesce se si tenta di rilasciare pagine in stati diversi, alcuni stati riservati e alcuni commit. Ciò significa che è possibile rilasciare un intervallo di pagine senza prima determinare lo stato di impegno corrente.
ZwFreeVirtualMemory restituisce STATUS_SUCCESS o un codice di stato di errore. I codici di stato degli errori 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 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. |
Ogni pagina nello spazio indirizzi virtuale del processo si trova in uno dei tre stati descritti di seguito.
Lo stato è GRATUITO
La pagina non è stata eseguita né con commit né riservata. La pagina non è accessibile al processo. Il tentativo di lettura o scrittura in una pagina gratuita comporta un'eccezione di violazione di accesso.
È possibile usare ZwFreeVirtualMemory per inserire pagine riservate o commit nello stato libero.
Lo stato è RISERVATO
La pagina è riservata. L'intervallo di indirizzi non può essere usato da altre funzioni di allocazione. La pagina non è accessibile al processo e non ha alcuna risorsa di archiviazione fisica associata. Il tentativo di lettura o scrittura in una pagina riservata comporta un'eccezione di violazione di accesso.
È possibile usare ZwFreeVirtualMemory per inserire le pagine di memoria di commit nello stato riservato e inserire pagine di memoria riservate nello stato libero.
Lo stato è COMMIT
La pagina viene eseguita con commit. L'archiviazione fisica in memoria o nel file di paging sul disco viene allocata per la pagina e l'accesso viene 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 di un processo, il sistema rilascia tutte le pagine di archiviazione per le pagine di commit.
È possibile usare ZwAllocateVirtualMemory per inserire le pagine di memoria commit nello stato riservato o libero.
ZwFreeVirtualMemory può eseguire le operazioni seguenti:
- Decommite un'area di pagine commit o non inviate. 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.
- Decommit e rilasciare un'area di pagine commit o non inviate. Dopo questa operazione, le pagine si trovano nello stato libero.
ZwFreeVirtualMemory può decommettere un intervallo di pagine in diversi stati, alcuni 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 viene modificato in modo riservato. È successivamente possibile chiamare ZwFreeVirtualMemory per eseguirne il commit o ZwFreeVirtualMemory per rilasciarlo. Il tentativo di lettura o scrittura in una pagina riservata comporta un'eccezione di violazione di accesso.
ZwFreeVirtualMemory può rilasciare un intervallo di pagine in diversi stati, alcuni riservati e alcuni 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 viene modificato gratuitamente ed è disponibile per le operazioni di allocazione successive. Dopo aver rilasciato o decommesso la memoria, non è mai possibile fare riferimento alla memoria. Tutte le informazioni che potrebbero essere state in quella memoria sono andate per sempre. Il tentativo di lettura o scrittura in una pagina gratuita comporta un'eccezione di violazione di accesso. Se sono necessarie informazioni, non decommettere o liberare memoria contenente tali informazioni.
Per altre informazioni sul supporto per la gestione della memoria per i driver in modalità kernel, vedere Gestione della memoria per i driver Windows.
Nota
Se la chiamata alla funzione ZwFreeVirtualMemory si verifica in modalità utente, è necessario usare il nome "NtFreeVirtualMemory" anziché "ZwFreeVirtualMemory".
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.
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) |