強制 IRQL 検査

カーネル モード ドライバーは、高 IRQL またはスピン ロックを保持している間にページング可能なメモリにアクセスすることは禁止されていますが、ページが実際にワーキング セットからトリミングされず、ディスクにページアウトされていない場合は、このようなアクションに気付かない可能性があります。

強制 IRQL チェックが有効になっている場合、ドライバー検証ツールはシステム メモリの使用に極端な負荷を提供します。 検証対象のドライバーがスピン ロックを要求したり、 KeSynchronizeExecutionを呼び出したり、IRQL を DISPATCH_LEVEL 以上に上げたりするたびに、すべてのシステム ページング可能なプール、コード、およびデータ (ドライバーのページング可能なコードとデータを含む) がワーキング セットからトリミングされます。 ドライバーがこのメモリのいずれかにアクセスしようとすると、ドライバー検証ツールはバグ チェックを発行します。

Windows Vista 以降では、このオプションにより、ドライバー検証ツールは、特定の同期オブジェクトがページング可能なメモリに含まれている場合も検出します。 オペレーティング システム カーネルが管理者特権の IRQL でアクセスしているため、これらの同期オブジェクトをページングできません。 ドライバー検証ツールは、ページング可能な KTIMER、PRKMUTEX、PKSPIN_LOCK、PRKEVENT、PKSPIN_LOCK、PRK Standard Edition MAPHORE、PERESOURCE、および FAST_MUTEX 構造体を検出できます。

メモリ使用量に対するこの負荷は、検証用に選択されていないドライバーには直接影響しません。 検証用に選択されていないドライバーが IRQL を発生させると、トリミング アクションはトリガーされません。 ただし、検証中のドライバーが IRQL を発生させると、ドライバー検証ツールは検証されていないドライバーで使用できるページをトリミングします。 そのため、検証されていないドライバーによってコミットされたエラーは、このオプションがアクティブな場合にキャッチされることがあります。

IRQL の発生とスピン ロックの監視

検証中のドライバーによって行われた、IRQL の発生、スピン ロック、および KeSynchronizeExecution の呼び出しの数を監視できます。 ドライバー検証ツールがワーキング セットからページング可能なメモリをトリミングした回数も監視できます。 これらの統計情報は、ドライバー検証ツール マネージャー、Verifier.exeコマンド ライン、またはログ ファイルで表示できます。 詳細については、 グローバル カウンター の監視 を参照してください。

カーネル デバッガー拡張機能 !verifier を使用して、これらの統計を監視することもできます。 ドライバー検証ツール マネージャーと同様の情報が表示されます。 Windows XP 以降では、 !verifier 0x8 拡張機能には、検証中のドライバーによって行われた最近の IRQL 変更のログが表示されます。 デバッガー拡張機能の詳細については、「Windows デバッグ」を参照してください。

DISPATCH_LEVEL 以上で KeEnterCriticalRegion または KeLeaveCriticalRegion を呼び出す

KeEnterCriticalRegionKeLeaveCriticalRegion は、ドライバー コードの重要なシーケンスの実行を通常のカーネル非同期プロシージャ 呼び出し (APC) の配信と同期するために使用できる API です。 KEEnterCriticalRegion API と KeLeaveCriticalRegion API は、IRQL = DISPATCH_LEVEL 以上では呼び出すことができません。 DISPATCH_LEVEL 以上で KeEnterCriticalRegion または KeLeaveCriticalRegion を呼び出すと、システムがハングしたりメモリが破損したりする可能性があります。

Windows 7 以降、ドライバー検証ツールは、IRQL チェックの強制オプションが有効になっている場合、DISPATCH_LEVEL 以上でこれらの API への呼び出しを検出します。

このオプションのアクティブ化

Driver Verifier Manager または Verifier.exe コマンド ラインを使用して、1 つ以上のドライバーに対して強制 IRQL チェック機能をアクティブ化できます。 詳細については、 「ドライバー検証ツール オプションの選択」を参照してください 。

  • コマンドラインで

    コマンド ラインでは、[IRQL チェックの強制] オプションは ビット 1 (0x2)で表されます。 IRQL の強制チェックを有効にするには、0x2のフラグ値を使用するか、フラグ値に0x2を追加します。 次に例を示します。

    verifier /flags 0x2 /driver MyDriver.sys
    

    この機能は次回の起動後に有効になります。

    /volatile パラメーターをコマンドに追加することで、コンピューターを再起動せずに IRQL チェックの強制をアクティブ化および非アクティブ化することもできます。 次に例を示します。

    verifier /volatile /flags 0x2 /adddriver MyDriver.sys
    

    この設定はすぐに有効になりますが、コンピューターをシャットダウンまたは再起動すると失われます。 詳細については、「揮発性設定の使用」を参照してください。

    強制 IRQL チェック機能も標準設定に含まれています。 次に例を示します。

    verifier /standard /driver MyDriver.sys
    
  • ドライバー検証マネージャーの使用

    1. ドライバー検証マネージャーを起動します。 コマンド プロンプト ウィンドウに 「Verifier」 と入力します。
    2. 「カスタム設定の作成 (コード開発者用)」 を選択し、 「次へ」をクリックします。
    3. 全一覧から [個々の設定を選択] を選択します。
    4. IRQL チェックを強制するを選択 (チェック) します。

    強制 IRQL チェック機能も標準設定に含まれています。 この機能を使用するには、ドライバー検証ツール マネージャーで、 [標準設定の作成]をクリックします。