Функция 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 , если RestartKey имеет значение NULL и таблица не содержит элементов, или если RestartKey является возвращаемым указателем и нет следующего элемента.
Комментарии
В отличие от RtlEnumerateGenericTable, RtlEnumerateGenericTableWithoutSplaying не преобразует универсальную таблицу из дерева splay в отсортированный связанный список. RtlEnumerateGenericTableWithoutSplaying является более эффективным и многопроцессорным, чем RtlEnumerateGenericTable.
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 универсальных подпрограмм таблиц. Например, используйте подпрограмму RtlEnumerateGenericTableWithoutSplaying вместо RtlEnumerateGenericTableWithoutSplayingAvl. В вызове RtlEnumerateGenericTableWithoutSplayingAvl вызывающий объект должен передать структуру таблицы RTL_AVL_TABLE , а не RTL_GENERIC_TABLE.
Вызывающие компоненты RtlEnumerateGenericTableWithoutSplaying должны выполняться на DISPATCH_LEVEL IRQL < , если выделенная вызывающим объектом память для универсальной таблицы является страничной.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | ntddk.h (включая Ntddk.h, Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | См. раздел "Примечания". |