ZwAllocateVirtualMemory-Funktion (ntifs.h)
Die ZwAllocateVirtualMemory Routinereserven, Commits oder beides, eine Region von Seiten innerhalb des virtuellen Adressraums des Benutzermodus eines angegebenen Prozesses.
Syntax
NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in] ULONG_PTR ZeroBits,
[in, out] PSIZE_T RegionSize,
[in] ULONG AllocationType,
[in] ULONG Protect
);
Parameter
[in] ProcessHandle
Ein Handle für den Prozess, für den die Zuordnung erfolgen soll. 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 Basisadresse des zugeordneten Seitenbereichs empfängt. Wenn der Anfangswert dieses Parameters nichtNULL-ist, wird der Bereich beginnend mit der angegebenen virtuellen Adresse auf die nächste Adressgrenze der Hostseite aufgerundet. Wenn der Anfangswert dieses Parameters NULL-ist, bestimmt das Betriebssystem, wo die Region zugeordnet werden soll.
[in] ZeroBits
Die Anzahl von Adressbits mit hoher Reihenfolge, die in der Basisadresse der Abschnittsansicht null sein müssen. Dieser Wert muss kleiner als 21 sein und wird nur verwendet, wenn das Betriebssystem bestimmt, wo die Region zugeordnet werden soll, da BaseAddress-NULL-ist.
[in, out] RegionSize
Ein Zeiger auf eine Variable, die die tatsächliche Größe des zugeordneten Seitenbereichs in Byte erhält. Der Anfangswert dieses Parameters gibt die Größe des Bereichs in Bytes an und wird auf die nächste Begrenzung der Hostseitengröße aufgerundet. * RegionSize darf bei eingaben nicht null sein.
[in] AllocationType
Eine Bitmaske, die Flags enthält, die den Typ der zu erfüllenden Zuordnung angeben. In der folgenden Tabelle werden diese Flags beschrieben.
Flagge | Bedeutung |
---|---|
MEM_COMMIT | Der angegebene Seitenbereich muss zugesichert werden. Einer von MEM_COMMIT, MEM_RESET oder MEM_RESERVE muss festgelegt werden. |
MEM_PHYSICAL | Zuordnen des physischen Speichers. Dieses Kennzeichen dient ausschließlich zur Verwendung mit Adressfenstererweiterungen (Address Windowing Extensions, AWE). Wenn MEM_PHYSICAL festgelegt ist, muss MEM_RESERVE auch festgelegt werden, es dürfen keine anderen Flags festgelegt werden, und Schützen muss auf PAGE_READWRITE festgelegt werden. |
MEM_RESERVE | Der angegebene Seitenbereich muss reserviert werden. Einer von MEM_COMMIT, MEM_RESET oder MEM_RESERVE muss festgelegt werden. |
MEM_RESET | Setzen Sie den Status des angegebenen Bereichs zurück, sodass die Seiten, wenn sich die Seiten in der Auslagerungsdatei befinden, verworfen werden und Seiten mit Nullen angezeigt werden. Wenn sich die Seiten im Arbeitsspeicher befinden und geändert werden, werden sie als nicht geändert markiert, sodass sie nicht in die Auslagerungsdatei geschrieben werden. Der Inhalt wird nicht Null |
MEM_TOP_DOWN | Die angegebene Region sollte basierend auf ZeroBits-auf der höchsten virtuellen Adresse erstellt werden. |
[in] Protect
Eine Bitmaske mit Seitenschutzkennzeichnungen, die den für den zugesicherten Bereich von Seiten gewünschten Schutz angeben. In der folgenden Tabelle werden diese Flags beschrieben.
Flagge | Bedeutung |
---|---|
PAGE_NOACCESS | Es ist kein Zugriff auf den zugesicherten Seitenbereich zulässig. Ein Versuch, den zugesicherten Bereich zu lesen, zu schreiben oder auszuführen, führt zu einer Zugriffsverletzungs ausnahme, die als allgemeiner Schutzfehler (GP) bezeichnet wird. |
PAGE_READONLY | Schreibgeschützt und Ausführen des Zugriffs auf den zugesicherten Seitenbereich ist zulässig. Ein Versuch, die zugesicherte Region zu schreiben, führt zu einer Zugriffsverletzung. |
PAGE_READWRITE | Lese-, Schreib- und Ausführungszugriff auf den zugesicherten Seitenbereich ist zulässig. Wenn Schreibzugriff auf den zugrunde liegenden Abschnitt zulässig ist, wird eine einzelne Kopie der Seiten freigegeben. Andernfalls werden die Seiten schreibgeschützt/beim Schreiben freigegeben. |
PAGE_EXECUTE | Der Ausführen des Zugriffs auf den zugesicherten Seitenbereich ist zulässig. Ein Versuch, in den zugesicherten Bereich zu lesen oder zu schreiben, führt zu einer Zugriffsverletzung. |
PAGE_EXECUTE_READ | Der Ausführungs- und Lesezugriff auf den zugesicherten Seitenbereich ist zulässig. Ein Versuch, in die zugesicherte Region zu schreiben, führt zu einer Zugriffsverletzung. |
PAGE_EXECUTE_READWRITE | Ausführen, Lesen und Schreiben des Zugriffs auf den zugesicherten Seitenbereich sind zulässig. |
PAGE_GUARD | Seiten in der Region werden zu Schutzseiten. Jeder Versuch, eine Schutzseite zu lesen oder in eine Schutzseite zu schreiben, bewirkt, dass das System eine STATUS_GUARD_PAGE Ausnahme auslöst. Schutzseiten dienen somit als Einschuss-Zugriffsalarm. Dieses Kennzeichen ist ein Seitenschutzmodifizierer, der nur gültig ist, wenn es mit einem der anderen Kennzeichnungen als PAGE_NOACCESS verwendet wird. Wenn ein Zugriffsversuch das System zum Deaktivieren des Überwachungsseitenstatus führt, übernimmt der zugrunde liegende Seitenschutz. Wenn während eines Systemdiensts eine Schutzseiten-Ausnahme auftritt, gibt der Dienst in der Regel einen Fehlerstatusindikator zurück. |
PAGE_NOCACHE | Der Bereich der Seiten sollte als nicht zwischenspeicherbar zugeordnet werden. PAGE_NOCACHE ist für Abschnitte nicht zulässig. |
PAGE_WRITECOMBINE | Ermöglicht das Kombinieren von Schreibvorgängen, d. h. das Zusammenführen von Schreibvorgängen vom Cache bis zum Hauptspeicher, wobei die Hardware sie unterstützt. Dieses Flag wird hauptsächlich für den Framepufferspeicher verwendet, sodass Schreibvorgänge in dieselbe Cachezeile kombiniert werden, sofern möglich, bevor sie auf das Gerät geschrieben werden. Dadurch können Schreibvorgänge über den Bus erheblich auf (z. B.) Videospeicher reduziert werden. Wenn die Hardware das Kombinieren von Schreibvorgängen nicht unterstützt, wird das Flag ignoriert. Dieses Kennzeichen ist ein Seitenschutzmodifizierer, der nur gültig ist, wenn es mit einem der anderen Kennzeichnungen als PAGE_NOACCESS verwendet wird. |
Rückgabewert
ZwAllocateVirtualMemory gibt entweder STATUS_SUCCESS oder einen Fehlerstatuscode zurück. Mögliche Fehlerstatuscodes sind:
Bemerkungen
ZwAllocateVirtualMemory können die folgenden Vorgänge ausführen:
Commit eines Bereichs von Seiten, der durch einen vorherigen Aufruf von ZwAllocateVirtualMemoryreserviert ist.
Reservieren Sie eine Region mit kostenlosen Seiten.
Reservieren und übernehmen Sie eine Region mit kostenlosen Seiten.
Kernelmodustreiber können ZwAllocateVirtualMemory verwenden, um eine Reihe von anwendungsverwendbaren virtuellen Adressen im angegebenen Prozess zu reservieren und dann zusätzliche Aufrufe an ZwAllocateVirtualMemory, um einzelne Seiten aus dem reservierten Bereich zu übernehmen. Dadurch kann ein Prozess einen Bereich seines virtuellen Adressraums reservieren, ohne physischen Speicher zu verbrauchen, bis er benötigt wird.
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 nicht zugesichert oder reserviert und kann nicht für den Prozess verwendet werden. ZwAllocateVirtualMemory kann eine kostenlose Seite reservieren oder gleichzeitig reservieren und übernehmen. |
RESERVIERT | Der Adressbereich kann nicht von anderen Zuordnungsfunktionen verwendet werden, die Seite ist jedoch nicht für den Prozess zugänglich und verfügt über keinen physischen Speicher. ZwAllocateVirtualMemory kann eine reservierte Seite übernehmen, aber sie kann sie nicht ein zweites Mal reservieren. ZwFreeVirtualMemory kann eine reservierte Seite freigeben, wodurch sie zu einer kostenlosen Seite wird. |
ENGAGIERT | Physischer Speicher 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, diese Seite zu lesen oder zu schreiben. Wenn der Prozess beendet wird, gibt das System den Speicher für zugesicherte Seiten frei. ZwAllocateVirtualMemory kann eine bereits zugesicherte Seite übernehmen. Dies bedeutet, dass Sie einen Seitenbereich übernehmen können, unabhängig davon, ob sie bereits zugesichert wurden, und die Funktion schlägt nicht fehl. ZwFreeVirtualMemory kann eine zugesicherte Seite außer Kraft setzen, den Speicher der Seite freigeben oder gleichzeitig eine zugesicherte Seite aufheben und freigeben. |
Der durch Aufrufen von ZwAllocateVirtualMemory zugewiesene Speicher muss durch Aufrufen von ZwFreeVirtualMemoryfreigegeben werden.
Weitere Informationen zur Speicherverwaltung finden Sie unter Speicherverwaltung für Windows-Treiber.
Anmerkung
Wenn der Aufruf der ZwAllocateVirtualMemory Funktion im Benutzermodus auftritt, sollten Sie den Namen "NtAllocateVirtualMemory" anstelle von "ZwAllocateVirtualMemory" 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) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | PASSIVE_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport) |
Siehe auch
Verwenden von Nt- und Zw-Versionen der systemeigenen Systemdienste-Routinen