RtlGetElementGenericTable-Funktion (ntddk.h)
Die RtlGetElementGenericTable-Routine gibt einen Zeiger auf die vom Aufrufer bereitgestellten Daten für ein bestimmtes generisches Tabellenelement zurück.
Syntax
NTSYSAPI PVOID RtlGetElementGenericTable(
[in] PRTL_GENERIC_TABLE Table,
[in] ULONG I
);
Parameter
[in] Table
Zeiger auf die generische Tabelle (RTL_GENERIC_TABLE), aus der das I-th-Element abgerufen werden soll. Die Tabelle muss durch Aufrufen von RtlInitializeGenericTable initialisiert worden sein.
[in] I
Index des ausgewählten Elements. Dieser Wert ist nullbasiert, sodass der Index des zuletzt eingefügten Elements, das derzeit in Table enthalten ist, immer ein Kleiner als der von RtlNumberGenericTableElements zurückgegebene Wert ist.
Rückgabewert
RtlGetElementGenericTable gibt einen Zeiger auf die vom Aufrufer bereitgestellten Daten für das Ith-Element in der generischen Tabelle zurück. Er gibt NULL zurück, wenn der angegebene I zu groß ist oder wenn die generische Tabelle derzeit keine Elemente enthält.
Hinweise
RtlGetElementGenericTable gibt das Ith-Element zurück, das in der generischen Tabelle eingefügt wurde. Um das erste Element abzurufen, legen Sie I auf 0 fest. Um das letzte Element abzurufen, legen Sie I auf (RtlNumberGenericTableElements(Table)-1) fest. Beachten Sie, dass beim Löschen eines Elements aus der generischen Tabelle die Indizes aller Elemente, die nach dem gelöschten Element eingefügt werden, dekrementiert werden. Daher kann sich der Index eines Elements im Laufe der Zeit ändern.
RtlGetElementGenericTable ist effizienter als RtlLookupElementGenericTable , wenn der Aufrufer den Index eines bestimmten Elements bereitstellen kann, für das der Aufrufer Zugriff auf die zugeordneten Daten benötigt. Das wiederholte Aufrufen von RtlGetElementGenericTable zum Testen eines solchen Elements ist jedoch weniger effizient als das Aufrufen von RtlLookupElementGenericTable , um es zu suchen.
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 RtlGetElementGenericTableAvl-Routine anstelle von RtlGetElementGenericTable. Im Aufruf von RtlGetElementGenericTableAvl muss der Aufrufer eine RTL_AVL_TABLE Tabellenstruktur übergeben, anstatt RTL_GENERIC_TABLE.
Aufrufer von RtlGetElementGenericTable müssen am IRQL-DISPATCH_LEVEL < ausgeführt werden, wenn der vom Aufrufer zugewiesene Arbeitsspeicher für die generische Tabelle ausgelagert werden kann.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Universell |
Header | ntddk.h (include Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Beliebige Ebene (siehe Hinweise) |