次の方法で共有


IrqlZwPassive ルール (wdm)

IrqlZwPassive ルールでは、ドライバーが IRQL = PASSIVE_LEVEL で実行されている場合にのみ、 ZwClose を呼び出す必要があります。

ドライバーモデル: WDM

このルールで見つかったバグ チェック: バグ チェック 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x 0x2001F)

規則に違反するコード例を次に示します。

NTSTATUS 
DriverCloseResources (
    _In_ PDRIVER_CONTEXT Context
    )
{
    …

    NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);

    //
    // ExAcquireFastMutex sets the IRQL to APC_LEVEL, and the caller continues 
    // to run at APC_LEVEL after ExAcquireFastMutex returns.
    //
  
    ExAcquireFastMutex(&Context->FastMutex);
    
    ....
    
    if (NULL != Context->Handle) {

            //
            // RULE VIOLATION! - ZwClose can be called only at PASSIVE_LEVEL 
            //
            
            ZwClose(Context->Handle);      
            Context->Handle = NULL;
    }
    
    ....

    //
    // N.B. ExReleaseFastMutex restores the original IRQL.
    //
     
    ExReleaseFastMutex(&Context->FastMutex);
    
    ....
}

テスト方法

コンパイル時

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

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

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

実行時

ドライバー検証ツール を実行し、 DDI コンプライアンス チェック オプションを選択します。

適用対象

ZwCloseZwCreateKeyZwDeleteKeyZwEnumerateKeyZwEnumerateValueKeyZwFlushKeyZwOpenKeyZwQueryKeyZwQueryValueKeyZwSetValueKey