NtAllocateVirtualMemory-Funktion (ntifs.h)
Die NtAllocateVirtualMemory Routinereserven, Commits oder beides, eine Region von Seiten innerhalb des virtuellen Adressraums des Benutzermodus eines angegebenen Prozesses.
Syntax
__kernel_entry NTSYSCALLAPI NTSTATUS NtAllocateVirtualMemory(
[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.hdefiniert 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 von BaseAddress- nichtNULL-ist, wird der Bereich beginnend mit der angegebenen virtuellen Adresse auf die nächste Adressgrenze der Hostseite aufgerundet. Wenn der Anfangswert BaseAddress-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. Wird nur verwendet, wenn das Betriebssystem bestimmt, wo die Region zugeordnet werden soll, wie wenn BaseAddress-* NULL-ist. Beachten Sie, dass ZeroBits, wenn nullBits größer als 32 ist, zu einer Bitmaske wird.
[in, out] RegionSize
Ein Zeiger auf eine Variable, die die tatsächliche Größe des zugeordneten Seitenbereichs in Byte erhält. Der Anfangswert von RegionSize gibt die Größe des Bereichs in Bytes an und wird auf die nächste Begrenzung der Hostseitengröße aufgerundet. RegionSize- kann bei eingaben nicht null sein.
[in] AllocationType
Eine Bitmaske mit Flags, die den Typ der Zuordnung angeben, die für den angegebenen Seitenbereich ausgeführt werden soll. In der folgenden Tabelle werden die am häufigsten verwendeten Flags beschrieben. Eine vollständige Liste der möglichen Flags und Beschreibungen finden Sie unter VirtualAlloc.
Anmerkung
Einer von MEM_COMMIT, MEM_RESET oder MEM_RESERVE muss festgelegt werden.
Flagge | Bedeutung |
---|---|
MEM_COMMIT | Der angegebene Seitenbereich muss zugesichert werden. |
MEM_RESERVE | Der angegebene Seitenbereich muss reserviert 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. Der Parameter Protect wird nicht verwendet, muss jedoch auf einen gültigen Wert festgelegt werden. Wenn MEM_RESET festgelegt ist, wird möglicherweise keine andere Kennzeichnung festgelegt. |
Andere MEM_XXX Flags | Siehe VirtualAlloc. |
[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_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
NtAllocateVirtualMemory gibt entweder STATUS_SUCCESS oder einen Fehlerstatuscode zurück. Mögliche Fehlerstatuscodes sind:
- STATUS_ACCESS_DENIED
- STATUS_ALREADY_COMMITTED
- STATUS_COMMITMENT_LIMIT
- STATUS_CONFLICTING_ADDRESSES
- STATUS_INSUFFICIENT_RESOURCES
- STATUS_INVALID_HANDLE
- STATUS_INVALID_PAGE_PROTECTION
- STATUS_NO_MEMORY
- STATUS_OBJECT_TYPE_MISMATCH
- STATUS_PROCESS_IS_TERMINATING
Bemerkungen
NtAllocateVirtualMemory kann die folgenden Vorgänge ausführen:
- Commit eines Bereichs von Seiten, der durch einen vorherigen Aufruf von NtAllocateVirtualMemoryreserviert ist.
- Reservieren Sie eine Region mit kostenlosen Seiten.
- Reservieren und übernehmen Sie eine Region mit kostenlosen Seiten.
Kernelmodustreiber können NtAllocateVirtualMemory- verwenden, um eine Reihe von anwendungsverwendbaren virtuellen Adressen im angegebenen Prozess zu reservieren und dann zusätzliche Aufrufe an NtAllocateVirtualMemory, 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. NtAllocateVirtualMemory 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. NtAllocateVirtualMemory kann eine reservierte Seite übernehmen, aber sie kann sie nicht ein zweites Mal reservieren. NtFreeVirtualMemory kann eine reservierte Seite freigeben, wodurch sie eine kostenlose 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. NtAllocateVirtualMemory 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. NtFreeVirtualMemory kann eine zugesicherte Seite außer Anspruch nehmen, den Speicher der Seite freigeben oder gleichzeitig eine zugesicherte Seite aufheben und freigeben. |
Der durch Aufrufen NtAllocateVirtualMemory zugewiesene Speicher muss durch Aufrufen NtFreeVirtualMemoryfreigegeben werden.
Weitere Informationen zur Speicherverwaltung finden Sie unter Speicherverwaltung für Windows-Treiber.
Hinweis Wenn der Aufruf der NtAllocateVirtualMemory 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, PowerIrpDDis, SpNoWait, StorPortStartIo |