Bagikan melalui


Aturan RemoveLockMnSurpriseRemove (wdm)

Aturan RemoveLockMnSurpriseRemove memverifikasi bahwa panggilan ke IoAcquireRemoveLock dan IoReleaseRemoveLockAndWait digunakan dengan benar saat memproses IRP_MJ_PNP dengan MinorFunction IRP_MN_SUPRISE_REMOVAL. Driver harus memperoleh kunci hapus sebelum meneruskan IRP ke bawah tumpukan.

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

  1. 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
  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 RemoveLockMnSurpriseRemove .

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

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList