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


Функция 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 , если RestartKey имеет значение NULL и таблица не содержит элементов, или если RestartKey является возвращаемым указателем и нет следующего элемента.

Комментарии

Подпрограмма RtlEnumerateGenericTableWithoutSplayingAvl фактически не работает с деревом splay, но предоставляет аналогичную именованную подпрограмму для RtlEnumerateGenericTableWithoutSplayingAvl.

RtlEnumerateGenericTableWithoutSplayingAvl можно вызывать многократно для обработки данных вызывающего объекта в каждом элементе универсальной таблицы.

По умолчанию операционная система использует деревья splay для реализации универсальных таблиц, но подпрограмма RtlLookupElementGenericTableFullAvl работает только с деревьями Adelson-Velsky/Landis (AVL). Чтобы настроить в универсальных подпрограммах таблицы использование деревьев AVL вместо деревьев splay в драйвере, вставьте следующую инструкцию define в общий файл заголовка перед включением 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 (включая Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL См. раздел "Примечания".

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

RtlEnumerateGenericTableAvl

RtlInitializeGenericTableAvl

RtlIsGenericTableEmptyAvl

RtlNumberGenericTableElementsAvl