Rutinitas DispatchCleanup

Rutinitas DispatchCleanup driver menangani runtime integrasi untuk kode fungsi I/O IRP_MJ_CLEANUP .

Driver dapat menggunakan rutinitas DispatchCleanup untuk melakukan operasi pembersihan apa pun yang diperlukan setelah semua handel ke objek file telah ditutup. Perhatikan bahwa DispatchCleanup dipanggil dalam konteks proses proses yang menutup handel akhir; proses ini mungkin berbeda dari proses yang awalnya membuka handel. (Biasanya perbedaan ini terjadi karena proses lain menggunakan rutinitas mode pengguna DuplicateHandle untuk menduplikasi handel proses.) Driver yang harus melakukan pembersihan dalam konteks proses asli dapat menggunakan rutinitas PsSetCreateProcessNotifyRoutine untuk mendaftarkan rutinitas panggilan balik untuk tujuan tersebut, tetapi perlu diingat bahwa panggilan balik tersebut adalah sumber daya sistem terbatas.

Secara umum, rutinitas DispatchCleanup harus memproses permintaan IRP_MJ_CLEANUP dengan melakukan hal berikut untuk setiap IRP yang saat ini berada dalam antrean perangkat (atau dalam antrean internal driver IRP), untuk objek perangkat target, dan dikaitkan dengan objek file:

  • Panggil IoSetCancelRoutine untuk mengatur Penunjuk rutin Batal ke NULL.

  • Batalkan setiap IRP yang saat ini berada dalam antrean untuk objek perangkat target, jika objek file yang ditentukan di lokasi tumpukan I/O driver dari IRP yang diantrekan cocok dengan objek file yang diterima di lokasi tumpukan I/O permintaan IRP_MJ_CLEANUP .

  • Panggil IoCompleteRequest untuk menyelesaikan IRP, dan kembalikan STATUS_SUCCESS.

Saat memproses permintaan IRP_MJ_CLEANUP , driver dapat menerima permintaan tambahan, seperti IRP_MJ_READ atau IRP_MJ_WRITE. Oleh karena itu, driver yang harus menangani sumber daya juga harus menyinkronkan eksekusi rutinitas DispatchCleanup dengan rutinitas pengiriman lainnya, seperti DispatchRead dan DispatchWrite.