RtlEnumerateGenericTableWithoutSplaying-Funktion (ntddk.h)
Die RtlEnumerateGenericTableWithoutSplaying Routine wird zum Aufzählen der Elemente in einer generischen Tabelle verwendet.
Syntax
NTSYSAPI PVOID RtlEnumerateGenericTableWithoutSplaying(
[in] PRTL_GENERIC_TABLE Table,
[in, out] PVOID *RestartKey
);
Parameter
[in] Table
Ein Zeiger auf die generische Tabelle (RTL_GENERIC_TABLE). Die Tabelle muss durch Aufrufen von RtlInitializeGenericTable-initialisiert worden sein.
[in, out] RestartKey
Eine Adresse des Elements, das vom vorherigen Aufruf an RtlEnumerateGenericTableWithoutSplayingzurückgegeben wird. Sollte auf NULL- festgelegt werden, wenn die Enumeration beim ersten Element in der Tabelle beginnen soll.
Wenn Sie alle Elemente in der Tabelle aufzählen möchten, verwenden Sie RtlEnumerateGenericTableWithoutSplaying wie folgt:
RestartKey = NULL;
for (ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey);
ptr != NULL;
ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey)) {
// Process the element pointed to by ptr
}
Rückgabewert
RtlEnumerateGenericTableWithoutSplaying gibt einen Zeiger auf die dem Element zugeordnete aufruferdefinierte Struktur zurück. Sie gibt NULL- zurück, wenn RestartKeyNULL- ist und die Tabelle keine Elemente aufweist oder wenn RestartKey ein zurückgegebener Zeiger ist und kein nächstes Element vorhanden ist.
Bemerkungen
Im Gegensatz zu RtlEnumerateGenericTable, RtlEnumerateGenericTableWithoutSplaying die generische Tabelle nicht flacht, indem sie aus einer Wiedergabestruktur in eine sortierte verknüpfte Liste konvertiert wird. RtlEnumerateGenericTableWithoutSplaying ist effizienter und multiprozessorsicherer als RtlEnumerateGenericTable.
RtlEnumerateGenericTableWithoutSplaying kann wiederholt aufgerufen werden, um die Daten des Aufrufers in jedem Element einer generischen Tabelle zu verarbeiten.
Anrufer der Rtl.. GenericTable 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.
Standardmäßig verwendet das Betriebssystem Splay-Strukturen, um generische Tabellen zu implementieren. Unter bestimmten Umständen werden Vorgänge in einem Spielbaum den Baum tief und schmal machen und ihn sogar in eine gerade Linie verwandeln. Sehr tiefe Bäume beeinträchtigen die Leistung von Suchvorgängen. Sie können eine ausgewogenere, flachere Strukturimplementierung generischer Tabellen sicherstellen, indem Sie Adelson-Velsky/Landis (AVL)-Strukturen verwenden. Wenn Sie die generischen Tabellenroutinen so konfigurieren möchten, dass AVL-Strukturen anstelle von Splay-Strukturen in Ihrem Treiber verwendet werden, fügen Sie die folgende Define-Anweisung in eine allgemeine Headerdatei ein, bevor Sie Ntddk.heinschließen:
#define RTL_USE_AVL_TABLES 0
Wenn RTL_USE_AVL_TABLES nicht definiert ist, müssen Sie die AVL-Form der generischen Tabellenroutinen verwenden. Verwenden Sie beispielsweise die RtlEnumerateGenericTableWithoutSplaying Routine anstelle von RtlEnumerateGenericTableWithoutSplayingAvl. Im Aufruf von RtlEnumerateGenericTableWithoutSplayingAvlmuss der Aufrufer eine RTL_AVL_TABLE Tabellenstruktur statt RTL_GENERIC_TABLEübergeben.
Anrufer von RtlEnumerateGenericTableWithoutSplaying müssen bei IRQL-< DISPATCH_LEVEL ausgeführt werden, wenn der vom Aufrufer zugewiesene Speicher für die generische Tabelle seitenfähig ist.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | ntddk.h (enthalten Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | Siehe Abschnitt "Hinweise". |