Funzione AppendTailList (wdm.h)
La routine AppendTailList aggiunge un elenco doubly collegato di strutture di LIST_ENTRY alla fine di un altro elenco di strutture LIST_ENTRY collegate in modo doubly.
Sintassi
void AppendTailList(
[in, out] PLIST_ENTRY ListHead,
[in, out] PLIST_ENTRY ListToAppend
);
Parametri
[in, out] ListHead
Puntatore all'inizio dell'elenco a cui deve essere aggiunto l'elenco a cui punta ListToAppend. Questo parametro deve essere un puntatore non NULL valido alla struttura LIST_ENTRY che rappresenta l'inizio di un elenco. Questo elenco può essere vuoto.
[in, out] ListToAppend
Puntatore alla prima voce dell'elenco a cui aggiungere l'elenco a cui punta ListHead. Questo parametro deve essere un puntatore non NULL valido alla struttura LIST_ENTRY che rappresenta la prima voce di un elenco headless. Per altre informazioni, vedere Osservazioni.
Valore restituito
Nessuno
Osservazioni
Questa routine crea un elenco che contiene tutte le voci combinate degli elenchi di ListHead e ListToAppend. Quando la routine viene restituita, la struttura LIST_ENTRY a cui punta il parametro ListHead è l'intestazione dell'elenco combinato risultante. La struttura LIST_ENTRY a cui punta il parametro ListToAppend è una voce nell'elenco combinato risultante.
Il chiamante imposta il parametro ListToAppend in modo che punti alla prima voce dell'elenco da aggiungere. A questo proposito, AppendTailList non è conforme alla convenzione seguita dalle altre routine elenco collegate doubly che utilizzano la struttura LIST_ENTRY. In queste altre routine, un parametro che rappresenta un elenco punta alla testa dell'elenco anziché alla prima voce dell'elenco. Se il codice driver usa un elenco head per rappresentare l'elenco da aggiungere, è necessario rimuovere l'intestazione dell'elenco da questo elenco prima che l'elenco venga passato come parametro ListToAppend per AppendTailList. Per un esempio di codice che mostra come rimuovere questa intestazione elenco, vedere Esempi.
AppendTailList può essere utilizzato per inserire una singola voce nella parte finale di un elenco, ma è necessario inizializzare prima Flink e Blink membri della struttura LIST_ENTRY a cui punta ListToAppend, in genere chiamando la routine initializeListHead. Al contrario, la routine insertTailList non richiede che il Flink e i membri Blink della struttura LIST_ENTRY a cui punta il parametro Entry venga inizializzato prima della chiamata InsertTailList. Per questo motivo, insertTailList potrebbe essere più utile usare per inserire una singola voce nella parte finale di un elenco.
Un driver può accedere al Flink e Blink membri di un LIST_ENTRY, ma i membri devono essere aggiornati solo dalle routine di sistema fornite a questo scopo.
Per informazioni sull'uso di questa routine durante l'implementazione di un elenco collegato doubly, vedere Elenchi collegati doubly e Doubly.
I chiamanti di AppendTailList possono essere eseguiti in qualsiasi IRQL. Se AppendTailList viene chiamato in IRQL >= DISPATCH_LEVEL, l'archiviazione per le voci dell'elenco deve essere residente in memoria.
Esempi
Nell'esempio di codice seguente viene illustrato come scrivere una funzione denominata MyAppendTailList
simile a AppendTailList, ma che considera il parametro ListToAppend come puntatore a una testa di elenco anziché come puntatore alla prima voce di un elenco (headless). A differenza di AppendTailList, la funzione MyAppendTailList
evita di includere la struttura LIST_ENTRY a cui punta il parametro ListToAppend nelle voci aggiunte all'elenco a cui punta il parametro 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 funzione MyAppendTailList
in questo esempio di codice considera i parametri ListHead e ListToAppend come puntatori alle teste elenco. Quando questa funzione viene restituita, l'elenco a cui punta ListToAppend è vuoto; ovvero è costituito da un elenco head che non ha voci di elenco associate. Tutte le voci inizialmente incluse in questo elenco sono state aggiunte all'elenco a cui punta ListHead.
Fabbisogno
Requisito | Valore |
---|---|
piattaforma di destinazione | Desktop |
intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h) |
IRQL | Qualsiasi livello (vedere la sezione Osservazioni) |