Функция RtlGetElementGenericTable (ntddk.h)
Подпрограмма RtlGetElementGenericTable возвращает указатель на предоставленные вызывающими данными для определенного универсального элемента таблицы.
Синтаксис
NTSYSAPI PVOID RtlGetElementGenericTable(
[in] PRTL_GENERIC_TABLE Table,
[in] ULONG I
);
Параметры
[in] Table
Указатель на универсальную таблицу (RTL_GENERIC_TABLE), из которой извлекается элемент Ith. Таблица должна быть инициализирована путем вызова RtlInitializeGenericTable.
[in] I
Индекс выбранного элемента. Это значение является отсчитываемым от нуля, поэтому индекс последнего вставленного элемента в table всегда меньше значения, возвращаемого RtlNumberGenericTableElements.
Возвращаемое значение
RtlGetElementGenericTable возвращает указатель на предоставленные вызывающим данным для элемента Ith в универсальной таблице. Он возвращает NULL, если заданный I слишком велик или если универсальная таблица в настоящее время не содержит элементов.
Замечания
RtlGetElementGenericTable возвращает элемент Ith, вставленный в универсальную таблицу. Чтобы получить первый элемент, задайте равным нулю. Чтобы получить последний элемент, задайте для значение I (RtlNumberGenericTableElements(Table)-1). Обратите внимание, что если элемент удаляется из универсальной таблицы, индексы всех элементов, вставляемых после уменьшения удаленного элемента. Таким образом, индекс элемента может измениться с течением времени.
RtlGetElementGenericTable эффективнее, чем RtlLookupElementGenericTable, если вызывающий объект может предоставить индекс определенного элемента, для которого вызывающий объект должен получить доступ к связанным данным. Однако вызов RtlGetElementGenericTable многократное тестирование для такого элемента менее эффективно, чем вызов RtlLookupElementGenericTable.
Вызывающие объект 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.
Вызывающие RtlGetElementGenericTable должны выполняться в IRQL < DISPATCH_LEVEL, если вызываемая память для универсальной таблицы может быть разыгрываемой.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | ntddk.h (include Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Любой уровень (см. примечания) |