RtlInitializeGenericTableAvl-Funktion (ntddk.h)
Die RtlInitializeGenericTableAvl Routine initialisiert eine generische Tabelle mit Adelson-Velsky/Landis (AVL)-Strukturen.
Syntax
NTSYSAPI VOID RtlInitializeGenericTableAvl(
[out] PRTL_AVL_TABLE Table,
[in] PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
[in] PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
[in] PRTL_AVL_FREE_ROUTINE FreeRoutine,
[in, optional] PVOID TableContext
);
Parameter
[out] Table
Ein Zeiger auf einen vom Aufrufer zugewiesenen Puffer, der mindestens Größe von(RTL_AVL_TABLE) Bytes in größe sein muss, um die initialisierte generische Tabellenstruktur zu enthalten.
[in] CompareRoutine
Ein Einstiegspunkt einer Vergleichsrückrufroutine, deklariert wie folgt:
RTL_GENERIC_COMPARE_RESULTS
(*PRTL_AVL_COMPARE_ROUTINE) (
__in struct _RTL_AVL_TABLE *Table,
__in PVOID FirstStruct,
__in PVOID SecondStruct
);
Die CompareRoutine Parameter sind wie folgt:
Tabelle (CompareRoutine)
Ein Zeiger auf die generische Tabelle.
FirstStruct
Ein Zeiger auf das erste zu vergleichende Element.
SecondStruct
Ein Zeiger auf das zweite zu vergleichende Element.
Die CompareRoutine- muss die Sortierung aller Elemente in der generischen Tabelle streng nachverfolgen, damit sie ein bestimmtes Element identifizieren kann. Die aufruferdefinierte Struktur für Elementdaten enthält in der Regel ein Element, dessen Wert eindeutig ist und als Sortierschlüssel verwendet werden kann. Alle Rtl... GenericTableAvl Routinen, die die CompareRoutine aufrufen, einen Pufferzeiger als Parameter verwenden, der wiederum an die CompareRoutineübergeben wird. Der Puffer enthält einen vom Aufrufer bereitgestellten Schlüsselwert, der vom CompareRoutine- mit dem Schlüssel des gesuchten Elements abgeglichen werden soll.
Bei zwei solchen Schlüsselwerten gibt die CompareRoutineGenericLessThan, GenericGreaterThanoder GenericEqualzurück.
[in] AllocateRoutine
Ein Einstiegspunkt einer Zuordnungsrückrufroutine, die wie folgt deklariert wird:
PVOID
(*PRTL_AVL_ALLOCATE_ROUTINE) (
__in struct _RTL_AVL_TABLE *Table,
__in CLONG ByteSize
);
Die parameter AllocateRoutine sind wie folgt:
Tabelle (AllocateRoutine)
Ein Zeiger auf die generische Tabelle.
ByteSize
Die Anzahl der zuzuordnenden Bytes.
Für jedes neue Element wird die AllocateRoutine aufgerufen, um Speicher für vom Anrufer bereitgestellte Daten sowie zusätzlichen Speicher für die Verwendung durch den Rtl zuzuweisen... GenericTableAvl Routinen. Beachten Sie, dass aufruferbasierte Routinen aufgrund dieser "zusätzlichen Arbeitsspeicher" nicht auf die erste Größe von(RTL_BALANCED_LINKS) Bytes eines Elements in der generischen Tabelle zugreifen dürfen.
[in] FreeRoutine
Ein Einstiegspunkt einer Deallocation-Rückrufroutine, deklariert wie folgt:
VOID
(*PRTL_AVL_FREE_ROUTINE) (
__in struct _RTL_AVL_TABLE *Table,
__in PVOID Buffer
);
Die parameter FreeRoutine sind wie folgt:
Tabelle (FreeRoutine)
Ein Zeiger auf die generische Tabelle.
Puffer
Ein Zeiger auf das Element, das gelöscht wird.
Rtl... GenericTableAvl- Routinen rufen die FreeRoutine- auf, um speicheraufzuweisen, damit Elemente aus der generischen Tabelle gelöscht werden. Die FreeRoutine- ist das Gegenteil der AllocateRoutine.
[in, optional] TableContext
Ein optionaler Zeiger auf einen vom Aufrufer bereitgestellten Kontext für die generische Tabelle. Dieser Parameter kann NULL-sein.
Rückgabewert
Nichts
Bemerkungen
Dateisysteme rufen RtlInitializeGenericTableAvl auf, um eine generische Tabelle zum Speichern systemspezifischer Daten zu initialisieren, z. B. Nachschlageinformationen für aktuell geöffnete Dateien. Die Sortierreihenfolge, Struktur und Der Inhalt der Elemente werden aufruferdefiniert.
Dateisysteme müssen RtlInitializeGenericTableAvl aufrufen, um die generische Tabelle zu initialisieren, bevor sie andere Rtl verwenden... GenericTableAvl Routinen für die neue generische Tabelle. Die initialisierte generische Tabellenstruktur sollte als undurchsichtig betrachtet werden.
Anrufer der Rtl... GenericTableAvl Routinen sind für die ausschließliche Synchronisierung des Zugriffs auf die generische Tabelle verantwortlich. Ein exklusiver schneller Mutex ist der effizienteste Synchronisierungsmechanismus für diesen Zweck.
Die vom Aufrufer bereitgestellte CompareRoutine- wird aufgerufen, bevor die AllocateRoutine-, um einen geeigneten Speicherort zu finden, an dem ein neues Element eingefügt werden soll. Die CompareRoutine wird auch vor dem FreeRoutine- aufgerufen, um ein zu löschenes Element zu suchen.
Die RtlInitializeGenericTableAvl Routine weist explizit eine generische Tabelle zu, die AVL-Strukturen verwendet. Verwendung dieser Routine und der anderen Rtl... GenericTableAvl- Routinen sind erforderlich, wenn AVL-strukturbasierte Tabellen erwünscht sind und RTL_USE_AVL_TABLES nicht definiert werden, bevor Ntddk.heingeschlossen wird.
Wenn Sie die generischen Tabellenroutinen konfigurieren möchten, Rtl... GenericTable, um AVL-Strukturen anstelle von Splay-Strukturen in Ihrem Treiber zu verwenden, fügen Sie die folgende Define-Anweisung in eine allgemeine Headerdatei ein, bevor Ntddk.heingeschlossen wird:
`#define RTL_USE_AVL_TABLES 0`
Anrufer von RtlInitializeGenericTableAvl müssen bei IRQL-<= DISPATCH_LEVEL ausgeführt werden. Beachten Sie, dass, wenn Rtl... GenericTableAvl- Routinen sind für IRQL-DISPATCH_LEVEL, die CompareRoutine-, "AllocateRoutine" und FreeRoutine- müssen alle nicht seitenseitigen Code sein, und die "AllocateRoutine"- sollten Speicher aus nicht seitenseitigem Pool zuweisen.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | ntddk.h (include Ntddk.h, Ntifs.h, Fltkernel.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | IRQL-<= DISPATCH_LEVEL (siehe Abschnitt "Hinweise") |
Siehe auch
RtlDeleteElementGenericTableAvl
RtlInsertElementGenericTableAvl