Функция RtlEnumerateGenericTableWithoutSplayingAvl (ntddk.h)
Подпрограмма RtlEnumerateGenericTableWithoutSplayingAvl используется для перечисления элементов в универсальной таблице.
Синтаксис
NTSYSAPI PVOID RtlEnumerateGenericTableWithoutSplayingAvl(
[in] PRTL_AVL_TABLE Table,
[in, out] PVOID *RestartKey
);
Параметры
[in] Table
Указатель на универсальную таблицу (RTL_AVL_TABLE). Таблица должна быть инициализирована путем вызова RtlInitializeGenericTableAvl.
[in, out] RestartKey
Адрес элемента, возвращаемого предыдущим вызовом RtlEnumerateGenericTableWithoutSplayingAvl. Следует задать значение NULL, если перечисление должно начинаться с первого элемента таблицы.
Чтобы перечислить все элементы в таблице, используйте RtlEnumerateGenericTableWithoutSplayingAvl следующим образом:
RestartKey = NULL;
for (ptr = RtlEnumerateGenericTableWithoutSplayingAvl(Table, &RestartKey);
ptr != NULL;
ptr = RtlEnumerateGenericTableWithoutSplayingAvl(Table, &RestartKey)) {
// Process the element pointed to by ptr
}
Возвращаемое значение
RtlEnumerateGenericTableWithoutSplayingAvl возвращает указатель на определяемую вызывающим элементом структуру. Он возвращает NULL, если RestartKeyNULL, а таблица не содержит элементов или если RestartKey является возвращаемым указателем, а следующий элемент отсутствует.
Замечания
RtlEnumerateGenericTableWithoutSplayingAvl можно вызывать многократно для обработки данных вызывающего объекта в каждом элементе универсальной таблицы.
Элементы возвращаются в возвращаемом порядке, как определено параметром PRTL_AVL_COMPARE_ROUTINE, предоставленным для RtlInitializeGenericTableAvl.
По умолчанию операционная система использует деревья воспроизведения для реализации универсальных таблиц, но RtlLookupElementGenericTableFullAvl работает только с деревьями Adelson-Velsky/Landis (AVL). Чтобы настроить универсальные подпрограммы таблиц для использования деревьев AVL вместо деревьев воспроизведения в драйвере, вставьте следующую инструкцию определения в общий файл заголовка перед включением Ntddk.h:
#define RTL_USE_AVL_TABLES 0
Если RTL_USE_AVL_TABLES не определен, необходимо использовать форму AVL универсальных подпрограмм таблиц. Например, используйте подпрограмму RtlEnumerateGenericTableWithoutSplayingAvl вместо RtlEnumerateGenericTableWithoutSplaying. В вызове RtlEnumerateGenericTableWithoutSplayingAvlвызывающий объект должен передать структуру таблицы RTL_AVL_TABLE, а не RTL_GENERIC_TABLE.
Вызывающие объект Rtl.. Подпрограммы GenericTableAvl* отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации, используемым для этой цели.
Вызывающие RtlEnumerateGenericTableWithoutSplayingAvl должны выполняться в IRQL < DISPATCH_LEVEL, если вызывающая выделенная память для универсальной таблицы является страничной.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | ntddk.h (include Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | См. раздел "Примечания". |