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


Функция 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 приведены следующим образом:

Таблица (CompareRoutine)

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

FirstStruct

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

Вторая структура

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

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. Обратите внимание, что из-за этой "дополнительной памяти", предоставленные вызывающим подпрограммами, не должны получить доступ к первым размеру(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.

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

Никакой

Замечания

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

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

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

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

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

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

`#define RTL_USE_AVL_TABLES 0`

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

Требования

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

См. также

ExInitializeFastMutex

RtlDeleteElementGenericTableAvl

RtlEnumerateGenericTableAvl

RtlGetElementGenericTableAvl

RtlInitializeGenericTable

RtlInsertElementGenericTableAvl

RtlLookupElementGenericTableAvl

RtlNumberGenericTableElementsAvl