Membatalkan Permintaan I/O
Operasi I/O perangkat yang sedang berlangsung (seperti permintaan untuk membaca beberapa blok dari disk) dapat dibatalkan oleh aplikasi, sistem, atau driver. Jika operasi I/O perangkat dibatalkan, manajer I/O mencoba membatalkan semua permintaan I/O yang tidak diolah yang terkait dengan operasi I/O. Driver perangkat dapat mendaftar untuk diberi tahu ketika manajer I/O mencoba membatalkan permintaan I/O, dan driver dapat membatalkan permintaan yang mereka miliki dengan menyelesaikannya dengan status penyelesaian STATUS_CANCELLED.
Kerangka kerja menangani beberapa pekerjaan pembatalan untuk driver berbasis kerangka kerja. Jika operasi I/O perangkat dibatalkan, kerangka kerja menyelesaikan permintaan I/O berikut (dengan status penyelesaian STATUS_CANCELLED) yang terkait dengan operasi yang dibatalkan:
Permintaan I/O yang tidak terbayangkan bahwa kerangka kerja telah ditempatkan dalam antrean I/O default driver.
Permintaan I/O yang tidak terbayangkan bahwa kerangka kerja telah diteruskan ke antrean lain karena driver yang disebut WdfDeviceConfigureRequestDispatching.
Karena kerangka kerja membatalkan permintaan ini, kerangka kerja tidak mengirimkannya ke driver.
Setelah kerangka kerja mengirimkan permintaan I/O ke driver, driver memiliki permintaan dan kerangka kerja tidak dapat membatalkannya. Pada titik ini, hanya driver yang dapat membatalkan permintaan I/O, tetapi kerangka kerja harus memberi tahu driver bahwa permintaan harus dibatalkan. Driver menerima pemberitahuan ini dengan menyediakan fungsi panggilan balik EvtRequestCancel .
Terkadang driver menerima permintaan I/O dari antrean I/O tetapi, alih-alih memproses permintaan, driver mengantre ulang permintaan ke antrean I/O yang sama atau lainnya untuk diproses nanti. Contoh situasi ini meliputi yang berikut ini:
Kerangka kerja mengirimkan permintaan I/O ke salah satu penangan permintaan driver, dan driver kemudian memanggil WdfRequestForwardToIoQueue (atau WdfRequestForwardToParentDeviceIoQueue) untuk menempatkan permintaan dalam antrean yang berbeda atau WdfRequestRequeue untuk menempatkan permintaan kembali ke antrean yang sama.
Kerangka kerja mengirimkan permintaan I/O ke fungsi panggilan balik EvtIoInCallerContext driver, driver memanggil WdfDeviceEnqueueRequest untuk meneruskan permintaan kembali ke kerangka kerja, dan kerangka kerja kemudian menempatkan permintaan di salah satu antrean I/O driver.
Dalam kasus ini, kerangka kerja dapat membatalkan permintaan I/O karena permintaan berada dalam antrean I/O. Namun, jika driver telah mendaftarkan fungsi panggilan balik EvtIoCanceledOnQueue untuk antrean I/O tempat permintaan berada, kerangka kerja memanggil fungsi panggilan balik, alih-alih membatalkan permintaan, ketika operasi I/O terkait sedang dibatalkan. Jika kerangka kerja memanggil fungsi panggilan balik EvtIoCanceledOnQueue driver, driver harus menyelesaikan permintaan.
Singkatnya, ketika operasi I/O dibatalkan, kerangka kerja selalu membatalkan semua permintaan I/O terkait yang tidak pernah dikirimkan ke driver. Jika driver menerima permintaan dan kemudian mengantrekannya kembali, kerangka kerja akan membatalkan permintaan (jika permintaan berada dalam antrean) kecuali driver menyediakan fungsi panggilan balik EvtIoCanceledOnQueue untuk antrean I/O.
Memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx
Driver dapat memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx untuk mendaftarkan fungsi panggilan balik EvtRequestCancel . Jika driver telah memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx, dan jika operasi I/O yang terkait dengan permintaan dibatalkan, kerangka kerja memanggil fungsi panggilan balik EvtRequestCancel driver sehingga driver dapat membatalkan permintaan I/O.
Driver harus memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx jika akan memiliki permintaan untuk waktu yang relatif lama. Misalnya, driver mungkin harus menunggu perangkat merespons, atau mungkin menunggu driver yang lebih rendah menyelesaikan serangkaian permintaan yang dibuat driver saat menerima satu permintaan.
Jika driver tidak memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx, atau jika driver memanggil WdfRequestUnmarkCancelable setelah memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx, driver tidak mengetahui pembatalan dan oleh karena itu menangani permintaan seperti biasanya.
Memanggil WdfRequestIsCanceled
Jika driver belum memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx untuk mendaftarkan fungsi panggilan balik EvtRequestCancel , ia dapat memanggil WdfRequestIsCanceled untuk menentukan apakah manajer I/O telah mencoba membatalkan permintaan I/O. Jika WdfRequestIsCanceled mengembalikan TRUE dan driver memiliki permintaan, driver harus membatalkan permintaan. Jika driver tidak memiliki permintaan, driver tidak boleh memanggil WdfRequestIsCanceled.
Driver yang belum disebut WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx mungkin memanggil WdfRequestIsCanceled dalam keadaan berikut:
Driver yang menunggu interupsi perangkat mungkin memanggil WdfRequestIsCanceled dari fungsi panggilan balik EvtInterruptDpc-nya .
Driver yang melakukan polling perangkatnya mungkin memanggil WdfRequestIsCanceled dari utas polling.
Driver yang memecah transaksi DMA menjadi beberapa transfer yang lebih kecil mungkin memanggil WdfRequestIsCanceled setelah setiap transfer selesai.
Driver yang menerima permintaan baca atau tulis besar yang dipisahkan menjadi beberapa permintaan yang lebih kecil mungkin memanggil WdfRequestIsCanceled setelah target I/O driver menyelesaikan setiap permintaan yang lebih kecil, jika driver belum memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx untuk permintaan yang diterima.
Membatalkan Permintaan
Membatalkan permintaan I/O mungkin melibatkan salah satu hal berikut:
Menghentikan operasi I/O yang sedang berlangsung.
Tidak meneruskan permintaan ke target I/O.
Memanggil WdfRequestCancelSentRequest untuk mencoba membatalkan permintaan yang sebelumnya telah dikirimkan driver ke target I/O.
Jika driver membatalkan permintaan I/O untuk objek permintaan yang diterima driver dari kerangka kerja, driver harus selalu menyelesaikan permintaan dengan memanggil WdfRequestComplete, WdfRequestCompleteWithInformation, atau WdfRequestCompleteWithPriorityBoost, dengan parameter Status STATUS_CANCELLED. (Jika driver bernama WdfRequestCreate untuk membuat objek permintaan, driver memanggil WdfObjectDelete alih-alih menyelesaikan permintaan.)
Menyinkronkan Pembatalan
Untuk informasi tentang menyinkronkan kode yang membatalkan permintaan I/O, lihat: