ドライバー検証ツールには、次の 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 エラー コードが表示されます。 残りの部分は、 バグ チェック 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 を呼び出す。
IRQL での IoCallDriver の 呼び出しがDISPATCH_LEVELより大きい。
割り込みを無効にしたドライバー ディスパッチ ルーチンから戻ります。
変更された IRQL を使用してドライバー ディスパッチ ルーチンから戻る。
APCs が無効になっているドライバー ディスパッチ ルーチンから戻る。 この場合、ドライバーが 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 検証 が自動的にアクティブ化されます。
このオプションのアクティブ化
ドライバー検証ツール マネージャーまたは 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ドライバー検証ツール マネージャーの使用
- (コード開発者向けの) [カスタム設定の作成] を選択し、[次へ] をクリックします。
- 完全な一覧から [個々の設定を選択] を選択します。
- I/O 検証を選択 (チェック) します。
I/O 検証機能も標準設定に含まれています。 この機能を使用するには、ドライバー検証ツール マネージャーで、[ 標準設定の作成] をクリックします。