Bagikan melalui


Rutinitas Pembersihan Pengiriman

Rutinitas DispatchCleanup driver menangani IRPs 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 dari proses yang menutup handle akhir; proses ini mungkin berbeda dari proses yang awalnya membuka handle. (Biasanya perbedaan ini terjadi karena proses lain menggunakan rutinitas mode pengguna DuplicateHandle untuk menduplikasi handle proses.) Driver yang harus melakukan pembersihan dalam konteks proses yang asli dapat menggunakan rutinitas PsSetCreateProcessNotifyRoutine untuk mendaftarkan rutinitas panggilan balik untuk tujuan tersebut, namun perlu diingat bahwa rutinitas panggilan balik tersebut merupakan sumber daya sistem yang 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 membatalkan alokasi sumber daya juga harus menyinkronkan eksekusi rutinitas DispatchCleanup dengan rutinitas pengiriman lainnya, seperti DispatchRead dan DispatchWrite.