Функция RtlGetElementGenericTable (ntddk.h)

Подпрограмма RtlGetElementGenericTable возвращает указатель на предоставленные вызывающим элементом данные для определенного универсального элемента таблицы.

Синтаксис

NTSYSAPI PVOID RtlGetElementGenericTable(
  [in] PRTL_GENERIC_TABLE Table,
  [in] ULONG              I
);

Параметры

[in] Table

Указатель на универсальную таблицу (RTL_GENERIC_TABLE), из которой должен быть получен I-йэлемент. Таблица должна быть инициализирована путем вызова RtlInitializeGenericTable.

[in] I

Индекс выбранного элемента. Это значение отсчитывается от нуля, поэтому индекс последнего вставленного элемента в table всегда на единицу меньше значения, возвращаемого RtlNumberGenericTableElements.

Возвращаемое значение

RtlGetElementGenericTable возвращает указатель на предоставленные вызывающим объектом данные для I-гоэлемента в универсальной таблице. Он возвращает значение NULL , если заданный объект I слишком велик или если универсальная таблица в настоящее время не содержит элементов.

Комментарии

RtlGetElementGenericTable возвращает I-йэлемент, вставленный в общую таблицу. Чтобы получить первый элемент, задайте для I значение 0. Чтобы получить последний элемент, задайте для I значение (RtlNumberGenericTableElements(Table)-1). Обратите внимание, что при удалении элемента из универсальной таблицы индексы всех элементов, вставляемых после удаленного элемента, уменьшается. Таким образом, индекс элемента может со временем меняться.

RtlGetElementGenericTable более эффективен, чем RtlLookupElementGenericTable , если вызывающий объект может предоставить индекс определенного элемента, для которого вызывающему объекту необходим доступ к связанным данным. Однако многократное вызов rtlGetElementGenericTable для проверки на наличие такого элемента менее эффективен, чем вызов RtlLookupElementGenericTable для его обнаружения.

Вызывающие Rtl.. Подпрограммы GenericTable отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации для этой цели.

По умолчанию операционная система использует деревья splay для реализации универсальных таблиц. При некоторых обстоятельствах операции с деревом splay сделают дерево глубоким и узким и даже может превратить его в прямую линию. Очень глубокие деревья ухудшают производительность поиска. С помощью деревьев Adelson-Velsky/Landis (AVL) можно обеспечить более сбалансированную реализацию универсальных таблиц. Если вы хотите настроить в универсальных подпрограммах таблицы использование деревьев AVL вместо деревьев splay в драйвере, вставьте следующую инструкцию define в общий файл заголовка перед включением Ntddk.h:

#define RTL_USE_AVL_TABLES 0

Если RTL_USE_AVL_TABLES не определен, необходимо использовать форму AVL универсальных табличных процедур. Например, используйте подпрограмму RtlGetElementGenericTableAvl вместо RtlGetElementGenericTable. В вызове RtlGetElementGenericTableAvl вызывающий объект должен передать RTL_AVL_TABLE табличную структуру, а не RTL_GENERIC_TABLE.

Вызывающие функции RtlGetElementGenericTable должны выполняться в СРЕДЕ IRQL < DISPATCH_LEVEL если выделенная вызывающим объектом память для универсальной таблицы доступна на страницы.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ntddk.h (включая Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Любой уровень (см. примечания)

См. также раздел

RtlDeleteElementGenericTable

RtlEnumerateGenericTableWithoutSplaying

RtlInitializeGenericTable

RtlInsertElementGenericTable

RtlLookupElementGenericTable

RtlNumberGenericTableElements