RtlEnumerateGenericTable 関数 (ntddk.h)

RtlEnumerateGenericTable ルーチンは、ジェネリック テーブル内の要素を列挙するために使用されます。

構文

NTSYSAPI PVOID RtlEnumerateGenericTable(
  [in] PRTL_GENERIC_TABLE Table,
  [in] BOOLEAN            Restart
);

パラメーター

[in] Table

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

[in] Restart

列挙がテーブルの最初の要素から開始する場合は TRUE に設定します。 前の呼び出しから列挙を再開する場合は FALSE に 設定します。

テーブル内のすべての要素を列挙するには、 次のように RtlEnumerateGenericTable を 使用します。

for (p = RtlEnumerateGenericTable ( Table, TRUE );
     p != NULL;
     p = RtlEnumerateGenericTable ( Table, FALSE )) {
        // Process the element pointed to by p
}

戻り値

RtlEnumerateGenericTable は、次の要素へのポインター (存在する場合) を返します。 テーブルにそれ以上の要素がない場合、 RtlEnumerateGenericTableNULL を返します。

注釈

RtlEnumerateGenericTable は 、汎用テーブルをスプレイ ツリーから並べ替えられたリンク リストに変換することでフラット化します。 フラット化せずにテーブルを列挙するには、 RtlEnumerateGenericTableWithoutSplaying を使用します

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

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

#define RTL_USE_AVL_TABLES 0

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

汎用テーブルの呼び出し元によって割り当てられたメモリがページング可能な場合は、 RtlEnumerateGenericTable の呼び出し元が IRQL < DISPATCH_LEVELで実行されている必要があります。

要件

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

こちらもご覧ください

ExInitializeFastMutex

RtlEnumerateGenericTableWithoutSplaying

RtlInitializeGenericTable

RtlIsGenericTableEmpty

RtlNumberGenericTableElements