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:

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:

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: