Freigeben über


VirtualAllocEx-Funktion (memoryapi.h)

Reserviert, commits oder ändert den Zustand eines Speicherbereichs innerhalb des virtuellen Adressraums eines angegebenen Prozesses. Die Funktion initialisiert den Speicher, den sie zu Null zuweist.

Informationen zum Angeben des NUMA-Knotens für den physischen Speicher finden Sie unter VirtualAllocExNuma.

Syntax

LPVOID VirtualAllocEx(
  [in]           HANDLE hProcess,
  [in, optional] LPVOID lpAddress,
  [in]           SIZE_T dwSize,
  [in]           DWORD  flAllocationType,
  [in]           DWORD  flProtect
);

Parameter

[in] hProcess

Das Handle für einen Prozess. Die Funktion weist Speicher innerhalb des virtuellen Adressraums dieses Prozesses zu.

Das Handle muss über das PROCESS_VM_OPERATION Zugriffsrecht verfügen. Weitere Informationen finden Sie unter Prozesssicherheits- und Zugriffsberechtigungen.

[in, optional] lpAddress

Der Zeiger, der eine gewünschte Startadresse für den Bereich der Seiten angibt, die Sie zuordnen möchten.

Wenn Sie Speicher reservieren, rundet die Funktion diese Adresse auf das nächste Vielfache der Zuordnungs granularität ab.

Wenn Sie bereits reservierten Arbeitsspeicher übernehmen, rundet die Funktion diese Adresse auf die nächste Seitengrenze ab. Um die Größe einer Seite und die Zuordnungs granularität auf dem Hostcomputer zu bestimmen, verwenden Sie die GetSystemInfo--Funktion.

Wenn lpAddressNULL-ist, bestimmt die Funktion, wo die Region zugeordnet werden soll.

Wenn sich diese Adresse in einer Enklave befindet, die Sie nicht initialisiert haben, indem Sie InitializeEnklaveaufrufen, weist VirtualAllocEx eine Seite mit Nullen für die Enklave an dieser Adresse zu. Die Seite muss zuvor nicht ausgelassen werden und wird nicht mit der EEXTEND-Anweisung des Intel Software Guard Extensions-Programmiermodells gemessen.

Wenn die Adresse in einer Enklave, die Sie initialisiert haben, fehlschlägt der Zuordnungsvorgang mit dem ERROR_INVALID_ADDRESS Fehler. Das gilt für Enklaven, die keine dynamische Speicherverwaltung unterstützen (d. h. SGX1). SGX2-Enklaven erlauben die Zuordnung, und die Seite muss von der Enklave akzeptiert werden, nachdem sie zugeteilt wurde.

[in] dwSize

Die Größe des Speicherbereichs, der in Byte zugeordnet werden soll.

Wenn lpAddress-NULL-ist, rundet die Funktion dwSize bis zur nächsten Seitengrenze auf.

Wenn lpAddress- nicht NULL-ist, weist die Funktion alle Seiten zu, die einen oder mehrere Bytes im Bereich von lpAddresslpAddress+dwSizeenthalten. Dies bedeutet beispielsweise, dass ein 2-Byte-Bereich, der eine Seitengrenze überspannt, die funktion beide Seiten zuweist.

[in] flAllocationType

Der Typ der Speicherzuweisung. Dieser Parameter muss einen der folgenden Werte enthalten.

Wert Bedeutung
MEM_COMMIT
0x00001000
Weist Speichergebühren (von der Gesamtgröße des Arbeitsspeichers und der Auslagerungsdateien auf dem Datenträger) für die angegebenen reservierten Speicherseiten zu. Die Funktion garantiert außerdem, dass der Inhalt null ist, wenn der Aufrufer zu einem späteren Zeitpunkt auf den Speicher zugreift. Tatsächliche physische Seiten werden nur zugewiesen, wenn/bis tatsächlich auf die virtuellen Adressen zugegriffen wird.

Rufen Sie VirtualAllocEx- mit MEM_COMMIT | MEM_RESERVEauf, um Seiten in einem Schritt zu reservieren und zu übernehmen.

Wenn Sie versuchen, einen bestimmten Adressbereich zu übernehmen, indem Sie MEM_COMMIT ohne MEM_RESERVE und eine nichtNULL-lpAddress- angeben, tritt ein Fehler auf, es sei denn, der gesamte Bereich wurde bereits reserviert. Der resultierende Fehlercode ist ERROR_INVALID_ADDRESS.

Ein Versuch, eine Seite zu übernehmen, die bereits zugesichert wurde, führt nicht dazu, dass die Funktion fehlschlägt. Dies bedeutet, dass Sie Seiten übernehmen können, ohne zuerst den aktuellen Verpflichtungsstatus jeder Seite zu bestimmen.

Wenn lpAddress eine Adresse innerhalb einer Enklave angibt, muss flAllocationType-MEM_COMMITsein.

MEM_RESERVE
0x00002000
Reserviert einen Bereich des virtuellen Adressraums des Prozesses, ohne tatsächlichen physischen Speicher im Arbeitsspeicher oder in der Auslagerungsdatei auf dem Datenträger zuzuweisen.

Sie übernehmen reservierte Seiten, indem Sie VirtualAllocEx erneut mit MEM_COMMITaufrufen. Rufen Sie VirtualAllocEx- mit MEM_COMMIT | MEM_RESERVEauf, um Seiten in einem Schritt zu reservieren und zu übernehmen.

Andere Speicherzuweisungsfunktionen, z. B. malloc und LocalAlloc-, können erst reservierten Speicher verwenden, wenn sie freigegeben wurde.

MEM_RESET
0x00080000
Gibt an, dass Daten im durch lpAddress- angegebenen Speicherbereich und dwSize- nicht mehr interessant sind. Die Seiten sollten nicht aus der Auslagerungsdatei gelesen oder in die Auslagerungsdatei geschrieben werden. Der Speicherblock wird jedoch später wieder verwendet, sodass er nicht mehr ausgelassen werden sollte. Dieser Wert kann nicht mit einem anderen Wert verwendet werden.

Die Verwendung dieses Werts garantiert nicht, dass der mit MEM_RESET betriebene Bereich Nullen enthält. Wenn der Bereich Nullen enthalten soll, dekommitieren Sie den Speicher, und übermitteln Sie ihn dann erneut.

Wenn Sie MEM_RESETverwenden, ignoriert die VirtualAllocEx--Funktion den Wert fProtect-. Sie müssen jedoch weiterhin fProtect- auf einen gültigen Schutzwert festlegen, z. B. PAGE_NOACCESS.

VirtualAllocEx gibt einen Fehler zurück, wenn Sie MEM_RESET verwenden und der Speicherbereich einer Datei zugeordnet ist. Eine freigegebene Ansicht ist nur zulässig, wenn sie einer Auslagerungsdatei zugeordnet ist.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO sollte nur für einen Adressbereich aufgerufen werden, auf den MEM_RESET zuvor erfolgreich angewendet wurde. Es gibt an, dass die Daten im angegebenen Speicherbereich, der durch lpAddress und dwSize- für den Aufrufer von Interesse ist und versucht, die Auswirkungen von MEM_RESETrückgängig zu machen. Wenn die Funktion erfolgreich ist, bedeutet dies, dass alle Daten im angegebenen Adressbereich intakt sind. Wenn die Funktion fehlschlägt, wurden mindestens einige der Daten im Adressbereich durch Nullen ersetzt.

Dieser Wert kann nicht mit einem anderen Wert verwendet werden. Wenn MEM_RESET_UNDO für einen Adressbereich aufgerufen wird, der zuvor nicht MEM_RESET wurde, ist das Verhalten nicht definiert. Wenn Sie MEM_RESETangeben, ignoriert die funktion VirtualAllocEx den Wert flProtect. Sie müssen jedoch weiterhin flProtect- auf einen gültigen Schutzwert festlegen, z. B. PAGE_NOACCESS.

Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Das flag MEM_RESET_UNDO wird erst unter Windows 8 und Windows Server 2012 unterstützt.

 

Dieser Parameter kann auch die folgenden Werte wie angegeben angeben.

Wert Bedeutung
MEM_LARGE_PAGES
0x20000000
Ordnet Arbeitsspeicher mithilfe Unterstützung für große Seitenzu.

Die Größe und Ausrichtung müssen ein Vielfaches des Minimums für große Seiten sein. Verwenden Sie zum Abrufen dieses Werts die GetLargePageMinimum-Funktion.

Wenn Sie diesen Wert angeben, müssen Sie auch MEM_RESERVE und MEM_COMMITangeben.

MEM_PHYSICAL
0x00400000
Reserviert einen Adressbereich, der verwendet werden kann, um Adressfenstererweiterungen (AWE)-Seiten zuzuordnen.

Dieser Wert muss mit MEM_RESERVE und keinen anderen Werten verwendet werden.

MEM_TOP_DOWN
0x00100000
Weist Speicher mit der höchsten möglichen Adresse zu. Dies kann langsamer als die regulären Zuordnungen sein, insbesondere wenn viele Zuordnungen vorhanden sind.

[in] flProtect

Der Speicherschutz für den Bereich der zuzuordnenden Seiten. Wenn die Seiten zugesichert werden, können Sie eine der Speicherschutzkonstantenangeben.

Wenn lpAddress- eine Adresse innerhalb einer Enklave angibt, kann flProtect keine der folgenden Werte sein:

  • PAGE_NOACCESS
  • PAGE_GUARD
  • PAGE_NOCACHE
  • PAGE_WRITECOMBINE

Beim Zuweisen des dynamischen Speichers für eine Enklave muss der parameter flProtectPAGE_READWRITE oder PAGE_EXECUTE_READWRITEsein.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert die Basisadresse des zugeordneten Seitenbereichs.

Wenn die Funktion fehlschlägt, ist der Rückgabewert NULL-. Rufen Sie GetLastErrorauf, um erweiterte Fehlerinformationen zu erhalten.

Bemerkungen

Jede Seite verfügt über einen zugeordneten Seitenzustand. Die funktion VirtualAllocEx kann die folgenden Vorgänge ausführen:

  • Übernehmen eines Bereichs reservierter Seiten
  • Reservieren einer Region mit kostenlosen Seiten
  • Gleichzeitiges Reservieren und Übernehmen einer Region kostenloser Seiten
VirtualAllocEx- kann keine reservierte Seite reservieren. Sie kann eine Seite übernehmen, die bereits zugesichert ist. Dies bedeutet, dass Sie einen Seitenbereich übernehmen können, unabhängig davon, ob sie bereits zugesichert wurden, und die Funktion schlägt nicht fehl.

Sie können VirtualAllocEx- verwenden, um einen Seitenblock zu reservieren und dann zusätzliche Aufrufe an VirtualAllocEx zu tätigen, um einzelne Seiten aus dem reservierten Block zu übernehmen. Dadurch kann ein Prozess einen Bereich seines virtuellen Adressraums reservieren, ohne physischen Speicher zu verbrauchen, bis er benötigt wird.

Wenn der parameter lpAddress nicht NULList, verwendet die Funktion die lpAddress und dwSize Parameter, um den bereich der zuzuordnenden Seiten zu berechnen. Der aktuelle Zustand des gesamten Seitenbereichs muss mit dem Typ der Zuordnung kompatibel sein, die vom flAllocationType Parameter angegeben wurde. Andernfalls schlägt die Funktion fehl, und keiner der Seiten wird zugewiesen. Diese Kompatibilitätsanforderung schließt das Commit einer bereits zugesicherten Seite nicht aus; siehe die vorherige Liste.

Um dynamisch generierten Code auszuführen, verwenden Sie VirtualAllocEx-, um Arbeitsspeicher und die VirtualProtectEx--Funktion zuzuweisen, um PAGE_EXECUTE Zugriff zu gewähren.

Die funktion VirtualAllocEx kann verwendet werden, um eine Adressfenstererweiterungen (AWE)-Bereich des Arbeitsspeichers innerhalb des virtuellen Adressraums eines angegebenen Prozesses zu reservieren. Dieser Speicherbereich kann dann verwendet werden, um physische Seiten nach Bedarf der Anwendung in und außerhalb des virtuellen Arbeitsspeichers zuzuordnen. Die werte MEM_PHYSICAL und MEM_RESERVE müssen im parameter AllocationType festgelegt werden. Der wert MEM_COMMIT darf nicht festgelegt werden. Der Seitenschutz muss auf PAGE_READWRITEfestgelegt werden.

Die VirtualFreeEx--Funktion kann eine zugesicherte Seite dekommitieren, den Speicher der Seite freigeben oder gleichzeitig eine zugesicherte Seite aufheben und freigeben. Sie kann auch eine reservierte Seite freigeben, wodurch sie eine kostenlose Seite wird.

Beim Erstellen einer Region, die ausführbar ist, trägt das aufrufende Programm die Verantwortung für die Sicherstellung der Cachekohärenz über einen entsprechenden Aufruf von FlushInstructionCache, nachdem der Code eingerichtet wurde. Andernfalls kann der Versuch, Code aus dem neu ausführbaren Bereich auszuführen, zu unvorhersehbaren Ergebnissen führen.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header- memoryapi.h (include Windows.h, Memoryapi.h)
Library onecore.lib
DLL- Kernel32.dll

Siehe auch

Speicherverwaltungsfunktionen

ReadProcessMemory-

virtuelle Speicherfunktionen

VirtualAllocExNuma

VirtualFreeEx-

VirtualLock-

VirtualProtect-

VirtualQuery-

WriteProcessMemory-