ドライバー検証ツールの SCSI 検証機能は、SCSI ミニポート ドライバーとポート ドライバー間の相互作用を監視します。 ミニポート ドライバーがルーチンを誤用する場合、ポート ドライバーからの要求に誤って応答する場合、または要求に応答するのに過剰な時間がかかる場合は、バグ チェックが発行されます。
このドライバー検証ツール オプションは、Windows XP 以降でのみ使用できます。
SCSI 検証によって検出された違反
SCSI 検証オプションは、SCSI ルーチンのいくつかの誤用を検出できます。 これらのチェックの特定を個別に無効にすることもできます。
SCSI ミニポート ドライバーが次のいずれかの違反をコミットすると、ドライバー検証ツールはバグ チェック 0xF1を発行します。
ミニポート ドライバーは、 ScsiPortInitialize に無効な引数を渡します。
ミニポート ドライバーは ScsiPortStallExecution を 呼び出し、0.1 秒より長い遅延を指定し、プロセッサが長時間停止します。
ポート ドライバーはミニポート ドライバー ルーチンを呼び出し、ミニポート ドライバーの実行に 0.5 秒以上かかります。 ( FindAdapter ルーチンは除外され、 HwInitialize ルーチンは 5 秒で許可されます)。
ミニポート ドライバーは、要求を複数回完了します。
ミニポート ドライバーは、SRB の状態が無効なときにルーチンを完了します。
ミニポート ドライバーは、NextLuRequest を要求する ScsiPortNotification を呼び出しますが、タグなし要求はまだアクティブです。
ミニポート ドライバーは、 ScsiPortGetPhysicalAddress に無効な仮想アドレスを渡します。 (これは通常、指定されたアドレスが共通バッファー領域にマップされていないことを意味します)。
バス リセットの保留期間は終了しますが、ミニポート ドライバーには未処理の要求が残っています。
バグ チェック パラメーターの完全な一覧については、バグ チェック 0xF1 (SCSI_VERIFIER_DETECTED_VIOLATION) を参照してください。
これらの違反に加えて、SCSI 検証では、ミニポート ドライバーのメモリ アクセスが不適切な使用を監視します。 ミニポート ドライバーによって行われた 2 つの一般的なメモリ違反は、要求が完了した後、SRB 拡張機能にアクセスし、ミニポート ドライバーが MapBuffers を指定していない場合に SRB の DataBuffer にアクセスします。
この種のメモリ違反では、通常、 バグ チェック 0xD1 (DRIVER_IRQL_NOT_LESS_OR_EQUAL) が発行されます。
このオプションのアクティブ化
SCSI 検証オプションをアクティブ化する手順は、他のドライバー検証ツール オプションをアクティブ化する手順とは異なります。
SCSI 検証をアクティブにするには
ドライバー検証ツール マネージャーまたは Verifier.exe コマンド ラインを使用して、ミニポート ドライバーの検証を開始します。 SCSI 検証はオプションとして使用できないため、少なくとも 1 つの他のドライバー検証ツール オプションを選択する必要があります。 詳細については、「 ドライバー検証ツールのオプション の選択」および 「検証するドライバーの選択 」を参照してください。
regedit.exeを使用してレジストリを開きます。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ScsiPort キーに、Verifier という名前のサブキーを追加します。 そのキー内に、 VerifyLevel という名前のREG_DWORDエントリを追加します。 このエントリに割り当てられた値によって、アクティブになる SCSI 検証テストが決まります。 0x1値は、最大検証を提供します。
コンピューターを再起動します。
VerifyLevel 値が存在しないか、0xFFFFFFFFと等しい場合、SCSI 検証は無効になります。
VerifyLevel 値の個々のビットを使用して、実行するテストを正確に制御できます。 ビット 0 (0x1) を使用すると、特定のテストが可能になります。ビット 28、29、30、および 31 では、特定のテストが無効になります。 したがって、0x00000001値を使用して最大検証を取得できます。
各ビットの効果は次のとおりです。
| ビット | 価値 | 影響 |
|---|---|---|
0 |
0x1 |
ドライバー検証ツールは、ミニポート ドライバーのメモリ アクセスを監視し、メモリ バッファーの不適切な使用を確認します。 |
28 |
0x10000000 |
HwAdapterControl ルーチンの完了に 0.5 秒以上かかる場合、ドライバー検証ツールはバグ チェックを発行しません。 |
二十九 |
0x20000000 |
リセットの保留期間が終了しても、論理ユニットに未処理の要求がある場合、ドライバー検証ツールはバグ チェックを発行しません。 |
30 |
0x40000000 |
タグ付けされていない要求がまだアクティブである間、ミニポート ドライバーが NextLuRequest で ScsiPortNotification を呼び出すと、ドライバー検証ツールはバグ チェックを発行しません。 |
31 |
0x80000000 |
HwInitialize ルーチンの完了に 5 秒以上かかる場合、ドライバー検証ツールはバグ チェックを発行しません。 |
ほとんどの場合、推奨される設定は0xD0000001です。 これにより、HwAdapterControl の時間制限、HwInitialize の時間制限、論理ユニットへの複数の要求の禁止を除く、すべての SCSI 検証ツール テストが有効になります。 これらの 3 つのテストは、多くの場合、厳しすぎます。
カーネル デバッガーがアタッチされている場合は、ブート サイクル後に SCSI 検証レベルを変更できます。 これを行うには、デバッガー コマンドを使用します。
kd> ed scsiport!SpVrfyLevel Level
このコマンドを使用すると、Level に新しい値を設定 できます。 このメソッドを使用すると、いつでも上位ビット (0x10000000 から 0x8000000) を変更できます。 ただし、下位ビット (0x1) を変更する場合は、(カーネル デバッガーの初期ブレークポイントで) ブート プロセス中に変更する必要があります。
同様に、SCSI 検証を完全に非アクティブ化する場合は、最初のブレークポイントで レベル を0xFFFFFFFFに設定する必要があります。
手記 0xF0000000値はすべてのテストを無効にしますが、SCSI 検証モジュールは引き続き読み込まれます。 この値は、検証を無効にするが、後で上位ビット テストを有効にする場合に使用します。 一方、0xFFFFFFFF値を指定すると、モジュールが完全に読み込まれなくなります。起動時にこの値を使用した場合、再起動せずに SCSI 検証を有効にすることはできません。
再起動せずにアクティブ化する
一般に、任意の Windows オペレーティング システムでコンピューターを再起動 ("再起動") しないと、SCSI 検証をアクティブ化または非アクティブ化できません。 ScsiPort.sys ドライバーは、読み込まれたときにのみ VerifyLevel レジストリ エントリを読み取ります。これは通常、起動時です。 ただし、レジストリ エントリを追加するときに ScsiPort.sys ドライバーが読み込まれていない場合、またはアンロードされて再読み込みされた場合は、コンピューターを再起動せずに Windows XP 以降のバージョンの Windows で SCSI 検証を有効にすることができます。