Функция RtlEnumerateGenericTableWithoutSplaying (ntddk.h)
Подпрограмма RtlEnumerateGenericTableWithoutSplaying используется для перечисления элементов в универсальной таблице.
Синтаксис
NTSYSAPI PVOID RtlEnumerateGenericTableWithoutSplaying(
[in] PRTL_GENERIC_TABLE Table,
[in, out] PVOID *RestartKey
);
Параметры
[in] Table
Указатель на универсальную таблицу (RTL_GENERIC_TABLE). Таблица должна быть инициализирована путем вызова RtlInitializeGenericTable.
[in, out] RestartKey
Адрес элемента, возвращаемого предыдущим вызовом RtlEnumerateGenericTableWithoutSplaying. Следует задать значение NULL, если перечисление должно начинаться с первого элемента таблицы.
Чтобы перечислить все элементы в таблице, используйте RtlEnumerateGenericTableWithoutSplaying следующим образом:
RestartKey = NULL;
for (ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey);
ptr != NULL;
ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey)) {
// Process the element pointed to by ptr
}
Возвращаемое значение
RtlEnumerateGenericTableWithoutSplaying возвращает указатель на определяемую вызывающим элементом структуру. Он возвращает NULL, если RestartKeyNULL, а таблица не содержит элементов или если RestartKey является возвращаемым указателем, а следующий элемент отсутствует.
Замечания
В отличие от RtlEnumerateGenericTable, RtlEnumerateGenererateGenericTableWithoutSplaying не сравняет универсальную таблицу, преобразовав ее из дерева воспроизведения в отсортированный связанный список. RtlEnumerateGenericTableWithoutSplaying является более эффективным и многопроцессорным, чем RtlEnumerateGenericTable.
RtlEnumerateGenericTableWithoutSplaying можно вызывать многократно для обработки данных вызывающего объекта в каждом элементе универсальной таблицы.
Вызывающие Rtl.. Подпрограммы genericTable отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации, используемым для этой цели.
По умолчанию операционная система использует деревья воспроизведения для реализации универсальных таблиц. При некоторых обстоятельствах операции с деревом воспроизведения сделают дерево глубоким и узким и даже может превратить его в прямую линию. Очень глубокие деревья ухудшают производительность поиска. Вы можете обеспечить более сбалансированную, неглубокую реализацию универсальных таблиц с помощью деревьев Adelson-Velsky/Landis (AVL). Если вы хотите настроить универсальные подпрограммы таблиц для использования деревьев AVL вместо деревьев воспроизведения в драйвере, вставьте следующую инструкцию определения в общий файл заголовка перед включением Ntddk.h:
#define RTL_USE_AVL_TABLES 0
Если RTL_USE_AVL_TABLES не определен, необходимо использовать форму AVL универсальных подпрограмм таблиц. Например, используйте подпрограмму RtlEnumerateGenericTableWithoutSplaying вместо RtlEnumerateGenericTableWithoutSplayingAvl. В вызове RtlEnumerateGenericTableWithoutSplayingAvlвызывающий объект должен передать структуру таблицы RTL_AVL_TABLE, а не RTL_GENERIC_TABLE.
Вызывающие RtlEnumerateGenericTableWithoutSplaying должны выполняться в IRQL < DISPATCH_LEVEL, если вызывающая выделенная память для универсальной таблицы является страничной.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | ntddk.h (include Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | См. раздел "Примечания". |