Función AppendTailList (wdm.h)
La rutina AppendTailList anexa una lista doblemente vinculada de estructuras de LIST_ENTRY a la cola de otra lista doblemente vinculada de estructuras LIST_ENTRY.
Sintaxis
void AppendTailList(
[in, out] PLIST_ENTRY ListHead,
[in, out] PLIST_ENTRY ListToAppend
);
Parámetros
[in, out] ListHead
Puntero al encabezado de la lista a la que se va a anexar la lista a la que apunta ListToAppend. Este parámetro debe ser un puntero válido que no sea NULL a la estructura LIST_ENTRY que es el encabezado de una lista. Esta lista puede estar vacía.
[in, out] ListToAppend
Puntero a la primera entrada de la lista a la que se va a anexar a la lista a la que apunta ListHead. Este parámetro debe ser un puntero válido que no sea NULL a la estructura LIST_ENTRY que es la primera entrada de una lista sin encabezado. Para obtener más información, vea Comentarios.
Valor devuelto
Ninguno
Observaciones
Esta rutina construye una lista que contiene todas las entradas combinadas de la ListHead de entrada y listas de ListToAppend. Cuando se devuelve la rutina, la estructura de LIST_ENTRY a la que apunta el parámetro ListHead es el encabezado de la lista combinada resultante. La estructura LIST_ENTRY a la que apunta el parámetro ListToAppend es una entrada de la lista combinada resultante.
El autor de la llamada establece el parámetro ListToAppend para que apunte a la primera entrada de la lista que se va a anexar. A este respecto, AppendTailList no se ajusta a la convención seguida de las otras rutinas de lista vinculadas duplicadas que usan la estructura de LIST_ENTRY. En estas otras rutinas, un parámetro que representa una lista apunta al encabezado de la lista en lugar de a la primera entrada de la lista. Si el código de controlador usa un encabezado de lista para representar la lista que se va a anexar, el encabezado de lista debe quitarse de esta lista antes de que se pase la lista como parámetro listToAppend para AppendTailList. Para obtener un ejemplo de código que muestra cómo quitar este encabezado de lista, vea Ejemplos.
AppendTailList se puede usar para insertar una sola entrada en la cola de una lista, pero los Flink y Blink miembros de la estructura de LIST_ENTRY a la que apunta ListToAppend deben inicializarse, normalmente, llamando a la rutina InitializeListHead de. Por el contrario, la rutina insertTailList no requiere que se inicialicen los de Flink y Blink miembros de la estructura de LIST_ENTRY apuntado por el parámetro Entry antes de la llamada InsertTailList de. Por este motivo, insertTailList puede ser más conveniente usar para insertar una sola entrada en la cola de una lista.
Un controlador puede acceder al de Flink y miembros de un LIST_ENTRY, pero las rutinas del sistema proporcionadas para este propósito solo deben actualizar los miembros.
Para obtener información sobre cómo usar esta rutina al implementar una lista vinculada doble, consulte Listas vinculadas duplicadas y duplicadas.
Los autores de llamadas de AppendTailList se pueden ejecutar en cualquier IRQL. Si se llama a appendTailList en IRQL >= DISPATCH_LEVEL, el almacenamiento de las entradas de lista debe ser residente en memoria.
Ejemplos
En el ejemplo de código siguiente se muestra cómo escribir una función denominada MyAppendTailList
similar a AppendTailList, pero que trata el parámetro ListToAppend como puntero a un encabezado de lista en lugar de como puntero a la primera entrada de una lista (sin encabezado). A diferencia de AppendTailList, la función MyAppendTailList
evita incluir la estructura LIST_ENTRY a la que apunta el parámetro ListToAppend en las entradas que se anexan a la lista a la que apunta el parámetro 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);
}
}
La función MyAppendTailList
de este ejemplo de código trata los parámetros listHead y ListToAppend como punteros a encabezados de lista. Cuando se devuelve esta función, la lista a la que apunta ListToAppend está vacía; es decir, consta de un encabezado de lista que no tiene entradas de lista asociadas. Todas las entradas que se encontraban inicialmente en esta lista se han anexado a la lista a la que apunta ListHead.
Requisitos
Requisito | Valor |
---|---|
de la plataforma de destino de | Escritorio |
encabezado de | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h) |
irQL | Cualquier nivel (consulte la sección Comentarios) |