Menggunakan Hapus Kunci

Rutinitas hapus kunci menyediakan cara untuk melacak jumlah operasi I/O yang luar biasa pada perangkat, dan untuk menentukan kapan aman untuk melepaskan dan menghapus objek perangkat driver. Sistem ini menyediakan rutinitas ini kepada penulis driver sebagai alternatif untuk menerapkan mekanisme pelacakan mereka sendiri.

Driver dapat menggunakan mekanisme ini untuk dua tujuan:

  1. Untuk memastikan bahwa rutinitas DispatchPnP driver tidak akan menyelesaikan permintaan IRP_MN_REMOVE_DEVICE saat kunci ditahan (misalnya, sementara rutinitas driver lain mengakses perangkat).

  2. Untuk menghitung jumlah alasan driver tidak boleh menghapus objek perangkatnya, dan untuk mengatur peristiwa ketika jumlah tersebut masuk ke nol.

Untuk menginisialisasi kunci hapus, driver harus mengalokasikan struktur IO_REMOVE_LOCK dalam ekstensi perangkatnya lalu memanggil IoInitializeRemoveLock. Driver biasanya memanggil IoInitializeRemoveLock dalam rutinitas AddDevice-nya , ketika driver menginisialisasi ekstensi perangkat lainnya untuk objek perangkat.

Driver Anda harus memanggil IoAcquireRemoveLock setiap kali memulai operasi I/O. Driver harus memanggil IoReleaseRemoveLock setiap kali menyelesaikan operasi I/O. Driver dapat memperoleh kunci lebih dari sekali. Rutinitas hapus kunci mempertahankan hitungan akuisisi kunci yang luar biasa. Setiap panggilan ke IoAcquireRemoveLock menambah jumlah, dan IoReleaseRemoveLock mengurangi hitungan.

Driver Anda juga harus memanggil IoAcquireRemoveLock ketika mengeluarkan referensi ke kodenya (untuk timer, DPC, panggilan balik, dan sebagainya). Driver kemudian harus memanggil IoReleaseRemoveLock ketika peristiwa telah kembali.

Dalam kode pengirimannya untuk IRP_MN_REMOVE_DEVICE, driver harus memperoleh kunci sekali lagi dan kemudian memanggil IoReleaseRemoveLockAndWait. Rutinitas ini tidak kembali sampai semua akuisisi kunci yang luar biasa telah dirilis. Untuk memungkinkan operasi I/O yang diantrekan selesai, setiap driver harus memanggil IoReleaseRemoveLockAndWaitsetelah meneruskan permintaan IRP_MN_REMOVE_DEVICE ke driver yang lebih rendah berikutnya, dan sebelum merilis memori, memanggil IoDetachDevice, atau memanggil IoDeleteDevice. Setelah IoReleaseRemoveLockAndWait dipanggil untuk kunci hapus tertentu, semua panggilan berikutnya ke IoAcquireRemoveLock untuk kunci penghapusan yang sama akan gagal.

Setelah IoReleaseRemoveLockAndWait kembali, driver harus mempertimbangkan perangkat berada dalam keadaan di mana perangkat siap untuk dihapus dan tidak dapat melakukan operasi I/O. Oleh karena itu, driver tidak boleh memanggil IoInitializeRemoveLock untuk menginisialisasi ulang kunci hapus. Pelanggaran aturan ini saat driver sedang diverifikasi oleh Driver Verifier akan mengakibatkan pemeriksaan bug.

Karena driver menyimpan struktur IO_REMOVE_LOCK dalam ekstensi perangkat objek perangkat, kunci hapus dihapus ketika driver menghapus ekstensi perangkat saat memproses permintaan IRP_MN_REMOVE_DEVICE .