Fungsi AppendTailList (wdm.h)

Rutinitas AppendTailList menambahkan daftar struktur LIST_ENTRY yang ditautkan dua kali lipat ke ekor daftar struktur LIST_ENTRY yang ditautkan dua kali lipat.

Sintaks

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

Parameter

[in, out] ListHead

Penunjuk ke kepala daftar tempat daftar ditujukan oleh ListToAppend akan ditambahkan. Parameter ini harus berupa penunjuk non-NULL yang valid ke struktur LIST_ENTRY yang merupakan kepala daftar. Daftar ini bisa kosong.

[in, out] ListToAppend

Penunjuk ke entri pertama dalam daftar untuk ditambahkan ke daftar yang diarahkan oleh ListHead. Parameter ini harus berupa penunjuk non-NULL yang valid ke struktur LIST_ENTRY yang merupakan entri pertama dalam daftar tanpa kepala. Untuk informasi selengkapnya, lihat Keterangan.

Nilai kembali

Tidak ada

Keterangan

Rutinitas ini membuat daftar yang berisi semua entri gabungan dari daftar ListHead dan ListToAppend input. Saat rutinitas kembali, struktur LIST_ENTRY yang diarahkan oleh parameter ListHead adalah kepala daftar gabungan yang dihasilkan. Struktur LIST_ENTRY yang diacu oleh parameter ListToAppend adalah entri dalam daftar gabungan yang dihasilkan.

Penelepon mengatur parameter ListToAppend untuk menunjuk ke entri pertama dalam daftar yang akan ditambahkan. Dalam hal ini, AppendTailList tidak sesuai dengan konvensi yang diikuti oleh rutinitas daftar tertaut doubly lainnya yang menggunakan struktur LIST_ENTRY . Dalam rutinitas lain ini, parameter yang mewakili daftar menunjuk ke kepala daftar alih-alih ke entri pertama dalam daftar. Jika kode driver Anda menggunakan kepala daftar untuk mewakili daftar yang akan ditambahkan, kepala daftar harus dihapus dari daftar ini sebelum daftar diteruskan sebagai parameter ListToAppend ke AppendTailList. Untuk contoh kode yang memperlihatkan cara menghapus kepala daftar ini, lihat Contoh.

AppendTailList dapat digunakan untuk menyisipkan satu entri di ekor daftar, tetapi anggota Flink dan Blink dari struktur LIST_ENTRY yang diarahkan oleh ListToAppend harus terlebih dahulu diinisialisasi—biasanya, dengan memanggil rutinitas InitializeListHead . Sebaliknya, rutinitas InsertTailList tidak memerlukan anggota Flink dan Blink dari struktur LIST_ENTRY yang ditujukkan oleh parameter Entri untuk diinisialisasi sebelum panggilan InsertTailList . Untuk alasan ini, InsertTailList mungkin lebih nyaman digunakan untuk menyisipkan satu entri di ekor daftar.

Driver dapat mengakses anggota Flink dan Blink dari LIST_ENTRY, tetapi anggota hanya boleh diperbarui oleh rutinitas sistem yang disediakan untuk tujuan ini.

Untuk informasi tentang menggunakan rutinitas ini saat menerapkan daftar tertaut dua kali lipat, lihat Lists Tertaut Singly dan Doubly.

Pemanggil AppendTailList dapat berjalan di IRQL apa pun. Jika AppendTailList dipanggil di IRQL >= DISPATCH_LEVEL, penyimpanan untuk entri daftar harus berupa memory-resident.

Contoh

Contoh kode berikut menunjukkan cara menulis fungsi bernama MyAppendTailList yang mirip dengan AppendTailList, tetapi yang memperlakukan parameter ListToAppend sebagai penunjuk ke kepala daftar alih-alih sebagai penunjuk ke entri pertama dalam daftar (tanpa kepala). Tidak seperti AppendTailList, MyAppendTailList fungsi menghindari termasuk struktur LIST_ENTRY yang diarahkan oleh parameter ListToAppend dalam entri yang ditambahkan ke daftar yang diarahkan oleh parameter 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);
    }
}

Fungsi MyAppendTailList dalam contoh kode ini memperlakukan parameter ListHead dan ListToAppend sebagai penunjuk ke kepala daftar. Ketika fungsi ini kembali, daftar yang ditujukan oleh ListToAppend kosong; yaitu, terdiri dari kepala daftar yang tidak memiliki entri daftar terkait. Semua entri yang awalnya ada dalam daftar ini telah ditambahkan ke daftar yang diarahkan oleh ListHead.

Persyaratan

Persyaratan Nilai
Target Platform Desktop
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h)
IRQL Tingkat apa pun (Lihat bagian Keterangan)

Lihat juga

InitializeListHead

InsertTailList

LIST_ENTRY

RemoveEntryList