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이 아닌 포인터여야 합니다. 자세한 내용은 설명 부분을 참조하세요.

반환 값

없음

설명

이 루틴은 입력 ListHeadListToAppend 목록의 결합된 모든 항목을 포함하는 목록을 생성합니다. 루틴이 반환되면 ListHead 매개 변수가 가리키는 LIST_ENTRY 구조체가 결과 결합 목록의 머리입니다. ListToAppend 매개 변수가 가리키는 LIST_ENTRY 구조체는 결과 결합된 목록의 항목입니다.

호출자는 ListToAppend 매개 변수를 설정하여 추가할 목록의 첫 번째 항목을 가리킵니다. 이와 관련하여 AppendTailListLIST_ENTRY 구조를 사용하는 다른 이중으로 연결된 목록 루틴 뒤에 오는 규칙을 준수하지 않습니다. 이러한 다른 루틴에서 목록을 나타내는 매개 변수는 목록의 첫 번째 항목 대신 목록 헤드를 가리킵니다. 드라이버 코드에서 목록 헤드를 사용하여 추가할 목록을 나타내는 경우 목록이 ListToAppend 매개 변수로 AppendTailList로 전달되기 전에 목록 헤드를 이 목록에서 제거해야 합니다. 이 목록 헤드를 제거하는 방법을 보여 주는 코드 예제는 예제를 참조하세요.

AppendTailList를 사용하여 목록의 꼬리에 단일 항목을 삽입할 수 있지만 ListToAppend가 가리키는 LIST_ENTRY 구조의 FlinkBlink 멤버는 먼저 InitializeListHead 루틴을 호출하여 초기화해야 합니다. 반면 InsertTailList 루틴에는 InsertTailList 호출 전에 Entry 매개 변수가 가리키는 LIST_ENTRY 구조체의 FlinkBlink 멤버가 필요하지 않습니다. 이러한 이유로 InsertTailList 는 목록의 꼬리에 단일 항목을 삽입하는 데 사용하는 것이 더 편리할 수 있습니다.

드라이버는 LIST_ENTRYFlinkBlink 멤버에 액세스할 수 있지만 이 용도로 제공된 시스템 루틴에서만 멤버를 업데이트해야 합니다.

이중으로 연결된 목록을 구현할 때 이 루틴을 사용하는 방법에 대한 자세한 내용은 Singly 및 두 배로 연결된 Lists.

AppendTailList의 호출자는 모든 IRQL에서 실행할 수 있습니다. APPendTailList가 IRQL >= DISPATCH_LEVEL 호출되는 경우 목록 항목에 대한 스토리지는 메모리 상주여야 합니다.

예제

다음 코드 예제에서는 AppendTailList와 비슷하지만 ListToAppend 매개 변수를 (헤드리스) 목록의 첫 번째 항목에 대한 포인터가 아닌 목록 헤드에 대한 포인터로 처리하는 이라는 MyAppendTailList 함수를 작성하는 방법을 보여 줍니다. AppendTailList와 달리 함수는 MyAppendTailListListHead 매개 변수가 가리키는 목록에 추가되는 항목에 ListToAppend 매개 변수가 가리키는 LIST_ENTRY 구조를 포함하지 않습니다.

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);
    }
}

이 코드 예제의 함수는 MyAppendTailListListHeadListToAppend 매개 변수를 모두 목록 헤드에 대한 포인터로 처리합니다. 이 함수가 반환되면 ListToAppend 가 가리키는 목록이 비어 있습니다. 즉, 연결된 목록 항목이 없는 목록 머리로 구성됩니다. 이 목록에 처음 있던 모든 항목이 ListHead가 가리키는 목록에 추가되었습니다.

요구 사항

요구 사항
대상 플랫폼 데스크톱
머리글 wdm.h(Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h 포함)
IRQL 모든 수준(설명 섹션 참조)

추가 정보

InitializeListHead

InsertTailList

LIST_ENTRY

RemoveEntryList