Bagikan melalui


Aturan RemoveLockMnRemove2 (wdm)

Aturan RemoveLockMnRemove2 memverifikasi bahwa panggilan ke IoAcquireRemoveLock dan IoReleaseRemoveLockAndWait digunakan dengan benar saat memproses permintaan IRP_MN_REMOVE_DEVICE sebelum IRP diteruskan ke driver yang lebih rendah.

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 sedang berjalan. FDO memutuskan untuk mematikan dalam status kueri yang dihapus, sehingga meminta d0 IRP. Sebelum IRP d0 tiba, manajer PnP mengirimkan IRP penghapusan PnP dan bahwa IRP diproses oleh driver filter. Driver filter terlepas dari tumpukan dan membersihkan statusnya. D0 tiba di bagian atas tumpukan, tetapi driver filter tidak mengirimkannya ke bawah tumpukan karena tidak memiliki konteks atau data untuk mengetahui ke mana harus mengirimnya lagi. FDO digantung menunggu d0 IRP tiba tetapi IRP itu tidak akan pernah.

Untuk menghindari kesalahan ini

  1. Sebelum perangkat terlepas dari tumpukan perangkat, IoAcquireRemoveLock harus berhasil sebelum IRP diteruskan ke tumpukan untuk jenis IRP berikut:

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. 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 RemoveLockMnRemove2 .

Gunakan langkah-langkah berikut untuk menjalankan analisis kode Anda:
  1. Siapkan kode Anda (gunakan deklarasi jenis peran).
  2. Jalankan Pemverifikasi Driver Statis.
  3. Lihat dan analisis hasilnya.

Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat pada Driver.

Berlaku untuk

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver