Condividi tramite


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 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 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 , 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 viene impostato nel parametro FreeType, ZwFreeVirtualMemory decommette tutte le pagine di memoria che contengono uno o più byte nell'intervallo dal parametro BaseAddress a (BaseAddressRegionSize). 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.

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 ZwFreeVirtualMemory si verifica 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(storport), PowerIrpDDis(wdm)

Vedere anche

ZwAllocateVirtualMemory