Freigeben über


ZwFreeVirtualMemory-Funktion (ntifs.h)

Die ZwFreeVirtualMemory Routineversionen, dekommitiert oder beides einen Bereich von Seiten innerhalb des virtuellen Adressraums eines angegebenen Prozesses.

Syntax

NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
  [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.h definiert ist, um den aktuellen Prozess anzugeben.

[in, out] BaseAddress

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

Wenn das MEM_RELEASE Flag im FreeType Parameter festgelegt ist, muss BaseAddress- die Basisadresse sein, die von ZwAllocateVirtualMemory 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 im FreeType-Parameter festgelegt ist, muss die Variable, auf die RegionSize verweist, null sein. ZwFreeVirtualMemory gibt die gesamte Region frei, die im anfänglichen Zuordnungsaufruf an ZwAllocateVirtualMemoryreserviert wurde.

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

ZwFreeVirtualMemory die gesamte Region außer Kraft setzen, die von ZwAllocateVirtualMemoryreserviert 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 ZwAllocateVirtualMemory zurückgegeben wird, als die Region reserviert wurde.
  • RegionSize< ist Null.

[in] FreeType

Eine Bitmaske, die Flags enthält, die den Typ des freien Vorgangs beschreiben, der ZwFreeVirtualMemory für den angegebenen Seitenbereich ausgeführt wird. Mögliche Werte sind:

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory wird den angegebenen Seitenbereich außer Kraft setzen. Die Seiten geben den reservierten Zustand ein.

    • ZwFreeVirtualMemory 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

    ZwFreeVirtualMemory gibt den angegebenen Seitenbereich frei. Die Seiten geben den freien Zustand ein.

    Wenn Sie dieses Flag angeben, muss die Variable, auf die RegionSize Punkte verweist, null sein, und BaseAddress- muss auf die basisadresse verweisen, die von ZwAllocateVirtualMemory zurückgegeben wird, als die Region reserviert wurde. ZwFreeVirtualMemory fehlschlägt, wenn eine dieser Bedingungen nicht erfüllt ist.

    Wenn seiten in der Region zurzeit zugesichert werden, ZwFreeVirtualMemory zuerst dekommittiert und dann freigegeben.

ZwFreeVirtualMemory 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

ZwFreeVirtualMemory 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 Zustände, die wie folgt beschrieben werden.

  • Status ist 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 ZwFreeVirtualMemory verwenden, um reservierte oder zugesicherte Seiten in den freien Zustand zu versetzen.

  • Status ist 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 ZwFreeVirtualMemory- verwenden, um zugesicherte Speicherseiten in den reservierten Zustand zu versetzen und reservierte Speicherseiten in den freien Zustand zu versetzen.

  • Status ist ZUGESICHERT

    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 ZwAllocateVirtualMemory verwenden, um zugesicherte Speicherseiten entweder im reservierten oder freien Zustand zu platzieren.

ZwFreeVirtualMemory können 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.

ZwFreeVirtualMemory kann einen Bereich von Seiten außer Kraft setzen, die in verschiedenen Zuständen vorhanden sind, einige zugesichert und einige nicht angegeben 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 ZwFreeVirtualMemory aufrufen, um ihn zu übernehmen, oder ZwFreeVirtualMemory, 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.

ZwFreeVirtualMemory kann einen Bereich von Seiten freigeben, die sich in verschiedenen Zuständen befinden, einige reserviert und einige zugesichert werden. Dies bedeutet, dass Sie einen Seitenbereich freigeben können, ohne zuerst den aktuellen Verpflichtungsstatus jeder Seite zu ermitteln. Der gesamte Seitenbereich, der ursprünglich von ZwAllocateVirtualMemory reserviert wurde, 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 ZwFreeVirtualMemory 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(storport), PowerIrpDDis(wdm)

Siehe auch

ZwAllocateVirtualMemory