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 所指向清單之清單之第一個項目的指標,ListHead。 此參數必須是無外設清單中第一個專案之 LIST_ENTRY 結構的有效非 NULL 指標。 如需詳細資訊,請參閱。
傳回值
沒有
言論
此例程會建構清單,其中包含來自輸入 ListHead 和 ListToAppend 清單的所有合併專案。 當例程傳回時,ListHead 參數所指向的 LIST_ENTRY 結構是結果合併清單的前端。 ListToAppend 參數所指向的 LIST_ENTRY 結構是結果合併清單中的專案。
呼叫端會將 ListToAppend 參數設定為指向要附加之清單中的第一個專案。 在這方面,AppendTailList 不符合慣例,後面接著使用 LIST_ENTRY 結構的其他雙重連結清單例程。 在這些其他例程中,代表清單的 參數會指向清單標頭,而不是指向清單中的第一個專案。 如果您的驅動程式程式代碼使用清單標頭來代表要附加的清單,必須先從此清單中移除清單標頭,才能將清單傳遞為 ListToAppend 參數,以 AppendTailList。 如需示範如何移除此列表標頭的程式代碼範例,請參閱範例。
AppendTailList 可用來在清單尾端插入單一專案,但 Flink 和 BlinkLIST_ENTRY 結構的成員 ListToAppend 必須先初始化,通常是藉由呼叫 InitializeListHead 例程。 相反地,InsertTailList 例程不需要 Flink 和 BlinkLIST_ENTRY 結構的成員,Entry 參數在 呼叫 insertTailList 呼叫之前初始化。 因此,InsertTailList 可能更方便用來在清單尾端插入單一專案。
驅動程式可以存取 Flink 和 BlinkLIST_ENTRY成員,但成員只能由為此用途提供的系統例程更新。
如需實作多倍連結清單時使用此例程的相關信息,請參閱 Singly 和 Doubly 連結清單。
AppendTailList 的呼叫端可以在任何 IRQL 上執行。 如果在 IRQL >= DISPATCH_LEVEL呼叫 appendTailList ,則列表專案的記憶體必須是記憶體駐地。
例子
下列程式代碼範例示範如何撰寫名為 MyAppendTailList
的函式,類似於 appendTailList,但會將 ListToAppend 參數視為清單前端的指標,而不是做為 (headless) 清單中第一個專案的指標。 不同於 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 | 任何層級 (請參閱一節) |