Функция RtlInitializeGenericTableAvl (ntddk.h)

Подпрограмма RtlInitializeGenericTableAvl инициализирует универсальную таблицу с помощью деревьев Adelson-Velsky/Landis (AVL).

Синтаксис

NTSYSAPI VOID RtlInitializeGenericTableAvl(
  [out]          PRTL_AVL_TABLE            Table,
  [in]           PRTL_AVL_COMPARE_ROUTINE  CompareRoutine,
  [in]           PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
  [in]           PRTL_AVL_FREE_ROUTINE     FreeRoutine,
  [in, optional] PVOID                     TableContext
);

Параметры

[out] Table

Указатель на буфер, выделенный вызывающим объектом, который должен иметь размер не менееRTL_AVL_TABLE байт, чтобы содержать инициализированную структуру универсальной таблицы.

[in] CompareRoutine

Точка входа подпрограммы обратного вызова сравнения, объявленная следующим образом:

RTL_GENERIC_COMPARE_RESULTS
(*PRTL_AVL_COMPARE_ROUTINE) (
    __in struct _RTL_AVL_TABLE  *Table,
    __in PVOID  FirstStruct,
    __in PVOID  SecondStruct
    ); 

Ниже перечислены параметры CompareRoutine .

Table (CompareRoutine)

Указатель на универсальную таблицу.

FirstStruct

Указатель на первый сравниваемый элемент.

SecondStruct

Указатель на второй сравниваемый элемент.

CompareRoutine должен строго отслеживать порядок всех элементов в универсальной таблице, чтобы он смог идентифицировать любой конкретный элемент. Определяемая вызывающим элементом структура для данных элемента обычно включает элемент, значение которого является уникальным и может использоваться в качестве ключа сортировки. Все Rtl... Подпрограммы GenericTableAvl , вызывающие CompareRoutine , принимают указатель буфера в качестве параметра, который, в свою очередь, передается в CompareRoutine. Буфер содержит значение ключа, предоставленное вызывающим объектом, которое будет сопоставляться compareRoutine с ключом искомого элемента.

При двух таких значениях ключей CompareRoutine возвращает GenericLessThan, GenericGreaterThan или GenericEqual.

[in] AllocateRoutine

Точка входа подпрограммы обратного вызова выделения, объявленная следующим образом:

PVOID
(*PRTL_AVL_ALLOCATE_ROUTINE) (
    __in struct _RTL_AVL_TABLE  *Table,
    __in CLONG  ByteSize
    );

Ниже перечислены параметры AllocateRoutine .

Таблица (AllocateRoutine)

Указатель на универсальную таблицу.

ByteSize

Количество байтов, которые необходимо выделить.

Для каждого нового элемента метод AllocateRoutine вызывается для выделения памяти для данных, предоставленных вызывающим, а также некоторой дополнительной памяти для использования rtl... Подпрограммы GenericTableAvl . Обратите внимание, что из-за этой "дополнительной памяти" подпрограммы, предоставляемые вызывающим абонентом, не должны обращаться к первым байтам sizeof(RTL_BALANCED_LINKS) любого элемента в универсальной таблице.

[in] FreeRoutine

Точка входа подпрограммы обратного вызова освобождения, объявленная следующим образом:

VOID
(*PRTL_AVL_FREE_ROUTINE) (
    __in struct _RTL_AVL_TABLE  *Table,
    __in PVOID  Buffer
    );

Ниже перечислены параметры FreeRoutine .

Таблица (FreeRoutine)

Указатель на универсальную таблицу.

Буфер

Указатель на удаляемый элемент.

Rtl... Подпрограммы GenericTableAvl вызывают FreeRoutine , чтобы освободить память для элементов, которые будут удалены из универсальной таблицы. FreeRoutine является противоположностью AllocateRoutine.

[in, optional] TableContext

Необязательный указатель на контекст, предоставленный вызывающим объектом, для универсальной таблицы. Этот параметр может принимать значение NULL.

Возвращаемое значение

None

Remarks

Файловые системы вызывают RtlInitializeGenericTableAvl для инициализации универсальной таблицы для хранения данных, относящихся к файловой системе, таких как сведения о поиске имен для открытых файлов. Порядок сортировки, структура и содержимое элементов определяются вызывающим.

Файловые системы должны вызывать RtlInitializeGenericTableAvl для инициализации универсальной таблицы перед использованием любого другого Rtl... Подпрограммы GenericTableAvl в новой универсальной таблице. Инициализированную структуру универсальной таблицы следует считать непрозрачной.

Абоненты Rtl... Подпрограммы GenericTableAvl отвечают за исключительно синхронизацию доступа к универсальной таблице. Эксклюзивный быстрый мьютекс является наиболее эффективным механизмом синхронизации для этой цели.

Предоставленный вызывающим элемент CompareRoutine вызывается перед AllocateRoutine , чтобы найти подходящее расположение, в которое следует вставить новый элемент. CompareRoutine также вызывается перед FreeRoutine, чтобы найти удаляемый элемент.

Подпрограмма RtlInitializeGenericTableAvl явным образом выделяет универсальную таблицу, которая использует деревья AVL. Использование этой процедуры и других Rtl... Подпрограммы GenericTableAvl необходимы, если нужны таблицы на основе дерева AVL и RTL_USE_AVL_TABLES не определен перед включением ntddk.h.

Если вы хотите настроить подпрограммы универсальной таблицы, rtl... GenericTable, чтобы использовать деревья AVL вместо деревьев splay в драйвере, вставьте следующую инструкцию define в общий файл заголовка перед включением ntddk.h:

`#define RTL_USE_AVL_TABLES 0`

Вызывающие операторы RtlInitializeGenericTableAvl должны выполняться по адресу IRQL <= DISPATCH_LEVEL. Обратите внимание, что если Rtl... Подпрограммы GenericTableAvl должны использоваться на DISPATCH_LEVEL IRQL. Все функции CompareRoutine, AllocateRoutine и FreeRoutine должны быть непередаваемым кодом, а Свойство AllocateRoutine должно выделять память из пула без паг.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ntddk.h (включая Ntddk.h, Ntifs.h, Fltkernel.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (см. раздел "Примечания")

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

ExInitializeFastMutex

RtlDeleteElementGenericTableAvl

RtlEnumerateGenericTableAvl

RtlGetElementGenericTableAvl

RtlInitializeGenericTable

RtlInsertElementGenericTableAvl

RtlLookupElementGenericTableAvl

RtlNumberGenericTableElementsAvl