RtlAllocateHeap-Funktion (ntifs.h)

Die RtlAllocateHeap-Routine weist einen Speicherblock aus einem Heap zu.

Syntax

NTSYSAPI PVOID RtlAllocateHeap(
  [in]           PVOID  HeapHandle,
  [in, optional] ULONG  Flags,
  [in]           SIZE_T Size
);

Parameter

[in] HeapHandle

Handle für einen privaten Heap, aus dem der Arbeitsspeicher zugewiesen wird. Dieser Parameter ist ein Handle, das von einem erfolgreichen Aufruf von RtlCreateHeap zurückgegeben wird.

[in, optional] Flags

Steuerbare Aspekte der Heapzuordnung. Wenn Sie einen dieser Werte angeben, wird der entsprechende Wert überschrieben, der beim Erstellen des Heaps mit RtlCreateHeap angegeben wurde. Dieser Parameter kann einen oder mehrere der folgenden Werte aufweisen.

Flag Bedeutung
HEAP_GENERATE_EXCEPTIONS Das System löst eine Ausnahme aus, um auf einen Funktionsfehler hinzuweisen, z. B. eine Bedingung außerhalb des Arbeitsspeichers, anstatt NULL zurückzugeben.
HEAP_NO_SERIALIZE Der gegenseitige Ausschluss wird nicht verwendet, während RtlAllocateHeap auf den Heap zugreift.
HEAP_ZERO_MEMORY Der zugewiesene Arbeitsspeicher wird mit 0 initialisiert. Andernfalls wird der Arbeitsspeicher nicht auf null initialisiert.

[in] Size

Anzahl der zu zuweisenden Bytes. Wenn es sich bei dem durch den HeapHandle-Parameter angegebenen Heap um einen nicht nachwachsenden Heap handelt, muss die Größe kleiner oder gleich dem Schwellenwert für den virtuellen Speicher des Heaps sein. (Weitere Informationen finden Sie im VirtualMemoryThreshold-Member des Parameters-Parameters zu RtlCreateHeap.)

Rückgabewert

Wenn der Aufruf von RtlAllocateHeap erfolgreich ist, ist der Rückgabewert ein Zeiger auf den neu zugewiesenen Block. Der Rückgabewert ist NULL, wenn bei der Zuordnung ein Fehler aufgetreten ist.

Hinweise

RtlAllocateHeap weist einen Speicherblock der angegebenen Größe aus dem angegebenen Heap zu.

Rufen Sie RtlFreeHeap auf, um einen von RtlAllocateHeap zugewiesenen Speicherblock freizugeben.

Der von RtlAllocateHeap zugewiesene Speicher kann nicht verschoben werden. Da der Speicher nicht verschiebbar ist, kann der Heap fragmentiert werden.

Die Serialisierung stellt einen gegenseitigen Ausschluss sicher, wenn zwei oder mehr Threads versuchen, gleichzeitig Blöcke aus demselben Heap zuzuweisen oder frei zu geben. Die Serialisierung verursacht geringe Leistungskosten, muss jedoch immer dann verwendet werden, wenn mehrere Threads Arbeitsspeicher aus demselben Heap zuweisen und freizugeben. Das Festlegen des HEAP_NO_SERIALIZE-Werts beseitigt den gegenseitigen Ausschluss auf dem Heap. Ohne Serialisierung können zwei oder mehr Threads, die dasselbe Heaphandle verwenden, versuchen, gleichzeitig Arbeitsspeicher zuzuweisen oder freizugeben, was wahrscheinlich zu Einer Beschädigung des Heaps führt. Der HEAP_NO_SERIALIZE-Wert kann daher nur in den folgenden Situationen sicher verwendet werden:

  • Der Prozess verfügt nur über einen Thread.

  • Der Prozess verfügt über mehrere Threads, aber nur ein Thread ruft die Heapfunktionen für einen bestimmten Heap auf.

  • Der Prozess verfügt über mehrere Threads, und die Anwendung bietet einen eigenen Mechanismus zum gegenseitigen Ausschluss von einem bestimmten Heap.

Hinweis

Um sich vor einer Zugriffsverletzung zu schützen, verwenden Sie die strukturierte Ausnahmebehandlung, um Code zu schützen, der in einen Heap schreibt oder daraus liest. Weitere Informationen zur strukturierten Ausnahmebehandlung mit Speicherzugriffen finden Sie unter Behandeln von Ausnahmen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP
Zielplattform Universell
Header ntifs.h (include Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Weitere Informationen

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap