Функция AppendTailList (wdm.h)

Подпрограмма AppendTailList добавляет список LIST_ENTRY структур в две части списка LIST_ENTRY структур.

Синтаксис

void AppendTailList(
  [in, out] PLIST_ENTRY ListHead,
  [in, out] PLIST_ENTRY ListToAppend
);

Параметры

[in, out] ListHead

Указатель на заголовок списка, к которому добавляется список, на который указывает ListToAppend . Этот параметр должен быть допустимым указателем, не имеющим значения NULL, на структуру LIST_ENTRY , являющуюся головой списка. Этот список может быть пустым.

[in, out] ListToAppend

Указатель на первую запись в списке для добавления в список, на который указывает ListHead. Этот параметр должен быть допустимым указателем, не имеющим значения NULL, на структуру LIST_ENTRY , которая является первой записью в списке без заголовка. Дополнительные сведения см. в подразделе "Примечания".

Возвращаемое значение

None

Remarks

Эта подпрограмма создает список, содержащий все объединенные записи из входных списков ListHead и ListToAppend . Когда подпрограмма возвращается, структура LIST_ENTRY , на которую указывает параметр ListHead , является головой результирующего объединенного списка. Структура LIST_ENTRY , на которую указывает параметр ListToAppend , является записью в итоговом объединенном списке.

Вызывающий объект задает параметр ListToAppend , указывающий на первую запись в добавляемом списке. В этом отношении AppendTailList не соответствует соглашению, за которым следуют другие процедуры списков с удвоением, использующие структуру LIST_ENTRY . В этих других подпрограммах параметр, представляющий список, указывает на голову списка, а не на первую запись в списке. Если код драйвера использует голову списка для представления добавляемого списка, необходимо удалить ее из этого списка, прежде чем список будет передан в качестве параметра ListToAppend в AppendTailList. Пример кода, показывающий, как удалить эту голову списка, см. в разделе Примеры.

AppendTailList можно использовать для вставки одной записи в конце списка, но элементы Flink и Blinkструктуры LIST_ENTRY , на которую указывает ListToAppend , необходимо сначала инициализировать, обычно путем вызова подпрограммы InitializeListHead . В отличие от этого, подпрограмме InsertTailList не требуется инициализировать элементы Flink и Blinkструктуры LIST_ENTRY , на которую указывает параметр Entry , перед вызовом InsertTailList . По этой причине insertTailList может быть удобнее использовать для вставки одной записи в конце списка.

Драйвер может получить доступ к элементам Flink и BlinkLIST_ENTRY, но эти элементы должны обновляться только системными подпрограммами, предоставляемыми для этой цели.

Сведения об использовании этой процедуры при реализации списка с удвоениями см. в разделе Singly и Doubly Linked Списки.

Вызывающие функции AppendTailList могут выполняться в любой среде IRQL. Если метод AppendTailList вызывается в IRQL >= DISPATCH_LEVEL, хранилище для записей списка должно находиться в памяти.

Примеры

В следующем примере кода показано, как написать функцию с именем MyAppendTailList , похожую на AppendTailList, но рассматривающую параметр ListToAppend как указатель на голову списка, а не как указатель на первую запись в списке (без головного). В отличие от AppendTailList, MyAppendTailList функция избегает включения структуры LIST_ENTRY , на которую указывает параметр ListToAppend , в записи, которые добавляются в список, на который указывает параметр 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