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

Подпрограмма RtlEnumerateGenericTableAvl используется для перечисления элементов в универсальной таблице.

Синтаксис

NTSYSAPI PVOID RtlEnumerateGenericTableAvl(
  [in] PRTL_AVL_TABLE Table,
  [in] BOOLEAN        Restart
);

Параметры

[in] Table

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

[in] Restart

Задайте значение TRUE , если перечисление начинается с первого элемента в таблице. При возобновлении перечисления из предыдущего вызова задайте значение FALSE .

Чтобы перечислить все элементы в таблице, используйте RtlEnumerateGenericTableAvl следующим образом:

for (p = RtlEnumerateGenericTableAvl ( Table, TRUE );
     p != NULL;
     p = RtlEnumerateGenericTableAvl ( Table, FALSE )) {
        // Process the element pointed to by p
}

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

RtlEnumerateGenericTableAvl возвращает указатель на следующий элемент, если он существует. Если в таблице больше нет элементов, функция RtlEnumerateGenericTableAvl возвращает значение NULL.

Комментарии

Вызывающие Rtl.. Подпрограммы GenericTableAvl отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации для этой цели.

По умолчанию операционная система использует деревья splay для реализации универсальных таблиц, но подпрограмма RtlEnumerateGenericTableAvl работает только с деревьями Adelson-Velsky/Landis (AVL). Чтобы настроить в универсальных подпрограммах таблицы использование деревьев AVL вместо деревьев splay в драйвере, вставьте следующую инструкцию define в общий файл заголовка перед включением Ntddk.h:

#define RTL_USE_AVL_TABLES 0

Если RTL_USE_AVL_TABLES не определен, необходимо использовать форму AVL универсальных табличных процедур. Например, используйте подпрограмму RtlEnumerateGenericTableAvl вместо RtlEnumerateGenericTable. В вызове RtlEnumerateGenericTableAvl вызывающий объект должен передать RTL_AVL_TABLE табличную структуру, а не RTL_GENERIC_TABLE.

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

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ntddk.h (включая Ntddk.h, Ntifs.h, Fltkernel.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL DISPATCH_LEVEL IRQL < (см. раздел "Примечания")

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

ExInitializeFastMutex

RtlEnumerateGenericTableWithoutSplayingAvl

RtlInitializeGenericTableAvl

RtlIsGenericTableEmptyAvl

RtlNumberGenericTableElementsAvl