Fungsi RtlInsertElementGenericTableFullAvl (ntddk.h)
Rutinitas RtlInsertElementGenericTableFullAvl menambahkan entri baru ke tabel generik.
Sintaks
NTSYSAPI PVOID RtlInsertElementGenericTableFullAvl(
[in] PRTL_AVL_TABLE Table,
[in] PVOID Buffer,
[in] CLONG BufferSize,
[out, optional] PBOOLEAN NewElement,
[in] PVOID NodeOrParent,
[in] TABLE_SEARCH_RESULT SearchResult
);
Parameter
[in] Table
Penunjuk ke tabel Adelson-Velsky/Landis (AVL) generik (RTL_AVL_TABLE) yang diinisialisasi oleh panggilan ke RtlInitializeGenericTableAvl.
[in] Buffer
Buffer yang dialokasikan penelepon yang berisi data pengguna untuk disalin ke elemen baru. Untuk informasi selengkapnya, lihat RtlInitializeGenericTableAvl.
[in] BufferSize
Ukuran dalam byte data di Buffer.
[out, optional] NewElement
Pada output, nilai TRUE berarti penyisipan elemen baru dalam tabel generik berhasil. Nilai FALSE berarti penyisipan gagal.
[in] NodeOrParent
Hasil pencarian dari panggilan sebelumnya ke RtlLookupElementGenericTableFullAvl. Nilai ini menunjukkan rutinitas RtlInsertElementGenericTableFullAvl apakah pohon saat ini kosong, atau jika tidak kosong, apakah akan menyisipkan entri baru ke kiri atau kanan entri induk. Parameter SearchResult dapat memiliki salah satu nilai berikut:
TableEmptyTree
Pohonnya kosong. Isi NodeOrParentbelum diubah.
TableFoundNode
Rutinitas RtlInsertElementGenericTableFullAvl menemukan entri tabel yang kuncinya cocok dengan data di Buffer. NodeOrParent berisi penunjuk ke entri yang cocok.
TableInsertAsLeft
Rutinitas RtlInsertElementGenericTableFullAvltidak menemukan entri tabel yang kuncinya cocok dengan data di Buffer. Jika entri yang dicari RtlInsertElementGenericTableFullAvl berada dalam tabel, itu akan menjadi anak kiri dari entri yang ditunjuk NodeOrParent .
TableInsertAsRight
Rutinitas RtlInsertElementGenericTableFullAvltidak menemukan entri tabel yang kuncinya cocok dengan data di Buffer. Jika entri yang dicari RtlInsertElementGenericTableFullAvl berada dalam tabel, itu akan menjadi turunan kanan dari entri yang ditunjuk NodeOrParent .
[in] SearchResult
Penunjuk ke entri tabel. Jika rutinitas RtlInsertElementGenericTableFullAvl cocok dengan entri, NodeOrParent menunjuk ke entri yang cocok. Jika rutinitas RtlInsertElementGenericTableFullAvl gagal menemukan kecocokan, NodeOrParent menunjuk ke entri yang akan menjadi induk entri yang dicari oleh rutinitas RtlInsertElementGenericTableFullAvl .
Nilai kembali
RtlInsertElementGenericTableFullAvl mengembalikan penunjuk ke data pengguna untuk entri yang baru disisipkan, atau data pengguna untuk entri yang cocok yang sudah ada dalam tabel generik. Jika tidak ada entri yang cocok yang ditemukan, tetapi RtlInsertElementGenericTableFullAvl tidak dapat menyisipkan entri baru (misalnya, karena AllocateRoutine gagal), RtlInsertElementGenericTableFullAvl mengembalikan NULL.
Keterangan
Untuk menyisipkan entri, RtlInsertElementGenericTableFullAvl memanggil CompareRoutine dan AllocateRoutine yang didaftarkan ketika tabel generik diinisialisasi oleh RtlInitializeGenericTableAvl. Setelah menyisipkan entri baru, RtlInsertElementGenericTableFullAvl menyeimbangkan kembali pohon tautan AVL.
Saat entri baru disisipkan ke dalam tabel, datanya disalin dari Buffer ke entri baru. Dengan demikian pointer yang dikembalikan oleh RtlInsertElementGenericTableFullAvl tidak pernah sama dengan Buffer.
Jika CompareRoutine penelepon mengembalikan GenericEqual, data di Buffer diasumsikan untuk menduplikasi data untuk entri yang ada dalam tabel generik. Dalam hal ini, RtlInsertElementGenericTableFullAvl tidak menambahkan entri baru (dan dengan demikian tidak memanggil AllocateRoutine), karena tabel generik tidak dapat memiliki entri duplikat.
Jika entri yang cocok sudah ada dalam tabel generik, RtlInsertElementGenericTableFullAvl mengembalikan penunjuk ke data entri yang ada dan mengatur NewElement ke FALSE.
Jika tidak ada entri yang cocok dalam tabel sudah,RtlInsertElementGenericTableFullAvl rutin mengalokasikan ruang yang cukup untuk data pengguna entri baru (BufferSize) ditambah tautan yang terkait dengan entri baru. Dengan demikian jumlah total byte akan setidaknya bufferSize + sizeof(BALANCED_LINKS). Pemanggil tidak boleh menggunakan byte ukuranof(BALANCED_LINKS) pertama dari memori yang dialokasikan AllocateRoutine.
PeneleponRtl.. Rutinitas GenericTableAvl bertanggung jawab untuk menyinkronkan akses secara eksklusif ke tabel generik. Mutex cepat eksklusif adalah mekanisme sinkronisasi yang paling efisien untuk digunakan untuk tujuan ini.
Secara default, sistem operasi menggunakan pohon splay untuk mengimplementasikan tabel generik, tetapi rutinitas RtlInsertElementGenericTableFullAvl hanya berfungsi dengan pohon Adelson-Velsky/Landis (AVL). Untuk mengonfigurasi rutinitas tabel generik untuk menggunakan pohon AVL alih-alih pohon splay di driver Anda, masukkan pernyataan definisi berikut dalam file header umum sebelum menyertakan Ntddk.h:
#define RTL_USE_AVL_TABLES 0
Jika RTL_USE_AVL_TABLES tidak ditentukan, Anda harus menggunakan bentuk AVL dari rutinitas tabel generik. Misalnya, gunakan rutinitas RtlInsertElementGenericTableFullAvl alih-alihRtlInsertElementGenericTableFull. Dalam panggilan ke RtlInsertElementGenericTableFullAvl, pemanggil harus melewati struktur tabel RTL_AVL_TABLE daripada RTL_GENERIC_TABLE.
Penelepon RtlInsertElementGenericTableFullAvl harus berjalan di IRQL < DISPATCH_LEVEL jika salah satu kondisi berikut berlaku:
- Memori yang dialokasikan penelepon di Tabel atau di Buffer dapat di-pageable.
- CompareRoutine atau AllocateRoutine yang disediakan penelepon berisi kode yang dapat dipaginasi.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia di Windows XP dan versi yang lebih baru dari sistem operasi Windows. |
Target Platform | Universal |
Header | ntddk.h (termasuk Ntddk.h, Ntifs.h) |
Pustaka | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL (lihat bagian Keterangan) |