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 belum diproses 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:

  • I/O yang tidak terkirim meminta agar kerangka kerja ditempatkan di antrean I/O default driver.

  • I/O yang tidak terkirim meminta agar kerangka kerja telah diteruskan ke antrean lain karena pengemudi bernama WdfDeviceConfigureRequestDispatching.

Karena kerangka kerja membatalkan permintaan ini, itu tidak mengirimkannya ke pengemudi.

Setelah kerangka kerja mengirimkan permintaan I /O ke pengemudi, pengemudi memiliki permintaan dan kerangka kerja tidak dapat membatalkannya. Pada titik ini, hanya pengemudi yang dapat membatalkan permintaan I/O, tetapi kerangka kerja harus memberi tahu pengemudi bahwa permintaan harus dibatalkan. Driver menerima pemberitahuan ini dengan menyediakan fungsi callback EvtRequestCancel .

Terkadang pengemudi menerima permintaan I/O dari antrean I/O tetapi, alih-alih memproses permintaan, pengemudi mewariskan kembali permintaan tersebut ke antrean I/O yang sama atau lainnya untuk diproses nanti. Contoh situasi ini meliputi yang berikut:

Dalam kasus ini, kerangka kerja dapat membatalkan permintaan I/O karena permintaan berada dalam antrean I/O. Namun, jika driver telah mendaftarkan fungsi callback EvtIoCanceledOnQueue untuk antrean I/O tempat permintaan berada, kerangka kerja memanggil fungsi callback, alih-alih membatalkan permintaan, saat operasi I/O terkait dibatalkan. Jika kerangka kerja memanggil fungsi callback EvtIoCanceledOnQueue pengemudi, pengemudi harus menyelesaikan permintaan.

Singkatnya, ketika operasi I/O dibatalkan, kerangka kerja selalu membatalkan semua permintaan I/O terkait yang tidak pernah dikirim ke pengemudi. Jika pengemudi menerima permintaan dan kemudian menyarihkannya kembali, kerangka kerja akan membatalkan permintaan (jika permintaan ada dalam antrian) kecuali pengemudi menyediakan fungsi callback EvtIoCanceledOnQueue untuk antrean I/O.

Memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx

Pengemudi dapat menghubungi WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx untuk mendaftarkan fungsi callback EvtRequestCancel . Jika pengemudi telah memanggil WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx, dan jika operasi I/O yang terkait dengan permintaan dibatalkan, kerangka kerja memanggil fungsi callback EvtRequestCancel pengemudi sehingga pengemudi dapat membatalkan permintaan I/O.

Pengemudi harus menghubungi WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx jika akan memiliki permintaan untuk waktu yang relatif lama. Misalnya, pengemudi mungkin harus menunggu perangkat merespons, atau mungkin menunggu driver yang lebih rendah untuk menyelesaikan serangkaian permintaan yang dibuat pengemudi saat menerima satu permintaan.

Jika pengemudi tidak menghubungi WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx, atau jika pengemudi menelepon WdfRequestUnmarkCancelable setelah menelepon WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx, pengemudi tidak mengetahui pembatalan tersebut dan karena itu menangani permintaan seperti biasanya.

Menelepon WdfRequestIsCanceled

Jika pengemudi belum menelepon WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx untuk mendaftarkan fungsi callback EvtRequestCancel , ia dapat menghubungi WdfRequestIsCanceled untuk menentukan apakah manajer I/O telah berusaha membatalkan permintaan I/O. Jika WdfRequestIsCanceled mengembalikan TRUE dan pengemudi memiliki permintaan, pengemudi harus membatalkan permintaan. Jika pengemudi tidak memiliki permintaan, seharusnya tidak memanggil WdfRequestIsCanceled.

Pengemudi yang belum menelepon WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx mungkin menghubungi 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 diajukan pengemudi ke target I /O.

Jika pengemudi membatalkan permintaan I/O untuk objek permintaan yang diterima pengemudi dari kerangka kerja, pengemudi harus selalu menyelesaikan permintaan dengan memanggil WdfRequestComplete, WdfRequestCompleteWithInformation, atau WdfRequestCompleteWithPriorityBoost, dengan parameter Status STATUS_CANCELLED. (Jika pengemudi memanggil WdfRequestCreate untuk membuat objek permintaan, pengemudi memanggil WdfObjectDelete alih-alih menyelesaikan permintaan.)

Sinkronisasi Pembatalan

Untuk informasi tentang sinkronisasi kode yang membatalkan permintaan I/O, lihat: