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 구조를 사용하는 다른 이중으로 연결된 목록 루틴이 뒤따릅니다. 이러한 다른 루틴에서 목록을 나타내는 매개 변수는 목록의 첫 번째 항목 대신 목록 헤드를 가리킵니다. 드라이버 코드에서 목록 헤드를 사용하여 추가할 목록을 나타내는 경우 목록이 ListToAppend 매개 변수로 전달되기 전에 이 목록에서 목록 헤드를 제거해야 AppendTailList. 이 목록 헤드를 제거하는 방법을 보여 주는 코드 예제는 예제를 참조하세요.
AppendTailList 사용하여 목록의 꼬리에 단일 항목을 삽입할 수 있지만 Flink 및 Blink는 ListToAppend 가리키는 LIST_ENTRY 구조의 멤버를 먼저 초기화해야 하며, 일반적으로 InitializeListHead 루틴을 호출합니다. 반면, InsertTailList 루틴에서는 InsertTailList 호출 전에 초기화할 Entry 매개 변수가 가리키는 LIST_ENTRY 구조의 Flink 및 Blink 멤버가 필요하지 않습니다. 이러한 이유로 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
함수는 ListHead 및 ListToAppend 매개 변수를 모두 목록 헤드에 대한 포인터로 처리합니다. 이 함수가 반환되면 listToAppend 가리키는 목록이 비어 있습니다. 즉, 연결된 목록 항목이 없는 목록 헤드로 구성됩니다. 이 목록에 처음 있던 모든 항목이 ListHead가리키는 목록에 추가되었습니다.
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | 바탕 화면 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h 포함) |
IRQL | 모든 수준(설명 섹션 참조) |