Bagikan melalui


Pisahkan Rutin DispatchCreate dan DispatchClose

Rutinitas Dispat driver untuk permintaan IRP_MJ_CREATE dan IRP_MJ_CLOSE mungkin hanya menyelesaikan IRP input dengan STATUS_SUCCESS. Untuk informasi selengkapnya, lihat Menyelesaikan IRPs.

Rutinitas Dispatch dari driver yang lain untuk permintaan IRP_MJ_CREATE dan IRP_MJ_CLOSE mungkin melakukan lebih banyak tugas, tergantung pada driver atau perangkat yang mendasari. Pertimbangkan skenario berikut:

  • Saat menerima permintaan buat, driver kelas mungkin menginisialisasi antrean internal dan mengirim permintaan IRP_MJ_INTERNAL_DEVICE_CONTROL ke driver port yang sesuai yang meminta informasi konfigurasi perangkat atau akses eksklusif ke port pengontrol.

  • Tanda terima IRP_MJ_CLOSE menunjukkan bahwa referensi terakhir ke objek file yang terkait dengan objek perangkat target telah dihapus. Ini menyiratkan bahwa semua handle ke objek file telah ditutup dan semua permintaan I/O yang masih tertunda telah selesai atau dibatalkan.

  • Ketika menerima permintaan pembuatan, driver dari perangkat yang jarang digunakan mungkin memanggil MmLockPagableCodeSection untuk mempertahankan beberapa rutinitas driver di memori yang memproses permintaan IRP_MJ_XXX lainnya. Saat menerima permintaan penutupan timbal balik, driver mungkin memanggil MmUnlockPagableImageSection untuk menghemat memori sistem dengan memindahkan bagian gambar yang dapat dipindahkan ke halaman ketika semua handle objek file untuk objek perangkat driver tersebut ditutup.

Beberapa driver menangani permintaan IRP_MJ_CLOSE hanya untuk simetri karena, setelah objek perangkat mereka dibuka oleh subsistem yang dilindungi atau driver tingkat yang lebih tinggi, objek perangkat driver tingkat bawah tidak ditutup sampai sistem itu sendiri dimatikan. Misalnya, driver keyboard dan mouse menyiapkan objek perangkat yang mewakili perangkat fisik yang harus berfungsi saat sistem berjalan, sehingga driver ini mungkin memiliki rutinitas DispatchClose minimal untuk simetri, atau mungkin telah menggabungkan rutinitas DispatchCreateClose .

Jika perangkat yang dikontrol oleh driver tingkat bawah harus tersedia agar sistem terus berjalan, rutinitas DispatchClose driver umumnya tidak akan dipanggil. Misalnya, beberapa driver disk sistem tidak memiliki rutinitas DispatchClose , tetapi driver ini biasanya memiliki rutinitas DispatchFlushBuffers dan DispatchShutdown untuk menyelesaikan operasi I/O file yang luar biasa sebelum sistem dimatikan.

Meskipun Anda dapat menerapkan rutinitas DRIVER_DISPATCH dan DispatchClose terpisah, driver terkadang memiliki satu rutinitas DispatchCreateClose untuk menangani permintaan buat dan tutup.