RemoveLockMnSurpriseRemove ルール (wdm)

RemoveLockMnSurpriseRemove ルールは、MinorFunction IRP_MN_SUPRISE_REMOVAL で IRP_MJ_PNP を処理するときに、 IoAcquireRemoveLockIoReleaseRemoveLockAndWait の呼び出しが正しく使用されているかを検証します。 ドライバーは、スタックの下に IRP を転送する前に削除ロックを取得する必要があります。

この規則は、FDO ドライバーと FIDO ドライバーだけに適用されます。

たとえば、フィルター ドライバー、FDO、および PDO で構成される PnP ドライバー スタックを考えてみましょう。

PnP マネージャーは、スタックを介してクエリ削除を送信します。 FDO は、システムの実行中にアイドル状態になります。 FDO は、削除された状態のクエリで電源を切ることにしたので、d0 IRP を要求します。 d0 IRP が到着する前に、PnP マネージャーは PnP 削除 IRP を送信し、その IRP はフィルター ドライバーによって処理されます。 フィルター ドライバーはスタックからデタッチされ、状態がクリーンされます。 d0 はスタックの一番上に到着しますが、フィルター ドライバーはスタックを送信しません。これは、送信する場所を知るコンテキストやデータがないためです。 FDO は d0 IRP が到着するのを待ってハングしていますが、その IRP は決してありません。

このエラーを回避するには

  1. デバイスがデバイス スタックからデタッチされる前に、 次の種類の IRP のスタックに IRP が転送される前に、IoAcquireRemoveLock が成功する必要があります。

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. IoReleaseRemoveLockAndWait は、 IoDetachDevice または IoDeleteDevice を呼び出す前に呼び出す必要があります。 (これにより、すべての削除ロックがデバイス ドライバーで解放されます)。

ドライバーモデル: WDM

テスト方法

コンパイル時

静的ドライバー検証ツール を実行し、 RemoveLockMnSurpriseRemove 規則を指定します。

コードの分析を実行するには、次の手順に従います。
  1. コードを準備します (ロール型宣言を使用します)。
  2. 静的ドライバー検証ツールを実行します。
  3. 結果を表示および分析します。

詳細については、 「静的ドライバー検証ツールを使用してドライバー の欠陥を見つける」を参照してください。

適用対象

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList