Funzione NtFreeVirtualMemory (ntifs.h)
Il NtFreeVirtualMemory versioni di routine, decommette o entrambe le versioni e i decomits, un'area di pagine all'interno dello spazio indirizzi virtuale di un processo specificato.
Sintassi
__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
[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 definita in ntddk.hper specificare il processo corrente.
[in, out] BaseAddress
Puntatore a una variabile che riceverà l'indirizzo virtuale di base dell'area liberata delle pagine.
Se il flag MEM_RELEASE è impostato nel parametro FreeType, *BaseAddress deve essere l'indirizzo di base restituito da NtAllocateVirtualMemory 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 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 in *FreeType, *RegionSize deve essere zero. NtFreeVirtualMemory libera l'intera area riservata nella chiamata di allocazione iniziale a NtAllocateVirtualMemory.
Se il flag MEM_DECOMMIT è impostato in *FreeType, NtFreeVirtualMemory decommette tutte le pagine di memoria che contengono uno o più byte nell'intervallo compreso tra *BaseAddress a (*BaseAddress + *RegionSize). Ciò significa, ad esempio, che se un'area a due byte di memoria si allontana da un limite di pagina, entrambe le pagine vengono decommesse.
NtFreeVirtualMemory decommette l'intera area riservata da NtAllocateVirtualMemory. 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 NtAllocateVirtualMemory quando l'area è stata riservata.
- *RegionSize è zero.
[in] FreeType
Maschera di bit contenente flag che descrivono il tipo di operazione gratuita che NtFreeVirtualMemory verrà eseguita per l'area di pagine specificata. I valori possibili sono elencati nella tabella seguente.
Bandiera | Significato |
---|---|
MEM_DECOMMIT | NtFreeVirtualMemory decommetterà l'area di pagine specificata. Le pagine immettono lo stato riservato. ntFreeVirtualMemory 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 | NtFreeVirtualMemory rilascia l'area specificata delle pagine. Le pagine immettono lo stato libero. Se si specifica questo flag, RegionSize deve essere zero e baseAddress deve puntare all'indirizzo di base restituito da NtAllocateVirtualMemory quando l'area è stata riservata. ntFreeVirtualMemory ha esito negativo se una di queste condizioni non viene soddisfatta. Se è attualmente stato eseguito il commit di pagine nell'area, NtFreeVirtualMemory prima decomplicazione e quindi le rilascia. ntFreeVirtualMemory 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
ntFreeVirtualMemory 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 nella tabella seguente.
Stato | Significato |
---|---|
GRATUITO | 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 NtFreeVirtualMemory per inserire pagine riservate o di cui è stato eseguito il commit nello stato libero. |
RISERVATO | 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 NtFreeVirtualMemory 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. |
IMPEGNATO | 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 NtAllocateVirtualMemory per inserire le pagine di memoria di cui è stato eseguito il commit nello stato riservato o libero. |
NtFreeVirtualMemory 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.
NtFreeVirtualMemory può rimuovere il commit di un intervallo di pagine 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 NtAllocateVirtualMemory per eseguirne il commit oppure NtFreeVirtualMemory per rilasciarlo. Il tentativo di leggere o scrivere in una pagina riservata genera un'eccezione di violazione di accesso.
NtFreeVirtualMemory 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'intero intervallo di pagine originariamente riservato da NtAllocateVirtualMemory deve essere rilasciato 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 di NtFreeVirtualMemory viene eseguita in modalità utente, è necessario usare il nome "NtFreeVirtualMemory" anziché "ZwFreeVirtualMemory".
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, PowerIrpDDis |