Fungsi ExQueueWorkItem (wdm.h)
ExQueueWorkItem menyisipkan item kerja tertentu ke dalam antrean tempat utas pekerja sistem menghapus item dan memberikan kontrol pada rutinitas yang diberikan pemanggil ke ExInitializeWorkItem.
Peringatan
Gunakan rutinitas ini dengan sangat hati-hati. Lihat bagian Keterangan di bawah ini.
Sintaks
void ExQueueWorkItem(
[in, out] __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
[in] WORK_QUEUE_TYPE QueueType
);
Parameter
[in, out] WorkItem
Arahkan ke item kerja. Item kerja ini harus diinisialisasi oleh panggilan sebelumnya ke ExInitializeWorkItem.
[in] QueueType
Menentukan antrean tempat item kerja yang ditujukan oleh WorkItem akan disisipkan. QueueType dapat berupa salah satu hal berikut ini:
Nilai | Makna |
---|---|
CriticalWorkQueue | Masukkan WorkItem ke dalam antrean tempat utas sistem dengan atribut prioritas real time akan memproses item kerja. |
DelayedWorkQueue | Sisipkan WorkItem ke dalam antrean tempat utas sistem dengan atribut prioritas variabel akan memproses item kerja. |
Nilai QueueTypeHyperCriticalWorkQueue disediakan untuk penggunaan sistem.
Mengembalikan nilai
Tidak ada
Keterangan
Driver perangkat harus menggunakan IoQueueWorkItem alih-alih ExQueueWorkItem. Driver harus menggunakan ExQueueWorkItem, dan ExInitializeWorkItem terkait, hanya jika item kerja yang ditentukan tidak terkait dengan objek perangkat atau tumpukan perangkat. Dalam semua kasus lain, driver harus menggunakan IoAllocateWorkItem, IoFreeWorkItem, dan IoQueueWorkItem karena hanya rutinitas ini yang memastikan bahwa objek perangkat yang terkait dengan item kerja yang ditentukan tetap tersedia sampai item kerja telah diproses.
Rutinitas panggilan balik yang ditentukan dalam parameter Rutin ke ExInitializeWorkItem dipanggil dalam konteks sistem di IRQL PASSIVE_LEVEL. Rutinitas yang disediakan penelepon ini bertanggung jawab untuk membebaskan item kerja ketika tidak lagi diperlukan dengan memanggil ExFreePool atau ExFreePoolWithTag.
Utas pekerja sistem adalah sumber daya terbatas. Driver tidak boleh mencadangkan item kerja secara permanen untuk penggunaan driver. Item kerja dirancang untuk operasi yang selesai dengan cepat. Driver harus membebaskan item kerja apa pun yang mereka alokasikan sesegera mungkin.
Driver tidak boleh menunggu rutinitas panggilan baliknya untuk menyelesaikan operasi jika sudah memegang satu objek sinkronisasi dan mungkin mencoba memperoleh yang lain. Untuk mencegah kebuntuan, driver harus merilis semaphores, mutex, variabel sumber daya, dan sebagainya saat ini sebelum memanggil ExQueueWorkItem.
Nilai QueueType menentukan prioritas runtime di mana rutinitas panggilan balik dijalankan, sebagai berikut:
Jika panggilan balik berjalan di utas sistem dengan atribut prioritas real-time, rutinitas panggilan balik tidak dapat didahulukan kecuali dengan utas dengan prioritas real-time yang lebih tinggi.
Jika panggilan balik berjalan di utas sistem dengan atribut prioritas variabel, panggilan balik dapat didahulukan oleh utas dengan variabel dan prioritas real-time yang lebih tinggi, dan panggilan balik dijadwalkan untuk menjalankan round-robin dengan utas lain dengan prioritas yang sama untuk masing-masing kuantum.
Utas pada kedua prioritas tetap dapat diinterupsi.
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Universal |
Header | wdm.h (termasuk Wdm.h, Ntifs.h, Fltkernel.h) |
Pustaka | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |