Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Manajer I/O memanggil rutinitas Batal yang disediakan driver dengan IRP input untuk dibatalkan dan pointer DeviceObject yang mewakili perangkat target untuk permintaan I/O.
IRP bisa menjadi salah satu yang rutinitas DispatchReadWrite driver telah mengantre sama seperti aplikasi Win32 saat ini sedang ditutup oleh pengguna. IRP juga bisa menjadi salah satu driver tingkat yang lebih tinggi yang dibatalkan secara eksplisit, tergantung pada sifat perangkat yang mendasar.
Ketika rutinitas Batal dipanggil, IRP input mungkin sudah menjadi CurrentIrp di objek perangkat target atau mungkin sudah berada dalam antrean perangkat yang terkait dengan objek perangkat target jika driver memiliki rutinitas StartIo . Jika driver tidak memiliki rutinitas StartIo , IRP mungkin berada dalam antrean internal IRP yang dikelola driver ketika rutinitas Batal dipanggil . Bagaimanapun, sebelum manajer I/O memanggil rutinitas Batal untuk IRP masuk, manajer I/O menetapkan anggota Batal dalam IRP ini ke TRUE dan menetapkan anggota CancelRoutine di IRP ke NULL.
Rutinitas Batal untuk IRP master yang memiliki IRP terkait bertanggung jawab untuk memanggil IoCancelIrp untuk membatalkan RUNP terkait.
Semua rutinitas Batal harus mengikuti panduan berikut:
Panggil IoReleaseCancelSpinLock untuk melepaskan kunci putar pembatalan sistem.
Atur anggota Status blok status I/O ke STATUS_CANCELLED, dan atur anggota Informasi ke nol.
Selesaikan IRP yang ditentukan dengan memanggil IoCompleteRequest.
Karena rutinitas Batal selalu dipanggil dengan sistem membatalkan kunci putar yang ditahan, rutinitas ini tidak boleh memanggil IoAcquireCancelSpinLock kecuali memanggil IoReleaseCancelSpinLock terlebih dahulu.
Rutinitas Batal tidak dapat menahan sistem membatalkan kunci putar ketika mengembalikan kontrol. Artinya, setiap rutinitas Batal harus memanggil IoReleaseCancelSpinLock setidaknya sekali sebelum mengembalikan kontrol.
Jika memanggil IoAcquireCancelSpinLock, rutinitas Batal harus melakukan panggilan timbal balik ke IoReleaseCancelSpinLock secepat mungkin.
Jangan pernah memanggil IoCompleteRequest dengan IRP sambil memegang kunci putaran. Mencoba menyelesaikan IRP sambil memegang kunci putar dapat menyebabkan kebuntuan.