다음을 통해 공유


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

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

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

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

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

예제

다음 코드 예제에서는 AppendTailList유사하지만 ListToAppend 매개 변수를 헤드리스 목록의 첫 번째 항목에 대한 포인터 대신 목록 헤드에 대한 포인터로 처리하는 MyAppendTailList 함수를 작성하는 방법을 보여 줍니다. AppendTailList달리 MyAppendTailList 함수는 ListHead 매개 변수가 가리키는 목록에 추가되는 항목에 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);
    }
}

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

요구 사항

요구
대상 플랫폼 바탕 화면
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h 포함)
IRQL 모든 수준(설명 섹션 참조)

참고 항목

InitializeListHead

InsertTailList

LIST_ENTRY

RemoveEntryList