SCSI 検証

ドライバー検証ツールの 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 検証をアクティブにする方法

  1. ドライバー検証ツール マネージャーまたは Verifier.exe コマンド ラインを使用して、ミニポート ドライバーの検証を開始します。 SCSI 検証はオプションとしては使用できないため、少なくとも 1 つの他のドライバーの検証ツール オプションを選択する必要があります。 詳細については、「ドライバー検証ツール オプションの選択」および「検証するドライバーの選択」を参照してください。

  2. regedit.exe を使用してレジストリを開きます。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ScsiPort キーに、Verifier という名前のサブキーを追加します。 そのキー内に、VerifyLevel という名前の REG_DWORD エントリを追加します。 このエントリに割り当てられた値によって、どの SCSI 検証テストがアクティブになるかが決まります。 値 0x1 は、最大の検証を提供します。

  3. コンピューターを再起動します。

VerifyLevel 値が存在しないか、0xFFFFFFFF と等しい場合、SCSI 検証は無効になります。

VerifyLevel 値の個々のビットを使用して、実行するテストを正確に制御できます。 ビット 0 (0x1) を使用すると、特定のテストが可能になります。ビット 28、29、30、および 31 では、特定のテストが無効になります。 したがって、0x00000001 値を使用して最大検証を取得できます。

各ビットの効果は次のとおりです。

bit 効果

0

0x1

ドライバー検証ツールは、ミニポート ドライバーのメモリ アクセスとメモリ バッファーの不適切な使用のチェックを監視します。

28

0x10000000

HwAdapterControl ルーチンの完了に 0.5 秒以上かかる場合、ドライバー検証ツールはバグ チェックを発行しません。

29

0x20000000

ドライバー検証ツールは、リセットの保留期間が終了し、論理ユニットに未処理の要求が残っている場合、チェックバグを発行しません。

30

0x40000000

ドライバー検証ツールは、タグ付けされていない要求がまだアクティブな状態でミニポート ドライバーが NextLuRequestScsiPortNotification を呼び出すときに、チェックバグを発行しません。

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 検証を有効にすることができます。