Condividi tramite


Funzione NtFreeVirtualMemory (ntifs.h)

La routine NtFreeVirtualMemory rilascia, decommits o entrambe le versioni e decommits, 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 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 di base dell'area liberata delle pagine.

Se il flag di 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 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 di 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 di MEM_DECOMMIT è impostato in *FreeType, NtFreeVirtualMemory decommette tutte le pagine di memoria che contengono uno o più byte nell'intervallo da *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.

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 eseguita da NtFreeVirtualMemory per l'area specificata di pagine. I valori possibili sono elencati nella tabella seguente.

Contrassegno Significato
MEM_DECOMMIT NtFreeVirtualMemory decommetterà l'area specificata di pagine. Le pagine immettono lo stato riservato. NtFreeVirtualMemory 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 NtFreeVirtualMemory rilascia l'area specificata di 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 le pagine nell'area sono attualmente sottoposte a commit, NtFreeVirtualMemory prima decommits e quindi le rilascia. NtFreeVirtualMemory non riesce 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 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.

Commenti

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 è 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 NtFreeVirtualMemory per inserire pagine riservate o commit nello stato libero.
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 NtFreeVirtualMemory per inserire le pagine di memoria di commit nello stato riservato e inserire pagine di memoria riservate nello stato libero.
IMPEGNATI 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 NtAllocateVirtualMemory per inserire le pagine di memoria commit nello stato riservato o libero.

NtFreeVirtualMemory 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.

NtFreeVirtualMemory 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 NtAllocateVirtualMemory per eseguirne il commit o NtFreeVirtualMemory per rilasciarlo. Il tentativo di lettura o scrittura in una pagina riservata comporta un'eccezione di violazione di accesso.

NtFreeVirtualMemory può rilasciare un intervallo di pagine in diversi stati, 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 NtAllocateVirtualMemory 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 NtFreeVirtualMemory 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.

Requisiti

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

Vedi anche

NtAllocateVirtualMemory