Freigeben über


NtFreeVirtualMemory-Funktion (ntifs.h)

Die NtFreeVirtualMemory-Routineversionen , decommits oder beide Releases und Decommits, 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 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 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 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 MEM_RELEASE-Flag in *FreeType festgelegt ist, muss *RegionSize 0 sein. NtFreeVirtualMemory gibt die gesamte Region frei, die im anfänglichen Zuordnungsaufruf von NtAllocateVirtualMemory reserviert war.

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

NtFreeVirtualMemory deaktiviert die gesamte Region, die von NtAllocateVirtualMemory 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 NtAllocateVirtualMemory 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 NtFreeVirtualMemory für den angegebenen Bereich von Seiten ausführt. Die möglichen Werte sind in der folgenden Tabelle aufgeführt.

Flag Bedeutung
MEM_DECOMMIT NtFreeVirtualMemory deaktivieren den angegebenen Bereich der Seiten. Die Seiten werden in den reservierten Zustand versetzt. NtFreeVirtualMemory 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 NtFreeVirtualMemory gibt den angegebenen Bereich von Seiten frei. Die Seiten werden in den Free-Zustand versetzt. Wenn Sie dieses Flag angeben, muss RegionSize null sein, und BaseAddress muss auf die Basisadresse verweisen, die von NtAllocateVirtualMemory zurückgegeben wurde, als die Region reserviert war. NtFreeVirtualMemory schlägt fehl, wenn eine dieser Bedingungen nicht erfüllt ist. Wenn seiten in der Region derzeit zugesagt werden, wird die Mittel von NtFreeVirtualMemory zuerst deaktiviert und dann freigegeben. NtFreeVirtualMemory schlägt nicht fehl, wenn Sie versuchen, Seiten zu veröffentlichen, die sich in unterschiedlichen 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

NtFreeVirtualMemory 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 in der folgenden Tabelle beschriebenen Zustände.

State Bedeutung
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 NtFreeVirtualMemory verwenden, um reservierte oder verpflichtete Seiten in den free-Zustand zu versetzen.
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 NtFreeVirtualMemory verwenden, um festgeschriebene Speicherseiten in den reservierten Zustand zu versetzen und reservierte Speicherseiten in den freien Zustand zu versetzen.
ENGAGIERT 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 NtAllocateVirtualMemory verwenden, um festgeschriebene Speicherseiten entweder in den reservierten oder freien Zustand zu versetzen.

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

NtFreeVirtualMemory 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 NtAllocateVirtualMemory aufrufen, um ihn zu committen, oder NtFreeVirtualMemory , um es freizugeben. Der Versuch, eine reservierte Seite zu lesen oder in diese zu schreiben, führt zu einer Zugriffsverletzungs-Ausnahme.

NtFreeVirtualMemory kann einen Bereich von Seiten freigeben, die sich in unterschiedlichen 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 NtAllocateVirtualMemory 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 Funktion NtFreeVirtualMemory 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, PowerIrpDDis

Weitere Informationen

NtAllocateVirtualMemory