Bagikan melalui


Menyiapkan dan Menggunakan Antrean Perangkat

Driver menyiapkan objek antrean perangkat dengan memanggil KeInitializeDeviceQueue pada driver atau inisialisasi perangkat. Setelah memulai perangkatnya, driver menyisipkan RUN ke dalam antrean ini dengan memanggil KeInsertDeviceQueue atau KeInsertByKeyDeviceQueue. Gambar berikut mengilustrasikan panggilan ini.

menyiapkan dan menggunakan antrean perangkat.

Seperti yang ditunjukkan oleh gambar ini, driver harus menyediakan penyimpanan untuk objek antrean perangkat, yang harus merupakan residen. Driver yang menyiapkan objek antrean perangkat biasanya menyediakan penyimpanan yang diperlukan dalam ekstensi perangkat dari objek perangkat yang dibuat driver, tetapi penyimpanan dapat berada di ekstensi pengontrol jika driver menggunakan objek pengontrol atau di kumpulan yang tidak dialokasikan oleh driver.

Jika driver menyediakan penyimpanan untuk objek antrean perangkat dalam ekstensi perangkat, driver memanggil KeInitializeDeviceQueue setelah membuat objek perangkat dan sebelum memulai perangkat. Dengan kata lain, driver dapat menginisialisasi antrean dari rutinitas AddDevice atau ketika menangani permintaan PnP IRP_MN_START_DEVICE . Dalam panggilan ke KeInitializeDeviceQueue, driver meneruskan pointer ke penyimpanan yang disediakannya untuk objek antrean perangkat.

Setelah memulai perangkatnya, driver dapat memasukkan IRP ke dalam antrean perangkatnya dengan memanggil KeInsertDeviceQueue, yang menempatkan IRP di ekor antrean, atau KeInsertByKeyDeviceQueue, yang menempatkan IRP ke dalam antrean sesuai dengan nilai SortKey yang ditentukan driver, seperti yang ditunjukkan pada gambar sebelumnya.

Masing-masing rutinitas dukungan ini mengembalikan nilai Boolean yang menunjukkan apakah IRP dimasukkan ke dalam antrean. Masing-masing panggilan ini juga mengatur status objek antrean perangkat ke Sibuk jika antrean saat ini kosong (Tidak Sibuk). Namun, jika antrean kosong (Tidak Sibuk), tidak ada KeInsertXxxDeviceQueue yang rutin menyisipkan IRP ke dalam antrean. Sebaliknya, ini mengatur status objek antrean perangkat ke Sibuk dan mengembalikan FALSE. Karena IRP belum diantrekan, pengemudi harus meneruskannya ke rutinitas driver lain untuk diproses lebih lanjut.

Saat menyiapkan antrean perangkat tambahan, ikuti panduan implementasi ini:

Ketika panggilan ke KeInsertXxxDeviceQueue mengembalikan FALSE, pemanggil harus meneruskan IRP yang coba diantrekan untuk pemrosesan lebih lanjut ke rutinitas driver lain. Namun, panggilan ke KeInsertXxxDeviceQueue mengubah status objek antrean perangkat menjadi Sibuk, sehingga IRP berikutnya yang akan masuk dimasukkan dalam antrean kecuali driver memanggil KeRemoveXxxDeviceQueue terlebih dahulu.

Saat status objek antrean perangkat diatur ke Sibuk, driver dapat menghapus antrean IRP untuk pemrosesan lebih lanjut atau mengatur ulang status ke Not-Busy dengan memanggil salah satu rutinitas dukungan berikut:

  • KeRemoveDeviceQueue untuk menghapus IRP di kepala antrean

  • KeRemoveByKeyDeviceQueue untuk menghapus IRP yang dipilih sesuai dengan nilai SortKey yang ditentukan driver

  • KeRemoveEntryDeviceQueue untuk menghapus IRP tertentu dalam antrean atau untuk menentukan apakah IRP tertentu berada dalam antrean

    KeRemoveEntryDeviceQueue mengembalikan Boolean yang menunjukkan apakah IRP berada dalam antrean perangkat.

Memanggil salah satu rutinitas ini untuk menghapus entri dari antrean perangkat yang kosong tetapi Sibuk mengubah status antrean menjadi Tidak Sibuk.

Setiap objek antrean perangkat dilindungi oleh kunci putaran eksekutif bawaan (tidak ditampilkan dalam gambar Menggunakan Objek Antrean Perangkat ). Akibatnya, driver dapat memasukkan IRP ke dalam antrean dan menghapusnya dengan cara multiprosesor-aman dari rutinitas driver apa pun yang berjalan pada kurang dari atau sama dengan IRQL = DISPATCH_LEVEL. Karena pembatasan IRQL ini, driver tidak dapat memanggil rutinitas KeXxxDeviceQueue dari rutinitas ISR atau SynchCritSection , yang berjalan di DIRQL.

Lihat Mengelola Prioritas Perangkat Keras dan Kunci Putar untuk informasi selengkapnya. Untuk persyaratan IRQL untuk rutinitas dukungan tertentu, lihat halaman referensi rutinitas.