RemoveLockMnRemove2 ルール (wdm)
RemoveLockMnRemove2 ルールは、IRP が下位ドライバーに転送される前に、IRP_MN_REMOVE_DEVICE 要求を処理するときに、 IoAcquireRemoveLock と IoReleaseRemoveLockAndWait への呼び出しが正しく使用されているかを検証します。
この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。
たとえば、フィルター ドライバー、FDO、および PDO で構成される PnP ドライバー スタックを考えてみましょう。
PnP マネージャーは、スタックを介してクエリ削除を送信します。 FDO は、システムの実行中にアイドル状態になります。 FDO は、削除された状態のクエリで電源を切ることにしたので、d0 IRP を要求します。 d0 IRP が到着する前に、PnP マネージャーは PnP 削除 IRP を送信し、その IRP はフィルター ドライバーによって処理されます。 フィルター ドライバーはスタックからデタッチされ、状態がクリーンされます。 d0 はスタックの一番上に到着しますが、フィルター ドライバーはスタックを送信しません。これは、送信する場所を知るコンテキストやデータがないためです。 FDO は d0 IRP が到着するのを待ってハングしていますが、その IRP は決してありません。
このエラーを回避するには
デバイスがデバイス スタックからデタッチされる前に、 次の種類の IRP のスタックに IRP が転送される前に、IoAcquireRemoveLock が成功する必要があります。
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
IoReleaseRemoveLockAndWait は、 IoDetachDevice または IoDeleteDevice を呼び出す前に呼び出す必要があります。 (これにより、すべての削除ロックがデバイス ドライバーで解放されます)。
ドライバーモデル: WDM
テスト方法
コンパイル時 |
---|
静的ドライバー検証 を実行し、 RemoveLockMnRemove2 規則を指定します。 コードの分析を実行するには、次の手順に従います。詳細については、 「静的ドライバー検証ツールを使用してドライバー の欠陥を見つける」を参照してください。 |
適用対象
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver