AppendTailList 関数 (wdm.h)

AppendTailList ルーチンは、LIST_ENTRY構造体の二重にリンクされたリストを、LIST_ENTRY構造体の別の二重にリンクされたリストの末尾に追加します。

構文

void AppendTailList(
  [in, out] PLIST_ENTRY ListHead,
  [in, out] PLIST_ENTRY ListToAppend
);

パラメーター

[in, out] ListHead

ListToAppend が指すリストの先頭へのポインターを追加します。 このパラメーターは、リストの先頭である LIST_ENTRY 構造体への有効な NULL 以外のポインターである必要があります。 このリストは空にすることができます。

[in, out] ListToAppend

ListHead が指すリストに追加するリスト内の最初のエントリへのポインター。 このパラメーターは、ヘッドレス リストの最初のエントリである LIST_ENTRY 構造体への有効な NULL 以外のポインターである必要があります。 詳細については、「解説」を参照してください。

戻り値

なし

解説

このルーチンは、入力 ListHead および ListToAppend リストから結合されたすべてのエントリを含むリストを作成します。 ルーチンが戻るとき、ListHead パラメーターによって指されるLIST_ENTRY構造体は、結果として得られる結合リストの先頭になります。 ListToAppend パラメーターが指すLIST_ENTRY構造体は、結果の結合リスト内のエントリです。

呼び出し元は、追加するリストの最初のエントリを指すように ListToAppend パラメーターを設定します。 この点に関して、 AppendTailList は規則に従わず、その後に 、LIST_ENTRY 構造体を使用する他の二重リンク リスト ルーチンが続きます。 これらの他のルーチンでは、リストを表すパラメーターは、リスト内の最初のエントリではなく、リストの先頭を指します。 ドライバー コードでリストヘッドを使用して追加するリストを表す場合、リストが AppendTailListListToAppend パラメーターとして渡される前に、リストヘッドをこのリストから削除する必要があります。 このリスト ヘッドを削除する方法を示すコード例については、「例」を参照してください。

AppendTailList を使用すると、リストの末尾に 1 つのエントリを挿入できますが、ListToAppend が指すLIST_ENTRY構造体の Flink メンバーと Blink メンバーは、最初に初期化する必要があります。通常は InitializeListHead ルーチンを呼び出します。 これに対し、InsertTailList ルーチンでは、InsertTailList 呼び出しの前に Entry パラメーターが指すLIST_ENTRY構造体の Flink メンバーと Blink メンバーを初期化する必要はありません。 このため、 InsertTailList を使用すると、リストの末尾に 1 つのエントリを挿入する方が便利な場合があります。

ドライバーは、LIST_ENTRYFlink および Blink メンバーにアクセスできますが、メンバーは、この目的のために指定されたシステム ルーチンによってのみ更新する必要があります。

二重リンク リストを実装するときにこのルーチンを使用する方法の詳細については、「Singly および Doubly Linked Lists」を参照してください。

AppendTailList の呼び出し元は、任意の IRQL で実行できます。 APPENDTailList が IRQL >= DISPATCH_LEVELで呼び出される場合、リスト エントリのストレージはメモリ常駐である必要があります。

次のコード例は、AppendTailList に似ていますが、ListToAppend パラメーターを (ヘッドレス) リストの最初のエントリへのポインターとしてではなく、リスト ヘッドへのポインターとして扱う という名前MyAppendTailListの関数を記述する方法を示しています。 AppendTailList とは異なり、この関数は ListToAppendMyAppendTailList パラメーターが指すLIST_ENTRY構造体を、ListHead パラメーターが指すリストに追加されるエントリに含めないようにします。

VOID MyAppendTailList(
    _Inout_  PLIST_ENTRY ListHead,
    _Inout_  PLIST_ENTRY ListToAppend
    )
{
    PLIST_ENTRY entry = ListToAppend->Flink;

    if (!IsListEmpty(ListToAppend))
    {
        RemoveEntryList(ListToAppend);
        InitializeListHead(ListToAppend);
        AppendTailList(ListHead, entry);
    }
}

このコード例の関数は MyAppendTailListListHead パラメーターと ListToAppend パラメーターの両方をリスト ヘッドへのポインターとして扱います。 この関数が戻ると、 ListToAppend が指すリストは空になります。つまり、関連付けられたリスト エントリがないリスト ヘッドで構成されます。 このリストに最初に含まれるすべてのエントリは、 ListHead が指すリストに追加されています。

要件

要件
対象プラットフォーム デスクトップ
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Wudfwdm.h を含む)
IRQL 任意のレベル (「解説」セクションを参照)

こちらもご覧ください

InitializeListHead

InsertTailList

LIST_ENTRY

RemoveEntryList