Функция 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 возвращает указатель на следующий элемент, если он существует. Если в таблице нет дополнительных элементов, RtlEnumerateGenericT able возвращает NULL.
Замечания
RtlEnumerateGenericTable неструктурирует универсальную таблицу, преобразовав ее из дерева воспроизведения в отсортированный связанный список. Чтобы перечислить таблицу без выравнивания, используйте RtlEnumerateGenericTableWithoutSplaying.
Вызывающие Rtl.. Подпрограммы genericTable отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации, используемым для этой цели.
По умолчанию операционная система использует деревья воспроизведения для реализации универсальных таблиц. При некоторых обстоятельствах операции с деревом воспроизведения сделают дерево глубоким и узким и даже может превратить его в прямую линию. Очень глубокие деревья ухудшают производительность поиска. Вы можете обеспечить более сбалансированную, неглубокую реализацию универсальных таблиц с помощью деревьев Adelson-Velsky/Landis (AVL). Если вы хотите настроить универсальные подпрограммы таблиц для использования деревьев AVL вместо деревьев воспроизведения в драйвере, вставьте следующую инструкцию определения в общий файл заголовка перед включением 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 (include Ntddk.h, Ntifs.h, Fltkernel.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL < DISPATCH_LEVEL (см. раздел "Примечания") |