Aturan RemoveLockMnRemove (wdm)
Aturan RemoveLockMnRemove memverifikasi bahwa panggilan ke IoAcquireRemoveLock dan IoReleaseRemoveLockAndWait digunakan dengan benar saat memproses IRP_MJ_PNP dengan MinorFunction IRP_MN_REMOVE_DEVICE.
Aturan ini hanya berlaku untuk driver FDO dan FIDO.
Misalnya, pertimbangkan tumpukan driver PnP yang terdiri dari driver filter, FDO, dan PDO.
Manajer PnP mengirim penghapusan kueri melalui tumpukan. FDO diaktifkan untuk menganggur saat sistem berjalan. FDO memutuskan untuk mematikan dalam status kueri dihapus, sehingga meminta d0 IRP. Sebelum IRP d0 tiba, manajer PnP mengirimkan IRP penghapusan PnP dan IRP tersebut diproses oleh driver filter. Driver filter terlepas dari tumpukan dan membersihkan statusnya. D0 tiba di bagian atas tumpukan, tetapi driver filter tidak mengirimkannya ke tumpukan karena tidak memiliki konteks atau data untuk mengetahui ke mana harus mengirimnya lagi. FDO digantung menunggu IRP d0 tiba tetapi IRP itu tidak akan pernah.
Untuk menghindari kesalahan ini
Sebelum perangkat terlepas dari tumpukan perangkat, IoAcquireRemoveLock harus berhasil sebelum IRP diteruskan ke bawah tumpukan untuk jenis IRP berikut:
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
IoReleaseRemoveLockAndWait harus dipanggil sebelum memanggil IoDetachDevice atau IoDeleteDevice. (Ini memastikan bahwa semua kunci penghapusan dilepaskan di driver perangkat).
Model driver: WDM
Cara menguji
Pada waktu kompilasi |
---|
Jalankan Pemverifikasi Driver Statis dan tentukan aturan RemoveLockMnRemove . Gunakan langkah-langkah berikut untuk menjalankan analisis kode Anda:
Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat pada Driver. |
Berlaku untuk
IoAcquireRemoveLockIoReleaseRemoveLockIoReleaseRemoveLockAndWaitRemoveHeadList