次の方法で共有


RtlEnumerateGenericTableWithoutSplaying 関数 (ntddk.h)

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

構文

NTSYSAPI PVOID RtlEnumerateGenericTableWithoutSplaying(
  [in]      PRTL_GENERIC_TABLE Table,
  [in, out] PVOID              *RestartKey
);

パラメーター

[in] Table

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

[in, out] RestartKey

RtlEnumerateGenericTableWithoutSplaying の前回の呼び出しによって返された要素のアドレス。 列挙がテーブルの最初の要素から開始する場合は 、NULL に設定する必要があります。

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

RestartKey = NULL;
for (ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey);
     ptr != NULL;
     ptr = RtlEnumerateGenericTableWithoutSplaying(Table, &RestartKey)) {
        // Process the element pointed to by ptr
}

戻り値

RtlEnumerateGenericTableWithoutSplaying は、 要素に関連付けられている呼び出し元定義構造体へのポインターを返します。 RestartKeyNULL で、テーブルに要素がない場合、または RestartKey が返されたポインターであり、次の要素がない場合、NULL が返されます。

注釈

RtlEnumerateGenericTable とは異なり、RtlEnumerateGenericTableWithoutSplaying では、汎用テーブルをスプレイ ツリーから並べ替えられたリンク リストに変換してフラット化しません。 RtlEnumerateGenericTableWithoutSplaying は、 RtlEnumerateGenericTable よりも効率的でマルチプロセッサセーフです。

RtlEnumerateGenericTableWithoutSplaying を繰り返し呼び出して、ジェネリック テーブルの各要素で呼び出し元のデータを処理できます。

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

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

#define RTL_USE_AVL_TABLES 0

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

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

要件

要件
対象プラットフォーム ユニバーサル
Header ntddk.h (Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL 「解説」を参照してください。

こちらもご覧ください

RtlEnumerateGenericTable

RtlInitializeGenericTable

RtlIsGenericTableEmpty

RtlNumberGenericTableElements