Функция RtlEnumerateGenericTable (ntddk.h)
Подпрограмма RtlEnumerateGenericTable используется для перечисления элементов в универсальной таблице.
Синтаксис
NTSYSAPI PVOID RtlEnumerateGenericTable(
[in] PRTL_GENERIC_TABLE Table,
[in] BOOLEAN Restart
);
Параметры
[in] Table
Указатель на универсальную таблицу (RTL_GENERIC_TABLE). Таблица должна быть инициализирована путем вызова RtlInitializeGenericTable.
[in] Restart
Задайте значение TRUE , если перечисление начинается с первого элемента в таблице. При возобновлении перечисления из предыдущего вызова задайте значение FALSE .
Чтобы перечислить все элементы в таблице, используйте RtlEnumerateGenericTable следующим образом:
for (p = RtlEnumerateGenericTable ( Table, TRUE );
p != NULL;
p = RtlEnumerateGenericTable ( Table, FALSE )) {
// Process the element pointed to by p
}
Возвращаемое значение
RtlEnumerateGenericTable возвращает указатель на следующий элемент, если он существует. Если в таблице больше нет элементов, функция RtlEnumerateGenericTable возвращает значение NULL.
Комментарии
RtlEnumerateGenericTable преобразует универсальную таблицу в плоскую, преобразовав ее из дерева splay в отсортированный связанный список. Чтобы перечислить таблицу без преобразования в плоскую структуру, используйте RtlEnumerateGenericTableWithoutSplaying.
Вызывающие Rtl.. Подпрограммы GenericTable отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации для этой цели.
По умолчанию операционная система использует деревья splay для реализации универсальных таблиц. При некоторых обстоятельствах операции с деревом splay сделают дерево глубоким и узким и даже может превратить его в прямую линию. Очень глубокие деревья ухудшают производительность поиска. С помощью деревьев 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.
Вызывающие функции RtlEnumerateGenericTable должны выполняться в IRQL < DISPATCH_LEVEL, если память, выделенная вызывающим объектом, для универсальной таблицы является страничной.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | ntddk.h (включая Ntddk.h, Ntifs.h, Fltkernel.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | DISPATCH_LEVEL IRQL < (см. раздел "Примечания") |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по