次の方法で共有


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 構造体を使用する他の二重リンク リスト ルーチンが続きます。 これらの他のルーチンでは、リストを表すパラメーターは、リスト内の最初のエントリではなく、リストの先頭を指します。 ドライバー コードで、追加するリストを表すためにリスト ヘッドを使用する場合は、AppendTailList するためにリストが ListToAppend パラメーターとして渡される前に、リスト ヘッドをこのリストから削除する必要があります。 このリスト ヘッドを削除する方法を示すコード例については、「例」を参照してください。

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

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

二重リンク リストを実装する場合にこのルーチンを使用する方法については、「Singly および 2 重リンク リストのを参照してください。

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

次のコード例は、AppendTailListに似ていますが、ListToAppend パラメーターをリスト ヘッドへのポインターとして扱う MyAppendTailList という名前の関数を、(ヘッドレス) リストの最初のエントリへのポインターとしてではなく記述する方法を示しています。 AppendTailList とは異なり、MyAppendTailList 関数は、ListToAppend パラメーターが指す 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);
    }
}

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

必要条件

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

関連項目

InitializeListHead

InsertTailList

LIST_ENTRY

RemoveEntryList