Freigeben über


RtlEnumerateGenericTableWithoutSplaying-Funktion (ntddk.h)

Die RtlEnumerateGenericTableWithoutSplaying-Routine wird verwendet, um die Elemente in einer generischen Tabelle aufzulisten.

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 von RtlEnumerateGenericTableWithoutSplaying zurückgegeben wurde. Sollte auf NULL festgelegt werden, wenn die Enumeration beim ersten Element in der Tabelle beginnen soll.

Um alle Elemente in der Tabelle aufzulisten, 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 vom Aufrufer definierte Struktur zurück, die dem Element zugeordnet ist. Es gibt NULL zurück, wenn RestartKeyNULL ist und die Tabelle keine Elemente enthält oder wenn RestartKey ein zurückgegebener Zeiger ist und kein nächstes Element vorhanden ist.

Hinweise

Im Gegensatz zu RtlEnumerateGenericTable wird die generische Tabelle von RtlEnumerateGenericTableWithoutSplaying nicht abgeflacht, indem sie aus einer splay-Struktur 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 ausschließlich für die 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 wird die Struktur durch Vorgänge in einer Splay-Struktur tief und schmal und kann sogar in eine gerade Linie umgewandelt werden. Sehr tiefe Bäume beeinträchtigen die Leistung von Suchvorgängen. Mithilfe von Adelson-Velsky/Landis-Bäumen (AVL) können Sie eine ausgewogenere, flachere Strukturimplementierung generischer Tabellen sicherstellen. Wenn Sie die generischen Tabellenroutinen so konfigurieren möchten, dass sie AVL-Strukturen anstelle von splay-Strukturen in Ihrem Treiber verwenden, fügen Sie die folgende define-Anweisung in eine allgemeine Headerdatei ein, bevor Sie Ntddk.h einschließ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 Wiedergaberoutine "RtlEnumerateGenericTableWithoutS" anstelle von "RtlEnumerateGenericTableWithoutSplayingAvl". Im Aufruf von RtlEnumerateGenericTableWithoutSplayingAvl muss der Aufrufer eine RTL_AVL_TABLE Tabellenstruktur statt RTL_GENERIC_TABLE übergeben.

Aufrufer von RtlEnumerateGenericTableWithoutSplaying müssen bei IRQL < DISPATCH_LEVEL ausgeführt werden, wenn der vom Aufrufer zugewiesene Arbeitsspeicher für die generische Tabelle auslagerungsfähig ist.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header ntddk.h (include Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Weitere Informationen finden Sie im Abschnitt mit den Hinweisen.

Weitere Informationen

RtlEnumerateGenericTable

RtlInitializeGenericTable

RtlIsGenericTableEmpty

RtlNumberGenericTableElements