Mengelola Antrean I/O

Memulai Antrean I/O

Ketika driver memanggil WdfIoQueueCreate untuk membuat antrean I/O, kerangka kerja secara otomatis memungkinkan antrean untuk menerima permintaan I/O dan mengirimkannya ke driver.

Driver biasanya memanggil WdfIoQueueCreate dari dalam fungsi panggilan balik EvtDriverDeviceAdd . Kerangka kerja dapat mulai mengirimkan permintaan I/O ke driver setelah fungsi panggilan balik EvtDriverDeviceAdd driver kembali.

Jika driver Anda menggunakan antrean I/O yang dikelola daya , kerangka kerja tidak dapat mulai mengirimkan permintaan ke driver Anda hingga perangkat memasuki status kerjanya dan kerangka kerja telah memanggil fungsi panggilan balik EvtDeviceD0Entry driver.

Menghentikan dan Memulai Ulang Antrean I/O

Driver Anda dapat memanggil WdfIoQueueStop atau WdfIoQueueStopSynchronously untuk sementara waktu mencegah kerangka kerja mengirimkan permintaan I/O dari antrean I/O. Untuk melanjutkan pengiriman permintaan I/O, driver memanggil WdfIoQueueStart.

Jika driver Anda menggunakan antrean I/O yang dikelola daya, kerangka kerja secara otomatis menghentikan antrean perangkat saat perangkat meninggalkan status kerja (D0), dan kerangka kerja memulai ulang antrean saat status perangkat kembali ke D0.

Menambahkan Permintaan ke Antrean I/O

Ketika sistem mengirim permintaan kontrol I/O baca, tulis, atau perangkat ke driver, kerangka kerja menempatkan permintaan dalam antrean I/O. Driver dapat mengontrol jenis permintaan yang disimpan kerangka kerja di setiap antrean dengan memanggil WdfDeviceConfigureRequestDispatching.

Driver juga dapat mengantre ulang permintaan yang telah diterimanya dari kerangka kerja, dengan memanggil WdfRequestForwardToIoQueue.

Mendapatkan Permintaan dari Antrean I/O

Jika driver menentukan metode pengiriman berurutan atau paralel untuk antrean I/O, driver akan menerima permintaan dalam penangan permintaan.

Jika driver menentukan metode pengiriman manual atau berurutan, driver dapat memperoleh permintaan dengan memanggil WdfIoQueueRetrieveNextRequest atau WdfIoQueueRetrieveRequestByFileObject.

Mencari Permintaan I/O

Jika driver menentukan metode pengiriman manual untuk antrean I/O, driver dapat menggunakan langkah-langkah berikut untuk mencari permintaan tertentu dalam antrean:

  1. Panggil WdfIoQueueFindRequest untuk menemukan permintaan yang cocok dengan kriteria yang ditentukan driver.

  2. Panggil WdfIoQueueRetrieveFoundRequest untuk mengambil permintaan yang terletak di WdfIoQueueFindRequest .

Membersihkan atau Menguras Antrean I/O

Membersihkan antrean I/O berarti menghentikan penyisipan permintaan I/O ke dalam antrean dan membatalkan permintaan apa pun yang sudah ada dalam antrean.

Menguras antrean I/O berarti menghentikan penyisipan permintaan I/O ke dalam antrean, sambil mengizinkan permintaan apa pun yang sudah berada dalam antrean untuk dikirimkan ke driver.

Driver biasanya membersihkan atau menguras antrean mereka hanya jika antrean tidak dikelola daya. Untuk antrean I/O yang dikelola daya, driver dapat menyediakan fungsi panggilan balik EvtIoStop dan EvtIoResume .

Jika beberapa antrean driver Anda tidak dikelola daya, Anda mungkin ingin menghapus menyeluruh atau menguras antrean jika perangkat atau saluran I/O terkait menjadi tidak tersedia. Biasanya, Anda akan menghapus menyeluruh, alih-alih menguras, antrean kecuali ada kemungkinan besar bahwa setiap permintaan berisi informasi yang sangat penting. Misalnya, driver untuk perangkat jaringan mungkin menghapus menyeluruh antreannya, sementara driver untuk perangkat penyimpanan kemungkinan akan menguras antreannya.

Jika Anda ingin driver Anda membersihkan atau menguras antrean I/O, driver dapat memanggil salah satu metode objek antrean berikut:

Berhati-hatilah saat memanggil WdfIoQueueDrain dan WdfIoQueueDrainSynchronously. Karena operasi pengosongan menunggu permintaan selesai, Anda hanya boleh menguras antrean jika Anda yakin bahwa permintaan antrean yang tertunda akan selesai tepat waktu. Jika Anda tidak tahu berapa lama waktu yang diperlukan untuk menyelesaikan permintaan I/O dan dapat diterima untuk membatalkan permintaan yang beredar, pertimbangkan untuk membersihkan antrean.

Memindahkan Permintaan dari Satu Antrean I/O ke Antrean I/O Lainnya

Setelah driver Anda menerima permintaan I/O, Anda mungkin ingin driver mengantre ulang permintaan ke dalam antrean I/O yang berbeda. Untuk melakukan ini, driver memanggil WdfRequestForwardToIoQueue atau WdfRequestForwardToParentDeviceIoQueue, yang menambahkan permintaan ke ekor antrean tertentu. Akhirnya, kerangka kerja akan mengirimkan permintaan ke driver lagi dengan menggunakan metode pengiriman antrean yang ditentukan. Untuk informasi selengkapnya tentang memindahkan permintaan I/O dari satu antrean I/O ke antrean I/O lainnya, lihat Mengantre ulang Permintaan I/O.

Mencegat Permintaan I/O sebelum Diantrekan

Dimungkinkan bagi driver untuk mencegat permintaan I/O sebelum kerangka kerja menempatkan permintaan dalam antrean I/O. Untuk mencegat permintaan I/O, driver harus memanggil WdfDeviceInitSetIoInCallerContextCallback untuk mendaftarkan fungsi panggilan balik EvtIoInCallerContext .

Kerangka kerja mengaitkan fungsi panggilan balik EvtIoInCallerContext dengan perangkat. Akibatnya, kerangka kerja memanggil fungsi panggilan balik EvtIoInCallerContext setiap kali menerima permintaan yang dikirim sistem ke perangkat.

Biasanya, ketika fungsi panggilan balik EvtIoInCallerContext menerima permintaan, fungsi ini melakukan beberapa pemrosesan awal untuk permintaan tersebut. Selanjutnya, fungsi panggilan balik memanggil WdfDeviceEnqueueRequest, yang memberikan permintaan kembali ke kerangka kerja. Kerangka kerja kemudian dapat menempatkan permintaan dalam antrean I/O yang tepat, seperti yang akan terjadi jika tidak memanggil fungsi panggilan balik EvtIoInCallerContext .

Alasan utama bahwa driver mungkin menyediakan fungsi panggilan balik EvtIoInCallerContext adalah bahwa driver harus menangani operasi I/O yang mendukung metode I/O yang disebut tidak di-buffer atau I/O langsung. Untuk metode I/O ini, driver harus mengakses buffer yang diterima dalam konteks proses penampung permintaan I/O. Untuk informasi selengkapnya, lihat Mengakses Buffer Data di Driver Framework-Based.

Mendapatkan Properti Antrean I/O

Untuk mendapatkan properti objek antrean kerangka kerja, driver dapat memanggil metode berikut: