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

Lihat juga

ExFreePool

ExFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM