RtlAllocateHeap-Funktion (ntifs.h)
Die RtlAllocateHeap- Routine weist einen Speicherblock von 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, von dem der Speicher zugewiesen wird. Dieser Parameter ist ein Handle, das von einem erfolgreichen Aufruf von RtlCreateHeap zurückgegeben wird.
[in, optional] Flags
Kontrollierbare Aspekte der Heap-Zuordnung. Wenn Sie einen dieser Werte angeben, wird der entsprechende Wert außer Kraft gesetzt, der beim Erstellen des Heaps mit RtlCreateHeap-angegeben wurde. Dieser Parameter kann einen oder mehrere der folgenden Werte sein.
Flagge | Bedeutung |
---|---|
HEAP_GENERATE_EXCEPTIONS | Das System löst eine Ausnahme aus, um einen Funktionsfehler anzugeben, z. B. eine Nichtspeicherbedingung, 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 auf Null initialisiert. Andernfalls wird der Arbeitsspeicher nicht auf Null initialisiert. |
[in] Size
Anzahl der zuzuordnenden Bytes. Wenn der heap, der durch den parameter HeapHandle angegeben wird, ein nicht wachsender Heap ist, muss Size kleiner oder gleich dem virtuellen Speicherschwellenwert des Heaps sein. (Weitere Informationen finden Sie im VirtualMemoryThreshold Member des Parameters Parameter zum 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 die Zuordnung fehlgeschlagen ist.
Bemerkungen
RtlAllocateHeap einen Speicherblock der angegebenen Größe aus dem angegebenen Heap zuordnet.
Um einen Speicherblock freizugeben, der von RtlAllocateHeap-zugewiesen wird, rufen Sie RtlFreeHeap-auf.
Der von RtlAllocateHeap zugeordnete Speicher ist nicht verschiebbar. Da der Speicher nicht verschiebbar ist, ist es möglich, dass der Heap fragmentiert wird.
Die Serialisierung stellt einen gegenseitigen Ausschluss sicher, wenn zwei oder mehr Threads versuchen, gleichzeitig Blöcke vom selben Heap zuzuweisen oder frei zu machen. Es gibt einen geringen Leistungsaufwand für die Serialisierung, muss jedoch verwendet werden, wenn mehrere Threads Speicher aus demselben Heap zuordnen und freizugeben. Durch Festlegen des HEAP_NO_SERIALIZE Werts wird der gegenseitige Ausschluss für den Heap beseitigt. Ohne Serialisierung können zwei oder mehr Threads, die denselben Heap-Handle verwenden, versuchen, gleichzeitig Arbeitsspeicher zuzuweisen oder freizugeben, was wahrscheinlich zu Beschädigungen im Heap führt. Der wert HEAP_NO_SERIALIZE kann daher nur in den folgenden Situationen sicher verwendet werden:
Der Prozess hat nur 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 stellt einen eigenen Mechanismus für den gegenseitigen Ausschluss für einen bestimmten Heap bereit.
Anmerkung
Verwenden Sie zum Schutz vor einer Zugriffsverletzung die strukturierte Ausnahmebehandlung, um code zu schützen, der in einen Heap schreibt oder liest. Weitere Informationen zur strukturierten Ausnahmebehandlung mit Speicherzugriffen finden Sie unter Behandeln von Ausnahmen.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows XP |
Zielplattform- | Universal |
Header- | ntifs.h (einschließlich Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | < DISPATCH_LEVEL |