Freigeben über


NtFreeVirtualMemory-Funktion (ntifs.h)

Die NtFreeVirtualMemory Routineversionen, Dekommitierungen oder beide Versionen und Dekommitierungen, eine Region von Seiten innerhalb des virtuellen Adressraums eines angegebenen Prozesses.

Syntax

__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
  [in]      HANDLE  ProcessHandle,
  [in, out] PVOID   *BaseAddress,
  [in, out] PSIZE_T RegionSize,
  [in]      ULONG   FreeType
);

Parameter

[in] ProcessHandle

Ein Handle für den Prozess, in dem sich die freizugebenden Seiten befinden. Verwenden Sie das NtCurrentProcess Makro, das in Ntddk.hdefiniert ist, um den aktuellen Prozess anzugeben.

[in, out] BaseAddress

Ein Zeiger auf eine Variable, die die virtuelle Basisadresse des freigegebenen Seitenbereichs empfängt.

Wenn das MEM_RELEASE Flag im FreeType Parameter festgelegt ist, muss *BaseAddress die Basisadresse sein, die von NtAllocateVirtualMemory zurückgegeben wird, wenn die Region reserviert wurde.

[in, out] RegionSize

Ein Zeiger auf eine Variable, die die tatsächliche Größe des freigegebenen Seitenbereichs in Byte erhält. Die Routine rundet den Anfangswert dieser Variablen bis zur nächsten Begrenzung der Größe der Hostseite auf und schreibt den gerundeten Wert wieder in diese Variable.

Wenn das MEM_RELEASE Flag in *FreeTypefestgelegt ist, muss *RegionSize null sein. NtFreeVirtualMemory gibt die gesamte Region frei, die im anfänglichen Zuordnungsaufruf an NtAllocateVirtualMemoryreserviert wurde.

Wenn das MEM_DECOMMIT Flag in *FreeTypefestgelegt ist, werden NtFreeVirtualMemory alle Speicherseiten, die einen oder mehrere Bytes im Bereich von *BaseAddress bis (*BaseAddress + *RegionSize) enthalten, entfernt. Dies bedeutet z. B., dass bei einem Speicherbereich mit zwei Byte eine Seitengrenze überspannt wird, beide Seiten weggelassen werden.

NtFreeVirtualMemory die gesamte Region aus, die von NtAllocateVirtualMemoryreserviert wurde. Wenn die folgenden drei Bedingungen erfüllt sind, wechselt die gesamte Region in den reservierten Zustand:

  • Das MEM_DECOMMIT Flag ist festgelegt.
  • *BaseAddress ist die Basisadresse, die von NtAllocateVirtualMemory zurückgegeben wird, als die Region reserviert wurde.
  • *RegionSize ist Null.

[in] FreeType

Eine Bitmaske mit Flags, die den Typ des freien Vorgangs beschreiben, der NtFreeVirtualMemory für den angegebenen Seitenbereich ausgeführt wird. Die möglichen Werte sind in der folgenden Tabelle aufgeführt.

Flagge Bedeutung
MEM_DECOMMIT NtFreeVirtualMemory wird den angegebenen Seitenbereich dekommitieren. Die Seiten geben den reservierten Zustand ein. NtFreeVirtualMemory schlägt nicht fehl, wenn Sie versuchen, eine nicht ausgelassene Seite aufzuheben. Dies bedeutet, dass Sie einen Seitenbereich dekommitieren können, ohne zuerst den aktuellen Verpflichtungsstatus zu ermitteln.
MEM_RELEASE NtFreeVirtualMemory gibt den angegebenen Seitenbereich frei. Die Seiten geben den freien Zustand ein. Wenn Sie dieses Flag angeben, muss RegionSize null sein, und BaseAddress- muss auf die Basisadresse verweisen, die von NtAllocateVirtualMemory zurückgegeben wurde, wenn die Region reserviert wurde. NtFreeVirtualMemory schlägt fehl, wenn eine dieser Bedingungen nicht erfüllt ist. Wenn seiten in der Region zurzeit zugesichert werden, NtFreeVirtualMemory zuerst dekommittiert und dann freigegeben. NtFreeVirtualMemory schlägt nicht fehl, wenn Sie versuchen, Seiten freizugeben, die sich in verschiedenen Zuständen befinden, einige reserviert und einige zugesichert. Dies bedeutet, dass Sie einen Seitenbereich freigeben können, ohne zuerst den aktuellen Verpflichtungsstatus zu ermitteln.

Rückgabewert

NtFreeVirtualMemory gibt entweder STATUS_SUCCESS oder einen Fehlerstatuscode zurück. Mögliche Fehlerstatuscodes sind:

Rückgabecode Beschreibung
STATUS_ACCESS_DENIED Ein Prozess hat den Zugriff auf ein Objekt angefordert, wurde jedoch nicht diesen Zugriffsrechten gewährt.
STATUS_INVALID_HANDLE Es wurde ein ungültiger ProcessHandle- Wert angegeben.
STATUS_OBJECT_TYPE_MISMATCH Es besteht ein Konflikt zwischen dem Typ des Objekts, der vom angeforderten Vorgang benötigt wird, und dem Typ des Objekts, das in der Anforderung angegeben ist.

Bemerkungen

Jede Seite im virtuellen Adressraum des Prozesses befindet sich in einem der drei in der folgenden Tabelle beschriebenen Zustände.

Zustand Bedeutung
KOSTENLOS Die Seite ist weder zugesichert noch reserviert. Auf die Seite kann nicht zugegriffen werden. Der Versuch, von einer kostenlosen Seite zu lesen oder in eine freie Seite zu schreiben, führt zu einer Ausnahme für Zugriffsverletzungen. Sie können NtFreeVirtualMemory- verwenden, um reservierte oder zugesicherte Seiten in den freien Zustand zu versetzen.
RESERVIERT Die Seite ist reserviert. Der Adressbereich kann nicht von anderen Zuordnungsfunktionen verwendet werden. Auf die Seite kann nicht zugegriffen werden, und es ist kein physischer Speicher zugeordnet. Der Versuch, von einer reservierten Seite zu lesen oder in eine reservierte Seite zu schreiben, führt zu einer Ausnahme für Zugriffsverletzungen. Sie können NtFreeVirtualMemory- verwenden, um zugesicherte Speicherseiten in den reservierten Zustand zu versetzen und reservierte Speicherseiten in den freien Zustand zu versetzen.
ENGAGIERT Die Seite wird zugesichert. Physischer Speicher im Arbeitsspeicher oder in der Auslagerungsdatei auf dem Datenträger wird für die Seite zugewiesen, und der Zugriff wird durch einen Schutzcode gesteuert. Das System initialisiert und lädt jede zugesicherte Seite nur beim ersten Versuch, von dieser Seite aus zu lesen oder in diese Seite zu schreiben. Wenn ein Prozess beendet wird, gibt das System den gesamten Speicher für zugesicherte Seiten frei. Sie können NtAllocateVirtualMemory- verwenden, um zugesicherte Speicherseiten entweder im reservierten oder freien Zustand zu platzieren.

NtFreeVirtualMemory kann die folgenden Vorgänge ausführen:

  • Dekommitieren einer Region von zugesicherten oder nicht zugesicherten Seiten. Nach diesem Vorgang befinden sich die Seiten im reservierten Zustand.
  • Freigeben eines Bereichs reservierter Seiten. Nach diesem Vorgang befinden sich die Seiten im freien Zustand.
  • Dekommitieren und Freigeben eines Bereichs von zugesicherten oder nicht freigegebenen Seiten. Nach diesem Vorgang befinden sich die Seiten im freien Zustand.

NtFreeVirtualMemory kann einen Seitenbereich, der sich in verschiedenen Zuständen befindet, einige zugesichert und einige nicht ausgeschrieben werden. Dies bedeutet, dass Sie einen Seitenbereich dekommitieren können, ohne zuerst den aktuellen Verpflichtungsstatus jeder Seite zu ermitteln. Durch die Demittierung einer Seite wird der physische Speicher entweder im Arbeitsspeicher oder in der Auslagerungsdatei auf dem Datenträger freigegeben.

Wenn eine Seite ausgelassen, aber nicht freigegeben wird, ändert sich der Status in "reserviert". Anschließend können Sie NtAllocateVirtualMemory- aufrufen, um ihn zu übernehmen, oder NtFreeVirtualMemory, um es freizugeben. Der Versuch, von einer reservierten Seite zu lesen oder in eine reservierte Seite zu schreiben, führt zu einer Ausnahme für Zugriffsverletzungen.

NtFreeVirtualMemory kann einen Seitenbereich freigeben, der in verschiedenen Zuständen, einige reserviert und einige zugesichert sind. Dies bedeutet, dass Sie einen Seitenbereich freigeben können, ohne zuerst den aktuellen Verpflichtungsstatus jeder Seite zu ermitteln. Der gesamte Von NtAllocateVirtualMemory reservierte Seitenbereich muss gleichzeitig freigegeben werden.

Wenn eine Seite freigegeben wird, ändert sich der Status in "frei" und steht für nachfolgende Zuordnungsvorgänge zur Verfügung. Nachdem der Speicher freigegeben oder ausgelassen wurde, können Sie nie wieder auf den Speicher verweisen. Alle Informationen, die sich möglicherweise in diesem Gedächtnis befinden, sind für immer verschwunden. Der Versuch, von einer kostenlosen Seite zu lesen oder in eine freie Seite zu schreiben, führt zu einer Ausnahme für Zugriffsverletzungen. Wenn Sie Informationen benötigen, deaktivieren Sie nicht den Speicher, der diese Informationen enthält.

Weitere Informationen zur Unterstützung der Speicherverwaltung für Kernelmodustreiber finden Sie unter Speicherverwaltung für Windows-Treiber.

Anmerkung

Wenn der Aufruf der NtFreeVirtualMemory Funktion im Benutzermodus auftritt, sollten Sie den Namen "NtFreeVirtualMemory" anstelle von "ZwFreeVirtualMemory" verwenden.

Bei Aufrufen von Kernelmodustreibern können sich die NtXxx und ZwXxx- Versionen einer Windows Native System Services-Routine anders verhalten, wie sie Eingabeparameter behandeln und interpretieren. Weitere Informationen zur Beziehung zwischen den NtXxx und ZwXxx- Versionen einer Routine finden Sie unter Using Nt and Zw Versions of the Native System Services Routines.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 2000
Zielplattform- Universal
Header- ntifs.h (einschließlich Ntifs.h, Fltkernel.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs, PowerIrpDDis

Siehe auch

NtAllocateVirtualMemory