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 |