ZwFreeVirtualMemory-Funktion (ntifs.h)

Die ZwFreeVirtualMemory-Routineveröffentlichungen , decommits oder beide, eine Region 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 dessen Kontext sich die freizugebenden Seiten befinden. Verwenden Sie das In Ntddk.h definierte Makro NtCurrentProcess , um den aktuellen Prozess anzugeben.

[in, out] BaseAddress

Ein Zeiger auf eine Variable, die die virtuelle Adresse des freigegebenen Bereichs von Seiten empfängt.

Wenn das MEM_RELEASE-Flag im FreeType-Parameter festgelegt ist, muss BaseAddress die Basisadresse sein, die von ZwAllocateVirtualMemory zurückgegeben wurde, als die Region reserviert wurde.

[in, out] RegionSize

Ein Zeiger auf eine Variable, die die tatsächliche Größe des freigegebenen Bereichs von Seiten in Bytes empfängt. Die Routine rundet den Anfangswert dieser Variablen auf die nächste Hostseitengrößengrenze auf und schreibt den gerundeten Wert zurück in diese Variable.

Wenn das flag MEM_RELEASE im FreeType-Parameter festgelegt ist, muss die Variable, auf die von RegionSize verwiesen wird, null sein. ZwFreeVirtualMemory gibt die gesamte Region frei, die im anfänglichen Zuordnungsaufruf von ZwAllocateVirtualMemory reserviert wurde.

Wenn das MEM_DECOMMIT-Flag im FreeType-Parameter festgelegt ist, deaktiviert ZwFreeVirtualMemory alle Speicherseiten, die ein oder mehrere Bytes im Bereich vom Parameter BaseAddress bis (BaseAddress + RegionSize) enthalten. Dies bedeutet beispielsweise, dass, wenn ein Speicherbereich mit zwei Byte eine Seitengrenze überspannt, beide Seiten decomdiert werden.

ZwFreeVirtualMemory deaktiviert die gesamte Region, die von ZwAllocateVirtualMemory reserviert wurde. Wenn die folgenden drei Bedingungen erfüllt sind, wird die gesamte Region in den reservierten Zustand versetzt:

  • Das MEM_DECOMMIT-Flag ist festgelegt.
  • BaseAddress ist die Basisadresse, die von ZwAllocateVirtualMemory zurückgegeben wird, als die Region reserviert wurde.
  • RegionSize< ist 0.

[in] FreeType

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

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory deaktivieren den angegebenen Bereich der Seiten. Die Seiten werden in den reservierten Zustand versetzt.

    • ZwFreeVirtualMemory schlägt nicht fehl, wenn Sie versuchen, die Aussetzung einer nicht signierten Seite aufzuheben. Dies bedeutet, dass Sie einen Seitenbereich aufheben können, ohne vorher ihren aktuellen Verpflichtungsstatus zu bestimmen.

  • MEM_RELEASE

    ZwFreeVirtualMemory gibt den angegebenen Bereich von Seiten frei. Die Seiten werden in den Free-Zustand versetzt.

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

    Wenn seiten in der Region derzeit zugesagt werden, wird die ZwFreeVirtualMemory-Instanz zuerst aufgehoben und dann freigegeben.

ZwFreeVirtualMemory schlägt nicht fehl, wenn Sie versuchen, Seiten freizugeben, die sich in verschiedenen Zuständen befinden, einige reserviert und einige committet. Dies bedeutet, dass Sie einen Bereich von Seiten freigeben können, ohne zuerst ihren aktuellen Verpflichtungsstatus zu bestimmen.

Rückgabewert

ZwFreeVirtualMemory gibt entweder STATUS_SUCCESS oder einen Fehler status Code zurück. Mögliche Fehler status Codes sind:

Rückgabecode Beschreibung
STATUS_ACCESS_DENIED Ein Prozess hat Zugriff auf ein Objekt angefordert, aber diese Zugriffsrechte wurden nicht erteilt.
STATUS_INVALID_HANDLE Ein ungültiger ProcessHandle-Wert wurde angegeben.
STATUS_OBJECT_TYPE_MISMATCH Es besteht ein Konflikt zwischen dem Typ des Objekts, der für den angeforderten Vorgang erforderlich ist, und dem Typ des Objekts, der in der Anforderung angegeben wird.

Hinweise

Jede Seite im virtuellen Adressraum des Prozesses befindet sich in einem der drei Zustände, die wie folgt beschrieben werden.

  • Der Status ist FREE

    Die Seite ist weder verpflichtet noch reserviert. Auf die Seite kann der Prozess nicht zugreifen. Der Versuch, von einer freien Seite zu lesen oder darauf zu schreiben, führt zu einer Zugriffsverletzungs-Ausnahme.

    Sie können ZwFreeVirtualMemory verwenden, um reservierte oder verpflichtete Seiten in den freien Zustand zu versetzen.

  • Status ist RESERVIERT

    Die Seite ist reserviert. Der Adressbereich kann nicht von anderen Zuordnungsfunktionen verwendet werden. Die Seite ist für den Prozess nicht zugänglich und verfügt über keinen physischen Speicher. Der Versuch, eine reservierte Seite zu lesen oder in diese zu schreiben, führt zu einer Zugriffsverletzungs-Ausnahme.

    Sie können ZwFreeVirtualMemory verwenden, um verpflichtete Speicherseiten in den reservierten Zustand zu versetzen und reservierte Speicherseiten in den freien Zustand zu versetzen.

  • State is COMMITTED

    Die Seite wird festgelegt. Der physische 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 zugesagte Seite erst beim ersten Versuch, von dieser Seite zu lesen oder in diese zu schreiben, in den physischen Arbeitsspeicher.

    Wenn ein Prozess beendet wird, gibt das System den gesamten Speicher für verpflichtete Seiten frei.

    Sie können ZwAllocateVirtualMemory verwenden, um festgeschriebene Speicherseiten entweder in den reservierten oder freien Zustand zu versetzen.

ZwFreeVirtualMemory kann die folgenden Vorgänge ausführen:

  • Aufheben des Aussetzens einer Region mit gebundenen oder nicht gebundenen Seiten. Nach diesem Vorgang befinden sich die Seiten im reservierten Zustand.
  • Geben Sie eine Region mit reservierten Seiten frei. Nach diesem Vorgang sind die Seiten freigegeben.
  • Deaktivieren und Freigeben einer Region mit gebundenen oder nicht gebundenen Seiten. Nach diesem Vorgang sind die Seiten freigegeben.

ZwFreeVirtualMemory kann einen Bereich von Seiten aufheben, die sich in unterschiedlichen Zuständen befinden, einige committet und einige nicht gebunden. Dies bedeutet, dass Sie einen Seitenbereich aufheben können, ohne zuerst den aktuellen Verpflichtungsstatus jeder Seite zu bestimmen. Durch das Aufheben der Aussetzung einer Seite wird ihr physischer Speicher freigegeben, entweder im Arbeitsspeicher oder in der Auslagerungsdatei auf dem Datenträger.

Wenn eine Seite aufgehoben, aber nicht freigegeben wird, ändert sich ihr Zustand in reserviert. Sie können anschließend ZwFreeVirtualMemory aufrufen, um es zu committen, oder ZwFreeVirtualMemory , um es freizugeben. Der Versuch, eine reservierte Seite zu lesen oder in diese zu schreiben, führt zu einer Zugriffsverletzungs-Ausnahme.

ZwFreeVirtualMemory kann einen Bereich von Seiten freigeben, die sich in verschiedenen Zuständen befinden, einige reserviert und einige committet. Dies bedeutet, dass Sie einen Seitenbereich freigeben können, ohne zuerst den aktuellen Verpflichtungsstatus jeder Seite zu bestimmen. Der gesamte Bereich der ursprünglich von ZwAllocateVirtualMemory reservierten Seiten muss gleichzeitig freigegeben werden.

Wenn eine Seite freigegeben wird, ändert sich ihr Zustand in free und steht für nachfolgende Zuordnungsvorgänge zur Verfügung. Nachdem der Arbeitsspeicher freigegeben oder aufgehoben wurde, können Sie nie wieder auf den Arbeitsspeicher verweisen. Alle Informationen, die sich möglicherweise in diesem Speicher befinden, sind für immer verschwunden. Der Versuch, von einer freien Seite zu lesen oder darauf zu schreiben, führt zu einer Zugriffsverletzungs-Ausnahme. Wenn Sie Informationen benötigen, sollten Sie den Speicher, der diese Informationen enthält, nicht aufheben oder freigeben.

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

Hinweis

Wenn der Aufruf der ZwFreeVirtualMemory-Funktion im Benutzermodus erfolgt, 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, da sie Eingabeparameter verarbeiten und interpretieren. Weitere Informationen zur Beziehung zwischen den Nt Xxx- und ZwXxx-Versionen einer Routine finden Sie unter Verwenden von Nt- und Zw-Versionen der Systemdienstroutinen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000
Zielplattform Universell
Header ntifs.h (include Ntifs.h, Fltkernel.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Weitere Informationen

ZwAllocateVirtualMemory