Поделиться через


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

См. также

RtlEnumerateGenericTable

RtlInitializeGenericTable

RtlIsGenericTableEmpty

RtlNumberGenericTableElements