Функция 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 См. раздел "Примечания".

См. также раздел

RtlEnumerateGenericTable

RtlInitializeGenericTable

RtlIsGenericTableEmpty

RtlNumberGenericTableElements