Функция 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 | См. раздел "Примечания". |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по