驱动程序验证器的 SCSI 验证功能监控 SCSI 微型端口驱动程序和端口驱动程序之间的交互。 如果微型端口驱动程序滥用例程、错误地响应端口驱动程序的请求,或花费过多的时间响应请求,则会发出 bug 检查。
此驱动程序验证程序选项仅在 Windows XP 及更高版本中可用。
SCSI 验证检测到的冲突
SCSI 验证选项可以检测 SCSI 例程的多个误用。 还可以单独禁用这些检查中的某些检查。
当 SCSI 微型端口驱动程序提交以下冲突之一时,Driver Verifier 将发出错误检查 0xF1。
微型端口驱动程序将错误的参数传递给 ScsiPortInitialize。
微型端口驱动程序调用 ScsiPortStallExecution ,并指定超过 0.1 秒的延迟,从而长时间停止处理器。
端口驱动程序调用微型端口驱动程序例程,微型端口驱动程序的执行时间超过 0.5 秒。 (FindAdapter 例程豁免,并且允许 HwInitialize 例程在 5 秒内完成。)
微型端口驱动程序多次完成请求。
微型端口驱动程序以无效的 SRB 状态完成了例程。
微型端口驱动程序调用 ScsiPortNotification 以请求 NextLuRequest,但未标记的请求仍然处于活动状态。
微型端口驱动程序将无效的虚拟地址传递给 ScsiPortGetPhysicalAddress。 (这通常意味着提供的地址不映射到公共缓冲区。
总线重置保留期结束,但微型端口驱动程序仍具有未完成的请求。
有关 Bug 检查参数的完整列表,请参阅 Bug 检查 0xF1(SCSI_VERIFIER_DETECTED_VIOLATION)。
除了这些违规之外,SCSI 验证还会监视微型端口驱动程序的内存访问,以检测是否存在不当使用。 微型端口驱动程序进行的两个常见内存冲突是在请求完成后访问 SRB 扩展,并在微型端口驱动程序未指定 MapBuffers 时访问 SRB 的 DataBuffer。
此类内存违规通常会导致发出 Bug 检查0xD1(DRIVER_IRQL_NOT_LESS_OR_EQUAL)。
激活此选项
激活 SCSI 验证选项的过程不同于激活其他驱动程序验证程序选项的过程。
激活 SCSI 验证
使用驱动程序验证程序管理器或 Verifier.exe 命令行启动微型端口驱动程序的验证。 由于 SCSI 验证不能作为选项提供,因此必须至少选择一个其他驱动程序验证程序选项。 有关详细信息,请参阅“选择驱动程序验证程序选项”和“选择要验证的驱动程序”。
使用 regedit.exe打开注册表。 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ScsiPort 密钥中,添加名为 验证程序的子项。 在该密钥中,添加名为 VerifyLevel 的REG_DWORD条目。 分配给此条目的值将确定哪些 SCSI 验证测试将处于活动状态。 值0x1将提供最大验证。
重新启动计算机。
如果 VerifyLevel 值不存在或等于0xFFFFFFFF,则将禁用 SCSI 验证。
VerifyLevel 值中的单个位可用于精确控制将执行哪些测试。 位零(0x1)启用某些测试;bits 28、29、30 和 31 禁用某些测试。 因此,可以使用值0x00000001获取最大验证。
每个位的效果如下所示:
| Bit | 价值 | 影响 |
|---|---|---|
0 |
0x1 |
驱动程序验证程序将监视微型端口驱动程序的内存访问,并检查内存缓冲区的不当使用。 |
28 |
0x10000000 |
驱动程序验证程序在 HwAdapterControl 例程超过 0.5 秒完成时不会发出错误检查。 |
二十九 |
0x20000000 |
驱动程序验证程序在重置保留期结束时不会发出 bug 检查,并且逻辑单元上仍有未完成的请求。 |
30 |
0x40000000 |
当微型端口驱动程序调用 ScsiPortNotification 和 NextLuRequest 时,驱动程序验证程序不会发出 bug 检查,而未标记的请求仍然处于活动状态。 |
31 |
0x80000000 |
驱动程序验证程序在 HwInitialize 例程需要超过 5 秒时间才能完成时,不会触发 bug 检查。 |
在大多数情况下,建议的设置是0xD0000001。 这允许所有 SCSI 验证程序 测试,除了 HwAdapterControl 的时间限制、 HwInitialize 的时间限制以及对逻辑单元的多个请求的禁令。 这三项测试往往过于严格。
如果附加了内核调试器,可以在启动周期后更改 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 验证,而无需重新启动计算机。