VirtualAllocFromApp-Funktion (memoryapi.h)

Reserviert, committent oder ändert den Zustand einer Region von Seiten im virtuellen Adressraum des aufrufenden Prozesses. Der von dieser Funktion zugewiesene Arbeitsspeicher wird automatisch auf null initialisiert.

Syntax

PVOID VirtualAllocFromApp(
  [in, optional] PVOID  BaseAddress,
  [in]           SIZE_T Size,
  [in]           ULONG  AllocationType,
  [in]           ULONG  Protection
);

Parameter

[in, optional] BaseAddress

Die Startadresse der zuzuordnenden Region. Wenn der Arbeitsspeicher reserviert wird, wird die angegebene Adresse auf das nächste Vielfache der Zuordnungsgranularität gerundet. Wenn der Speicher bereits reserviert ist und ein Commit ausgeführt wird, wird die Adresse auf die Grenze der nächsten Seite gerundet. Verwenden Sie die GetSystemInfo-Funktion , um die Größe einer Seite und die Granularität der Zuordnung auf dem Hostcomputer zu bestimmen. Wenn dieser Parameter NULL ist, bestimmt das System, wo die Region zugeordnet werden soll.

[in] Size

Die Größe der Region in Bytes. Wenn der BaseAddress-ParameterNULL ist, wird dieser Wert auf die Nächste Seitengrenze aufgerundet. Andernfalls enthalten die zugeordneten Seiten alle Seiten, die mindestens ein Bytes im Bereich von BaseAddress bis BaseAddress+Size enthalten. Dies bedeutet, dass ein 2-Byte-Bereich, der eine Seitengrenze überspannt, dazu führt, dass beide Seiten in der zugeordneten Region eingeschlossen werden.

[in] AllocationType

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

Wert Bedeutung
MEM_COMMIT
0x00001000
Weist Speichergebühren (aus der Gesamtgröße des Arbeitsspeichers und den Auslagerungsdateien auf dem Datenträger) für die angegebenen reservierten Speicherseiten zu. Die Funktion garantiert auch, dass der Inhalt null ist, wenn der Aufrufer später zunächst auf den Speicher zugreift. Die tatsächlichen physischen Seiten werden erst zugeordnet, wenn/bis auf die virtuellen Adressen tatsächlich zugegriffen wird.

Um Seiten in einem Schritt zu reservieren und zu commiten, rufen Sie VirtualAllocFromApp mit MEM_COMMIT | MEM_RESERVEauf.

Der Versuch, einen bestimmten Adressbereich durch Angabe MEM_COMMIT ohne MEM_RESERVE und einer BaseAddress ohne NULL zu committen, schlägt fehl, es sei denn, der gesamte Bereich wurde bereits reserviert. Der resultierende Fehlercode ist ERROR_INVALID_ADDRESS.

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

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

Sie können reservierte Seiten in nachfolgenden Aufrufen der Funktion VirtualAllocFromApp committen. Um Seiten in einem Schritt zu reservieren und zu committen, rufen Sie VirtualAllocFromApp mit MEM_COMMIT | MEM_RESERVE auf.

Andere Speicherbelegungsfunktionen wie malloc und LocalAlloc können einen reservierten Speicherbereich erst verwenden, wenn er freigegeben wird.

MEM_RESET
0x00080000
Gibt an, dass Daten im durch BaseAddress und Size angegebenen Speicherbereich nicht mehr von Interesse sind. Die Seiten sollten nicht aus der Auslagerungsdatei gelesen oder in diese geschrieben werden. Der Speicherblock wird jedoch später wieder verwendet, sodass er nicht dekommittiert werden sollte. Dieser Wert kann nicht mit anderen Werten verwendet werden.

Die Verwendung dieses Werts garantiert nicht, dass der Bereich, der mit MEM_RESET betrieben wird, Nullen enthält. Wenn der Bereich Nullen enthalten soll, heben Sie den Arbeitsspeicher auf, und legen Sie ihn dann erneut zurück.

Wenn Sie MEM_RESET angeben, ignoriert die VirtualAllocFromApp-Funktion den Wert von Protection. Sie müssen den Schutz jedoch weiterhin auf einen gültigen Schutzwert festlegen, z. B. PAGE_NOACCESS.

VirtualAllocFromApp gibt einen Fehler zurück, wenn Sie MEM_RESET verwenden und der Speicherbereich einer Datei zugeordnet ist. Eine freigegebene Ansicht ist nur akzeptabel, 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 von BaseAddress und Size angegeben wird, für den Aufrufer von Interesse sind, und versucht, die Auswirkungen von MEM_RESET umzukehren. Wenn die Funktion erfolgreich ist, bedeutet dies, dass alle Daten im angegebenen Adressbereich intakt sind. Wenn die Funktion fehlschlägt, wurden mindestens einige Daten im Adressbereich durch Nullen ersetzt.

Dieser Wert kann nicht mit anderen Werten 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_RESET angeben, ignoriert die VirtualAllocFromApp-Funktion den Wert von Protection. Sie müssen den Schutz jedoch weiterhin auf einen gültigen Schutzwert festlegen, z. B. PAGE_NOACCESS.

 

Dieser Parameter kann auch die folgenden Werte angeben, wie angegeben.

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

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

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

MEM_PHYSICAL
0x00400000
Reserviert einen Adressbereich, der zum Zuordnen von AWE-Seiten ( Address Windowing Extensions ) verwendet werden kann.

Dieser Wert muss mit MEM_RESERVE und keinem anderen Wert verwendet werden.

MEM_TOP_DOWN
0x00100000
Ordnet Arbeitsspeicher an der höchstmöglichen Adresse zu. Dies kann langsamer sein als reguläre Zuordnungen, insbesondere wenn viele Zuordnungen vorhanden sind.
MEM_WRITE_WATCH
0x00200000
Bewirkt, dass das System Seiten nachverfolgt, die in der zugeordneten Region geschrieben werden. Wenn Sie diesen Wert angeben, müssen Sie auch MEM_RESERVE angeben.

Rufen Sie die GetWriteWatch-Funktion auf, um die Adressen der Seiten abzurufen, die seit der Zuordnung der Region oder dem Zurücksetzen des Schreibnachverfolgungsstatus geschrieben wurden. Um den Schreibnachverfolgungsstatus zurückzusetzen, rufen Sie GetWriteWatch oder ResetWriteWatch auf. Die Schreibnachverfolgungsfunktion bleibt für den Speicherbereich aktiviert, bis die Region freigegeben wird.

[in] Protection

Der Speicherschutz für die Region der zuzuordnenden Seiten. Wenn die Seiten committet werden, können Sie eine der Speicherschutzkonstanten angeben. Die folgenden Konstanten generieren einen Fehler:

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

Rückgabewert

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

Wenn bei der Funktion ein Fehler auftritt, ist der Rückgabewert NULL. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

Hinweise

Sie können VirtualAllocFromApp über Windows Store-Apps mit JIT-Funktionen (Just-in-Time) aufrufen, um JIT-Funktionen zu verwenden. Die App muss die CodeGeneration-Funktion in der App-Manifestdatei enthalten, um JIT-Funktionen verwenden zu können.

Jede Seite hat einen zugeordneten Seitenzustand. Die VirtualAllocFromApp-Funktion kann die folgenden Vorgänge ausführen:

  • Committen einer Region mit reservierten Seiten
  • Reservieren einer Region mit kostenlosen Seiten
  • Gleichzeitiges Reservieren und Committen einer Region mit kostenlosen Seiten
VirtualAllocFromApp kann keine reservierte Seite reservieren. Es kann einen Commit für eine Seite ausführen, die bereits committet wurde. Dies bedeutet, dass Sie einen Bereich von Seiten committen können, unabhängig davon, ob sie bereits committet wurden, und die Funktion nicht fehlschlägt.

Sie können VirtualAllocFromApp verwenden, um einen Block von Seiten zu reservieren und dann zusätzliche Aufrufe an VirtualAllocFromApp auszuführen, um einzelne Seiten aus dem reservierten Block zu committen. Dadurch kann ein Prozess einen Bereich des virtuellen Adressraums reservieren, ohne physischen Speicher zu verwenden, bis er benötigt wird.

Wenn der BaseAddress-Parameter nicht NULL ist, verwendet die Funktion die Parameter BaseAddress und Size , um den Bereich der zuzuordnenden Seiten zu berechnen. Der aktuelle Zustand des gesamten Seitenbereichs muss mit dem Typ der Zuordnung kompatibel sein, der durch den AllocationType-Parameter angegeben wird. Andernfalls schlägt die Funktion fehl, und keine der Seiten wird zugeordnet. Diese Kompatibilitätsanforderung schließt das Committen einer bereits committeten Seite nicht aus, wie bereits erwähnt.

VirtualAllocFromApp lässt die Erstellung ausführbarer Seiten nicht zu.

Die VirtualAllocFromApp-Funktion kann verwendet werden, um einen AWE-Bereich ( Address Windowing Extensions ) im virtuellen Adressraum eines angegebenen Prozesses zu reservieren. Dieser Bereich des Arbeitsspeichers kann dann verwendet werden, um physische Seiten in und aus virtuellem Arbeitsspeicher zuzuordnen, wie von der Anwendung benötigt. Die werte MEM_PHYSICAL und MEM_RESERVE müssen im AllocationType-Parameter festgelegt werden. Der MEM_COMMIT Wert darf nicht festgelegt werden. Der Seitenschutz muss auf PAGE_READWRITE festgelegt werden.

Die VirtualFree-Funktion kann eine committete Seite deaktivieren und den Speicher der Seite freigeben, oder sie kann gleichzeitig die Deaktivierung und Freigabe einer committeten Seite ausführen. Es kann auch eine reservierte Seite freigeben, was sie zu einer kostenlosen Seite macht.

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 festgelegt wurde. Andernfalls können Versuche, Code aus dem neu ausführbaren Bereich auszuführen, zu unvorhersehbaren Ergebnissen führen.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 10 [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2016 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile memoryapi.h (windows.h einschließen)
Bibliothek WindowsApp.lib
DLL Kernel32.dll

Siehe auch

Speicherverwaltungsfunktionen

Funktionen des virtuellen Speichers

VirtualAlloc

VirtualAllocEx

VirtualFree

VirtualLock

VirtualProtectFromApp

Virtualquery