Metode Pengiriman untuk Permintaan I/O

Ketika driver memanggil WdfIoQueueCreate untuk membuat antrean I/O, driver menentukan metode pengiriman untuk antrean. Kerangka kerja ini menyediakan tiga metode pengiriman: berurutan, paralel, dan manual. Driver dapat menentukan salah satu metode pengiriman ini untuk antrean I/O apa pun, termasuk antrean I/O default perangkat.

Driver menetapkan metode pengiriman antrean dengan menentukan nilai yang ditik WDF_IO_QUEUE_DISPATCH_TYPE dalam struktur WDF_IO_QUEUE_CONFIG antrean.

Misalnya penggunaan setiap metode pengiriman, lihat Contoh Penggunaan Antrean I/O.

Pengiriman Berurutan

Jika driver atau perangkat Anda hanya dapat memproses satu permintaan I/O dari antrean pada satu waktu, Anda harus mengatur antrean I/O perangkat untuk menggunakan pengiriman berurutan, yang juga disebut pengiriman sinkron. Dengan jenis pengiriman ini, kerangka kerja mengirimkan permintaan kepada driver satu per satu. Kerangka kerja tidak mengirimkan permintaan berikutnya sampai driver selesai, membatalkan, atau mengantre ulang permintaan sebelumnya.

Setelah kerangka kerja mengirimkan permintaan ke salah satu penangan permintaan driver, driver memproses permintaan. Jika driver meneruskan permintaan ke target I/O umum, biasanya memanggil salah satu metode sinkron objek target I/O. Untuk informasi selengkapnya tentang metode ini, lihat Mengirim Permintaan I/O Secara sinkron. Driver akhirnya harus menyelesaikan atau membatalkan setiap permintaan yang diterimanya dari antrean I/O.

Driver yang telah menyiapkan antrean I/O untuk pengiriman berurutan dapat memanggil WdfIoQueueRetrieveNextRequest atau WdfIoQueueRetrieveRequestByFileObject untuk mendapatkan permintaan lain dari antrean sebelum permintaan terakhir yang diterima telah selesai atau dibatalkan. Anda mungkin ingin melakukan ini dalam driver fungsi, sehingga driver dapat memulai operasi perangkat keras berikutnya saat fungsi panggilan balik EvtInterruptDpc driver masih memproses data dari operasi perangkat keras sebelumnya.

Jika Anda membuat beberapa antrean I/O dan mengatur semuanya untuk pengiriman berurutan, kerangka kerja mengirimkan permintaan dari setiap antrean secara berurutan, tetapi antrean berjalan secara paralel. Jika driver atau perangkat Anda hanya dapat memproses satu permintaan pada satu waktu dari jenis apa pun, Anda harus menggunakan satu antrean I/O dengan fungsi panggilan balik EvtIoDefault .

Pengiriman Paralel

Jika driver dan perangkat Anda dapat memproses beberapa permintaan I/O secara bersamaan, Anda dapat mengatur antrean I/O perangkat untuk menggunakan pengiriman paralel sehingga driver dapat memproses permintaan secara asinkron. Metode pengiriman ini juga disebut pengiriman asinkron.

Jika driver menyiapkan antrean I/O untuk menggunakan pengiriman paralel, kerangka kerja mengirimkan permintaan I/O ke driver segera setelah tersedia dalam antrean. Hasilnya adalah bahwa driver mungkin harus memproses beberapa permintaan sekaligus.

Setiap kali salah satu penangan permintaan driver menerima permintaan, driver harus memproses permintaan dan kemudian menyelesaikan permintaan. Jika driver meneruskan permintaan ke target I/O umum, biasanya memanggil salah satu metode asinkron objek target I/O. Untuk informasi selengkapnya tentang metode ini, lihat Mengirim Permintaan I/O Secara Asinkron. Driver akhirnya harus menyelesaikan atau membatalkan setiap permintaan yang diterimanya dari antrean I/O.

Driver yang menggunakan pengiriman paralel dapat memanggil WdfIoQueueStop atau WdfIoQueueStopSynchronously untuk menghentikan sementara antrean, lalu memanggil WdfIoQueueStart untuk memulai ulang antrean.

Pengiriman Manual

Jika Anda ingin driver Anda memiliki kontrol penuh atas pengiriman permintaan I/O, Anda dapat mengatur antrean I/O perangkat untuk menggunakan pengiriman manual, yang berarti bahwa kerangka kerja tidak mengirimkan permintaan ke driver kecuali driver secara eksplisit memintanya.

Untuk mendapatkan permintaan dari antrean manual, driver dapat memanggil WdfIoQueueRetrieveNextRequest atau WdfIoQueueRetrieveRequestByFileObject dalam loop yang melakukan polling antrean. Atau, driver dapat memanggil WdfIoQueueReadyNotify untuk mendaftarkan fungsi panggilan balik yang akan dipanggil kerangka kerja ketika satu atau beberapa permintaan tersedia dalam antrean. Setelah kerangka kerja memanggil fungsi panggilan balik, driver dapat memanggil WdfIoQueueRetrieveNextRequest atau WdfIoQueueRetrieveRequestByFileObject dalam perulangan untuk mengambil permintaan.

Setelah driver mendapatkan permintaan dari antrean, driver harus memproses permintaan. Driver akhirnya harus menyelesaikan atau membatalkan setiap permintaan.