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

Подпрограмма RtlGetElementGenericTableAvl возвращает указатель на предоставленные вызывающим объектом данные для определенного универсального табличного элемента Adelson-Velsky/Landis (AVL).

Синтаксис

NTSYSAPI PVOID RtlGetElementGenericTableAvl(
  [in] PRTL_AVL_TABLE Table,
  [in] ULONG          I
);

Параметры

[in] Table

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

[in] I

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

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

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

Комментарии

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

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

Вызывающие 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.

Вызывающие методы RtlGetElementGenericTableAvl должны выполняться в IRQL < DISPATCH_LEVEL если выделенная вызывающим объектом память для универсальной таблицы является страничной.

Требования

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

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

RtlDeleteElementGenericTableAvl

RtlEnumerateGenericTableWithoutSplayingAvl

RtlInitializeGenericTableAvl

RtlInsertElementGenericTableAvl

RtlLookupElementGenericTableAvl

RtlNumberGenericTableElementsAvl