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値を使用して最大検証を取得できます。

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

ビット 価値 影響

0

0x1

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

28

0x10000000

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

二十九

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