Функция 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), из которой извлекается элемент Ith. Таблица должна быть инициализирована путем вызова RtlInitializeGenericTableAvl.
[in] I
Индекс выбранного элемента. Это значение является отсчитываемым от нуля, поэтому индекс последнего вставленного элемента в table всегда меньше значения, возвращаемого RtlNumberGenericTableElementsAvl.
Возвращаемое значение
RtlGetElementGenericTableAvl возвращает указатель на предоставленные вызывающим данные для элемента Ith в универсальной таблице AVL. Он возвращает значение NULL, если заданный I слишком велик или если общая таблица AVL в настоящее время не содержит элементов.
Замечания
RtlGetElementGenericTableAvl возвращает элемент Ith, вставленный в универсальную таблицу AVL. Чтобы получить первый элемент, задайте равным нулю. Чтобы получить последний элемент, задайте для I значение (RtlNumberGenericTableElementsAvl(Table)-1). Обратите внимание, что если элемент удаляется из универсальной таблицы, индексы всех элементов, вставляемых после уменьшения удаленного элемента. Таким образом, индекс элемента может измениться с течением времени.
RtlGetElementGenericTableAvl эффективнее, чем RtlLookupElementGenericTableAvl, если вызывающий объект может предоставить индекс определенного элемента, для которого вызывающий объект должен получить доступ к связанным данным. Однако вызов RtlGetElementGenericTableAvl многократно для проверки такого элемента является менее эффективным, чем вызов RtlLookupElementGenericTableAvl, чтобы найти его.
Вызывающие объект Rtl.. Подпрограммы GenericTable отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации, используемым для этой цели.
По умолчанию операционная система использует деревья воспроизведения для реализации универсальных таблиц. При некоторых обстоятельствах операции с деревом воспроизведения сделают дерево глубоким и узким и даже может превратить его в прямую линию. Очень глубокие деревья ухудшают производительность поиска. Вы можете обеспечить более сбалансированную, неглубокую реализацию универсальных таблиц с помощью деревьев Adelson-Velsky/Landis (AVL). Если вы хотите настроить универсальные подпрограммы таблиц для использования деревьев AVL вместо деревьев воспроизведения в драйвере, вставьте следующую инструкцию определения в общий файл заголовка перед включением 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 (include Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Любой уровень (см. примечания) |
См. также
RtlDeleteElementGenericTableAvl
RtlEnumerateGenericTableWithoutSplayingAvl
RtlInsertElementGenericTableAvl