Menyinkronkan Pembatalan dalam Rutinitas Driver yang Memproses RUNPS

Setiap rutinitas driver yang menghapus antrean atau dipanggil dengan IRP yang diadakan dalam keadaan dapat dibatalkan, termasuk rutinitas StartIo driver, harus melakukan hal berikut:

  1. Hubungi IoAcquireCancelSpinLock.

  2. Periksa untuk memastikan bahwa Irp sama dengan DeviceObject-CurrentIrp>. Jika tidak, panggil IoReleaseCancelSpinLock dan kembalikan kontrol.

    Jika keduanya tidak sama, CurrentIrp mungkin telah dibatalkan antara waktu IoStartPacket merilis kunci spin pembatalan dan rutinitas ini memperolehnya.

  3. Panggil IoSetCancelRoutine dengan pointer CancelRoutineNULL untuk menghapus IRP dari status yang dapat dibatalkan.

  4. Periksa bidang Irp-Cancel> untuk menentukan apakah akan membatalkan IRP atau mulai memproses permintaan I/O.

    Jika Irp-Cancel> diatur ke TRUE, lakukan hal berikut:

    • Panggil IoReleaseCancelSpinLock.

    • Atur Irp-IoStatus.Status> ke STATUS_CANCELLED.

    • Atur Irp-IoStatus.Information> ke 0.

    • Panggil IoStartNextPacket (dalam rutinitas StartIo ) untuk memulai paket berikutnya.

    • Panggil IoCompleteRequest dengan peningkatan prioritas IO_NO_INCREMENT untuk menyelesaikan IRP.

    Jika Irp-Cancel> diatur ke FALSE, panggil IoReleaseCancelSpinLock dan mulai pemrosesan permintaan I/O yang diminta atau teruskan IRP ke driver bawah berikutnya, sebagaimana mewajibkan.

Driver yang mengelola antrean runtime integrasi mereka sendiri, daripada menggunakan antrean perangkat yang disediakan manajer I/O, tidak perlu memperoleh kunci putar pembatalan saat memanggil IoSetCancelRoutine. Namun, driver ini harus memeriksa penunjuk rutin Batal yang dikembalikan IoSetCancelRoutine untuk menentukan apakah rutinitas pembatalan telah dimulai.

Dalam setiap driver yang menangani IRP yang dapat dibatalkan, setiap rutinitas driver yang memproses IRP sebelum perangkat yang mendasar telah diprogram untuk operasi I/O yang diminta harus memeriksa status yang dapat dibatalkan dari semua RUNP yang masuk. Secara khusus, driver perangkat tingkat tertinggi dengan rutinitas StartIo dan ControllerControl harus memproses IRP masuk di kedua rutinitas driver ini seperti yang sudah dijelaskan.