Share via


I/O の検証

ドライバー検証ツールには、次の 2 つのレベルの I/O 検証があります。

  • レベル 1 の I/O 検証 は、I/O 検証 が選択されるたびに常にアクティブになります。

  • レベル 2 の I/O 検証 は、Windows XP 以降で I/O 検証が選択されるたびに常にアクティブになります。

Windows 7 以降のバージョンの Windows オペレーティング システムでの拡張 I/O 検証も参照してください。I/O 検証を選択すると、拡張 I/O 検証が自動的にアクティブ化されます。 別のオプションとして選択することはできません。

レベル 1 の I/O 検証

レベル 1 の I/O 検証が有効になっている場合、 IoAllocateIrp を介して取得されたすべての IRP が特別なプールから割り当てられ、その使用が追跡されます。

さらに、ドライバー検証ツールは、次のような無効な I/O 呼び出しをチェックします。

  • 型が IO_TYPE_IRP ではない IRP の解放を試みます

  • 無効なデバイス オブジェクトを IoCallDriver に渡す

  • 無効な状態を含む、またはキャンセル ルーチンが設定されている IoCompleteRequest への IRP の渡し

  • ドライバー ディスパッチ ルーチンの呼び出し全体で IRQL に対する変更

  • スレッドに関連付けられているメイン IRP の解放を試みます。

  • 初期化されたタイマーが既に含まれている IoInitializeTimer にデバイス オブジェクトを渡します。

  • 無効なバッファー を IoBuildAsynchronousFsdRequest または IoBuildDeviceIoControlRequest に渡す

  • この I/O 状態ブロックがスタックに割り当てられているときに、I/O 状態ブロックを IRP に渡します。

  • イベント オブジェクトを IRP に渡します。このイベント オブジェクトが、アンワインドされたスタックに割り当てられている場合

特殊な IRP プールはサイズが制限されているため、I/O 検証は一度に 1 つのドライバーでのみ使用される場合に最も効果的です。

I/O 検証レベル 1 のエラーにより、バグ チェック 0xC9 が発行されます。 このバグ チェックの最初のパラメーターは、どのような違反が発生したかを示します。 完全なパラメーターの一覧については、 バグ チェック 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) を参照してください。

レベル 2 の I/O 検証

I/O 検証レベル 2 のエラーは、ブルー スクリーン、クラッシュ ダンプ ファイル、カーネル デバッガーなど、さまざまな方法で表示されます。

ブルー スクリーンでは、これらのエラーは、メッセージ IO システム検証エラー と文字列 WDM DRIVER ERRORXXXによって示されます。ここで、 XXX は I/O エラー コードです。

クラッシュ ダンプ ファイルでは、これらのエラーの大部分は、メッセージ BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION)と I/O エラー コードによって示されます。 この場合、バグ チェック 0xC9の最初のパラメーターとして I/O エラー コードが表示されます。 reメインder は、 バグ チェック 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) というメッセージとドライバー検証ツールのエラー コードによって示されます。 この場合、バグ チェック 0xC4の最初のパラメーターとしてドライバー検証ツールのエラー コードが表示されます。

カーネル デバッガー (KD または WinDbg) では、これらのエラーは、メッセージ WDM DRIVER ERROR と説明テキスト文字列によって示されます。 カーネル デバッガーがアクティブな場合、レベル 2 のエラーを無視してシステム操作を再開できます。 (これは、他のバグ チェックでは不可能です)。

ブルー スクリーン、クラッシュ ダンプ ファイル、カーネル デバッガーにも追加情報が表示されます。 大部分の I/O 検証レベル 2 エラー メッセージの詳細については、「バグ チェック 0xC9」を参照してください。 再メインについては、 バグ チェックの0xC4を参照してください。

Windows Vista 以降では、次のドライバー エラーの I/O 検証オプションがチェック。

  • ユーザー モード アプリケーションで発生した IRP の完了と取り消しに時間がかかりすぎる。

  • まだ取得されていない削除ロックを解放する。

  • 対応する IoAcquireRemoveLock 呼び出しで使用されるタグ パラメーターとは異なるタグ パラメーターを使用して IoReleaseRemoveLock または IoReleaseRemoveLockAndWait を呼び出します。

  • 割り込みを無効にして IoCallDriver を呼び出す。

  • DISPATCH_LEVELより大きい IRQL での IoCallDriver の呼び出し。

  • 割り込みを無効にしたドライバー ディスパッチ ルーチンから戻ります。

  • 変更された IRQL を使用してドライバー ディスパッチ ルーチンから戻る。

  • APC を無効にしたドライバー ディスパッチ ルーチンから戻ります。 この場合、ドライバーが KeLeaveCriticalRegion よりも多くの時間 KeLeaveCriticalRegion を呼び出している可能性があります。これは、 バグ チェック 0x20 (KERNEL_APC_PENDING_DURING_EXIT) と バグ チェック 0x1 (APC_INDEX_MISMATCH) の主な原因です。

Windows 7 以降では、I/O 検証オプションは次のドライバー エラーをチェックします。

  • ExFreePool を呼び出して IRP の解放を試みます。 Irp は、 IoFreeIrp を使用して解放する必要があります。

さらに、このオプションを使用して、別の一般的なドライバーのバグ (削除ロックの再初期化) を検出できます。 削除ロックデータ構造は、デバイス拡張機能内に割り当てる必要があります。 これにより、I/O マネージャーは、デバイス オブジェクトが削除された場合にのみ、IO_REMOVE_LOCK構造体を保持するメモリを解放します。 ドライバーが次の 3 つの手順を実行する場合は、手順 2 の後、アプリケーションまたはドライバーが引き続き Device1 への参照を保持している可能性があります。

  • Device1 に対応するIO_REMOVE_LOCK構造体を割り当てますが、Device1 の拡張機能の外部で割り当てを行います。
  • Device1 が削除されるときに IoReleaseRemoveLockAndWait を呼び出します。
  • 同じロックに対して IoInitializeRemoveLock を呼び出して、Device2 の削除ロックとして再利用します。

手順 2 の後も、アプリケーションまたはドライバーが Device1 への参照を保持している可能性があります。 このデバイスが削除された場合でも、アプリケーションまたはドライバーは引き続き Device1 に要求を送信できます。 そのため、I/O マネージャーが Device1 を削除するまで、新しい削除ロックと同じメモリを再利用しても安全ではありません。 別のスレッドが取得しようとしている間に同じロックを再初期化すると、ロックが破損し、ドライバーとシステム全体に予期しない結果が生じる可能性があります。

Windows 7 以降のバージョンの Windows オペレーティング システムでは、I/O 検証を選択すると、 拡張 I/O 検証 が自動的にアクティブ化されます。

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

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

  • コマンドラインで。

    コマンド ラインでは、I/O 検証オプションは ビット 4 (0x10)で表されます。 拡張 I/O 検証をアクティブにするには、0x10のフラグ値を使用するか、フラグ値に0x10を追加します。 次に例を示します。

    verifier /flags 0x10 /driver MyDriver.sys
    

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

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

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

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

    I/O 検証機能は標準設定にも含まれています。 次に例を示します。

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

    1. 「カスタム設定の作成 (コード開発者用)」 を選択し、 「次へ」をクリックします。
    2. 全一覧から [個々の設定を選択] を選択します。
    3. I/O 検証を選択 (チェック)します。

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