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


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

Подпрограмма RtlInsertElementGenericTableAvl добавляет новую запись в универсальную таблицу.

Синтаксис

NTSYSAPI PVOID RtlInsertElementGenericTableAvl(
  [in]            PRTL_AVL_TABLE Table,
  [in]            PVOID          Buffer,
  [in]            CLONG          BufferSize,
  [out, optional] PBOOLEAN       NewElement
);

Параметры

[in] Table

Указатель на универсальную таблицу Adelson-Velsky/Landis (AVL) (RTL_AVL_TABLE), которая была инициализирована вызовом RtlInitializeGenericTableAvl.

[in] Buffer

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

[in] BufferSize

Размер в байтах данных в буфере .

[out, optional] NewElement

В выходных данных значение TRUE означает успешное вставка нового элемента в универсальной таблице. Значение FALSE означает сбой вставки.

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

RtlInsertElementGenericTableAvl возвращает указатель на пользовательские данные для недавно вставленной записи или данные пользователя для соответствующей записи, которая уже находится в универсальной таблице. Если запись не найдена, но RtlInsertElementGenericTableAvl не удается вставить новую запись (например, так как AllocateRoutine завершается ошибкой), RtlInsertElertElementGenericTableAvl возвращает NULL.

Замечания

Чтобы вставить запись, RtlInsertElementGenericTableAvl вызывает CompareRoutine и AllocateRoutine, зарегистрированные при инициализации универсальной таблицы RtlInitializeGenericTableAvl. После вставки новой записи RtlInsertElementGenericTableAvl перебалансирует дерево ссылок AVL.

При вставке новой записи в таблицу данные копируются из буфера в новую запись. Таким образом, указатель, возвращаемый RtlInsertElementGenericTableAvl, никогда не равен буферу.

Если вызывающий CompareRoutine возвращает GenericEqual, предполагается, что данные буфера дублируют данные для существующей записи в универсальной таблице. В этом случае RtlInsertElementGenericTableAvl не добавляет новую запись (и поэтому не вызывает AllocateRoutine), так как универсальная таблица не может содержать повторяющиеся записи.

Если соответствующая запись уже существует в универсальной таблице, RtlInsertElertElementGenericTableAvl возвращает указатель на данные существующей записи и задает NewElement значение FALSE.

Если в таблице нет соответствующей записи,RtlInsertElementGenericTableAvl выделяет достаточно места для пользовательских данных новой записи (BufferSize) и ссылок, связанных с новой записью. Таким образом, общее количество байтов будет по крайней мере BufferSize + sizeof(RTL_BALANCED_LINKS). Вызывающий объект не должен использовать первые размер(RTL_BALANCED_LINKS) памяти, выделенной AllocateRoutine.

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

По умолчанию операционная система использует деревья воспроизведения для реализации универсальных таблиц, но RtlInsertElementGenericTableAvl подпрограмма работает только с деревьями Adelson-Velsky/Landis (AVL). Чтобы настроить универсальные подпрограммы таблиц для использования деревьев AVL вместо деревьев воспроизведения в драйвере, вставьте следующую инструкцию определения в общий файл заголовка перед включением Ntddk.h:

#define RTL_USE_AVL_TABLES 0

Если RTL_USE_AVL_TABLES не определен, необходимо использовать форму AVL универсальных подпрограмм таблиц. Например, используйте подпрограмму RtlInsertElementGenericTableAvl вместо RtlInsertElementGenericTable. В вызове RtlInsertElementGenericTableAvlвызывающий объект должен передать структуру таблицы RTL_AVL_TABLE, а не RTL_GENERIC_TABLE.

Вызывающие RtlInsertElementGenericTableAvl должны выполняться в IRQL < DISPATCH_LEVEL, если имеет одно из следующих условий:

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

Требования

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

См. также

RtlDeleteElementGenericTableAvl

RtlInitializeGenericTableAvl