次の方法で共有


RtlInsertElementGenericTable 関数 (ntddk.h)

RtlInsertElementGenericTable ルーチンは、ジェネリック テーブルに新しい要素を追加します。

構文

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

パラメーター

[in] Table

ジェネリック テーブルへのポインター (RTL_GENERIC_TABLE)。 テーブルは RtlInitializeGenericTable を呼び出して初期化されている必要があります。

[in] Buffer

新しい要素にコピーされるデータを含む呼び出し元によって割り当てられたバッファーへのポインター。 詳細については、 RtlInitializeGenericTable の説明を参照してください。

[in] BufferSize

新しい要素が挿入されたときに呼び出し元から提供されたデータに割り当てられるバイト数。

[out, optional] NewElement

Buffer のデータを含む新しい要素がジェネリック テーブルに挿入された場合に TRUE を受け取る変数へのポインター。または新しい要素が挿入されていない場合は FALSE。

戻り値

RtlInsertElementGenericTable は 、新しく挿入された要素の関連付けられたデータへのポインターを返します。一致する要素がジェネリック テーブルに既に存在する場合は、既存の要素のデータへのポインターを返します。 一致する要素が見つからないが、新しい要素を挿入できない場合 (たとえば、 AllocateRoutine が失敗するため)、 RtlInsertElementGenericTableNULL を返します。

注釈

要素を挿入するために、RtlInsertElementGenericTable は、汎用テーブルが RtlInitializeGenericTable によって初期化されたときに登録された CompareRoutineAllocateRoutine を呼び出します。 新しい要素を挿入すると、 RtlInsertElementGenericTable によって 、splay リンク ツリーが再調整されます。

新しい要素がテーブルに挿入されると、そのデータが Buffer から新しい要素にコピーされます。 したがって、 RtlInsertElementGenericTable によって返されるポインターが Buffer と等しいことはありません。

呼び出し元の CompareRoutineGenericEqual を返す場合、 Buffer のデータはジェネリック テーブル内の既存の要素のデータを複製するものと見なされます。 この場合、 RtlInsertElementGenericTable は新しい要素を追加しません (したがって 、AllocateRoutine は呼び出されません)。ジェネリック テーブルに重複する要素を含めることはできません。

一致する要素がジェネリック テーブルに既に存在する場合、 RtlInsertElementGenericTable は 既存の要素のデータへのポインターを返し 、NewElement を FALSE に設定 します

Rtl の呼び出し元..GenericTable ルーチンは、ジェネリック テーブルへのアクセスを排他的に同期する役割を担います。 排他高速ミューテックスは、この目的で使用する最も効率的な同期メカニズムです。

既定では、オペレーティング システムは splay ツリーを使用して汎用テーブルを実装します。 状況によっては、スプレイ ツリーを操作すると、ツリーが深く狭く、直線に変わる場合もあります。 非常に深いツリーでは、検索のパフォーマンスが低下します。 Adelson-Velsky/Landis (AVL) ツリーを使用して、ジェネリック テーブルのよりバランスの取れた浅いツリー実装を確保できます。 ドライバーでツリーを再生する代わりに AVL ツリーを使用するように汎用テーブル ルーチンを構成する場合は、 Ntddk.h を含める前に、共通ヘッダー ファイルに次の define ステートメントを挿入します。

#define RTL_USE_AVL_TABLES 0

RTL_USE_AVL_TABLESが定義されていない場合は、汎用テーブル ルーチンの AVL 形式を使用する必要があります。 たとえば、 RtlInsertElementGenericTable の代わりに RtlInsertElementGenericTableAvl ルーチンを使用 しますRtlInsertElementGenericTableAvl の呼び出しでは、呼び出し元はRTL_GENERIC_TABLEではなく、RTL_AVL_TABLEテーブル構造渡す必要があります。

次のいずれかの条件が満たされている場合、 RtlInsertElementGenericTable の呼び出し元は IRQL < DISPATCH_LEVELで実行されている必要があります。

  • 呼び出し元によって割り当てられたメモリ ( Table または Buffer) はページング可能です。
  • 呼び出し元から提供された CompareRoutine または AllocateRoutine には、ページング可能なコードが含まれています。

要件

要件
対象プラットフォーム ユニバーサル
Header ntddk.h (Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL < DISPATCH_LEVEL (「解説」セクションを参照)

こちらもご覧ください

RtlDeleteElementGenericTable

RtlInitializeGenericTable