共用方式為


SCSI 驗證

驅動程式驗證器的 SCSI 驗證功能會監視 SCSI 迷你埠驅動程式與埠驅動程式之間的互動。 如果迷你埠驅動程式誤用常式、從埠驅動程式不正確回應要求,或花費太多時間來回應要求,就會發出錯誤檢查。

此驅動程式驗證器選項僅適用于 Windows XP 和更新版本。

SCSI 驗證偵測到的違規

SCSI 驗證選項可以偵測數個 SCSI 常式誤用。 您也可以個別停用某些檢查。

當 SCSI 迷你埠驅動程式認可下列其中一個違規時,驅動程式驗證器會發出錯誤檢查0xF1。

  • 迷你埠驅動程式會將不正確的引數傳遞至 ScsiPortInitialize

  • 迷你埠驅動程式會呼叫 ScsiPortStallExecution ,並指定超過 0.1 秒的延遲,讓處理器停止時間過長。

  • 埠驅動程式會呼叫迷你埠驅動程式常式,而迷你埠驅動程式需要超過 0.5 秒才能執行它。 (FindAdapter 常式是豁免的,而且允許 HwInitialize 常式 5 秒。)

  • 迷你埠驅動程式會多次完成要求。

  • 迷你埠驅動程式會完成具有無效 SRB 狀態的常式。

  • 迷你埠驅動程式會呼叫 ScsiPortNotification 來要求 NextLuRequest,但未標記的要求仍然作用中。

  • 迷你埠驅動程式會將不正確虛擬位址傳遞至 ScsiPortGetPhysicalAddress。 (這通常表示提供的位址不會對應至通用緩衝區區域。)

  • 匯流排重設保留期間結束,但迷你埠驅動程式仍有未完成的要求。

如需錯誤檢查參數的完整清單,請參閱 錯誤檢查0xF1 (SCSI_VERIFIER_DETECTED_VIOLATION) 。

除了這些違規之外,SCSI 驗證也會監視迷你埠驅動程式的記憶體存取,以不當使用。 迷你埠驅動程式所做的兩個常見記憶體違規是在要求完成之後存取 SRB 擴充功能,並在迷你埠驅動程式未指定MapBuffers時存取 SRB的 DataBuffer

此排序的記憶體違規通常會導致 發出錯誤檢查0xD1 (DRIVER_IRQL_NOT_LESS_OR_EQUAL) 。

啟用此選項

啟用 SCSI 驗證選項的程式與啟用其他驅動程式驗證器選項的程式不同。

若要啟用 SCSI 驗證

  1. 使用驅動程式驗證器管理員或Verifier.exe命令列,啟動迷你埠驅動程式的驗證。 由於 SCSI 驗證無法作為選項使用,因此您必須選取至少一個其他驅動程式驗證器選項。 如需詳細資訊,請參閱 選取驅動程式驗證器選項選取要驗證的驅動程式

  2. 使用 regedit.exe 開啟登錄。 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ScsiPort 機碼中,新增名為 Verifier的子機碼。 在該索引鍵中,新增名為 VerifyLevel的REG_DWORD專案。 指派給這個專案的值會決定哪些 SCSI 驗證測試將會作用中。 值0x1會提供最大驗證。

  3. 重新啟動電腦。

如果 VerifyLevel 值不存在,或等於0xFFFFFFFF,則會停用 SCSI 驗證。

VerifyLevel值中的個別位可用來完全控制要執行的測試。 位零 (0x1) 可啟用特定測試;bits 28、29、30 和 31 會停用特定測試。 因此,您可以使用值0x00000001來取得最大驗證。

每個位的效果如下所示:

bit 效果

0

0x1

驅動程式驗證器會監視迷你埠驅動程式的記憶體存取,並檢查記憶體緩衝區的使用不正確。

28

0x10000000

HwAdapterControl 常式需要超過 0.5 秒才能完成時,驅動程式驗證程式將不會發出錯誤檢查。

29

0x20000000

驅動程式驗證器不會在重設保留期間結束時發出錯誤檢查,而且邏輯單元上仍有未完成的要求。

30

0x40000000

當迷你埠驅動程式在未標記的要求仍在作用中時,使用NextLuRequest呼叫ScsiPortNotification時,驅動程式驗證程式不會發出錯誤檢查。

31

0x80000000

HwInitialize 常式需要超過 5 秒才能完成時,驅動程式驗證程式將不會發出錯誤檢查。

在大部分情況下,建議的設定是0xD0000001。 這可啟用所有 SCSI 驗證器 測試,但 HwAdapterControl的時間限制、 HwInitialize上的時間限制,以及禁止對邏輯單元的多個要求。 這三項測試通常太嚴格。

如果連結核心偵錯工具,可以在開機週期之後變更 SCSI 驗證層級。 若要這樣做,請使用偵錯工具命令:

kd> ed scsiport!SpVrfyLevel Level 

此命令可讓您設定 Level的新值。 使用此方法,您可以隨時透過0x8000000) 變更高位 (0x10000000。 不過,如果您想要變更低位 (0x1) ,必須在開機程式期間 (核心偵錯工具的初始中斷點) 。

同樣地,如果您想要完全停用 SCSI 驗證,您必須在初始中斷點將 [層級 ] 設定為 [0xFFFFFFFF]。

注意 0xF0000000的值將會停用所有測試,但仍會載入 SCSI 驗證模組。 如果您想要停用驗證,但想要稍後啟用高位測試,請使用此值。 另一方面,值0xFFFFFFFF可防止模組完全載入;如果在開機期間使用此值,則無法在不重新開機的情況下啟用 SCSI 驗證。

啟動而不重新開機

一般而言,您無法在沒有重新開機 (「重新開機」的情況下啟動或停用 SCSI 驗證,) 任何 Windows 作業系統上的電腦。 ScsiPort.sys驅動程式只會在載入 時讀取 VerifyLevel 登錄專案,這通常是在開機時間。 不過,如果您在新增登錄專案時未載入ScsiPort.sys驅動程式,或是卸載並重載,您可以在 Windows XP 和更新版本的 Windows 上啟用 SCSI 驗證,而不需重新開機電腦。