Поделиться через


Функция 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 Любой уровень (см. примечания)

См. также

RtlDeleteElementGenericTable

RtlEnumerateGenericTableWithoutSplaying

RtlInitializeGenericTable

RtlInsertElementGenericTable

RtlLookupElementGenericTable

RtlNumberGenericTableElements