DRIVER_VERIFIER_IOMANAGER_VIOLATION 参数
当 Driver Verifier 处于活动状态并选择 I/O Verification 时,各种 I/O 违规将导致发出此错误检查。
参数 1 标识违规类型。
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误原因 |
---|---|---|---|---|
0x01 | 被释放的 IRP 地址 | 0 | 0 | 驱动程序试图释放类型不是 IO_TYPE_IRP 的对象。 |
0x02 | 被释放的 IRP 地址 | 0 | 0 | 驱动程序试图释放仍与线程关联的 IRP。 |
0x03 | 发送的 IRP 地址 | 0 | 0 | 驱动程序向 IoCallDriver 传递了一个不等于 IRP_TYPE 的 IRP 类型。 |
0x04 | 设备对象地址 | 0 | 0 | 驱动程序通过 IoCallDriver 一个无效的设备对象。 |
0x05 | 与违规驱动程序关联的设备对象的地址 | IoCallDriver 之前的 IRQL | IoCallDriver 之后的 IRQL | IRQL 在调用驱动程序调度例程期间发生了变化。 |
0x06 | IRP 状态 | 正在完成的 IRP 地址 | 0 | 驱动程序调用 IoCompleteRequest 并将状态标记为挂起(或者等于 -1)。 |
0x07 | 取消程序地址 | 正在完成的 IRP 地址 | 0 | 驱动程序调用 IoCompleteRequest 而其取消例程仍然设置。 |
0x08 | 设备对象地址 | IRP 主要功能代码 | 异常状态码 | 驱动程序通过 IoBuildAsynchronousFsdRequest 一个无效的缓冲区。 |
0x09 | 设备对象地址 | 输入输出控制代码 | 异常状态码 | 驱动程序通过 IoBuildDeviceIoControlRequest 一个无效的缓冲区。 |
0x10 | 当前 IRQL | 保留 | 保留 | IoCallDriver 在 DISPATCH_LEVEL 以上被调用。 |
0x11 | 驱动程序快速 I/O 调度例程地址 | 调用驱动程序调度例程之前的 IRQL | 当前 IRQL | IoCallDriver 在 DISPATCH_LEVEL 以上被调用。 |
0x12 | 驱动调度例程地址 | 调用驱动程序调度例程之前的 IRQL | 当前 IRQL | IoCallDriver 在 DISPATCH_LEVEL 以上被调用。 |
0x0A | 设备对象地址 | 0 | 0 | 驱动程序向 IoInitializeTimer 传递了一个带有已初始化计时器的设备对象。 |
0x0C | I/O 状态块地址 | 0 | 0 | 驱动程序将一个 I/O 状态块传递给一个 IRP,但是这个块被分配在一个已经超过那个点的堆栈上。 |
0x0D | 用户事件对象地址 | 0 | 0 | 驱动程序将一个用户事件传递给一个 IRP,但是这个事件被分配到一个已经超过那个点的堆栈上。 |
0x0E | 当前 IRQL | IRP地址 | 0 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 IoCompleteRequest。 |
0x0F | IRP 被发送到的设备对象的地址 | 指向 IRP 的指针 | 指向文件对象的指针 | 驱动程序发送了一个带有已关闭或者已取消打开的文件对象的创建请求。 |
除了上表中提到的错误之外,还有许多 I/O 验证错误会导致驱动程序验证程序停止系统,但实际上这些错误不是错误检查。
这些错误会导致消息显示在蓝屏、故障转储文件和内核调试器中。
这些消息在这些位置中的每一个都会以不同的方式显示。
发生这些错误时,十六进制错误检查代码 0xC9 和错误检查字符串 DRIVER_VERIFIER_IOMANAGER_VIOLATION 不会出现在蓝屏或者调试器中,尽管它们会出现在故障转储文件中。
在蓝屏上,将显示以下数据:
- 消息 IO 系统验证错误。
- 消息 WDM DRIVER ERROR XXX,其中 XXX 是表示特定错误的十六进制代码。(有关 I/O 错误代码及其含义的列表,请参见下表。)
- 导致错误的驱动程序的名称。
- 通常,驱动程序代码中检测到错误的地址(参数 2)。
如果启用了内核模式故障转储,则故障转储文件中将显示以下信息:
- 消息 BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) 。
- 十六进制 I/O 错误代码。(有关 I/O 错误代码及其含义的列表,请参见下表。)
- 通常,驱动程序代码中检测到错误的地址(参数 2)。
如果内核调试器连接到导致此违规的系统,以下信息将发送到调试器:
- 消息 WDM DRIVER ERROR 以及对错误严重性的评估。
- 导致错误的驱动程序的名称。
- 说明此错误原因的描述性字符串。通常会传递添加信息,例如指向 IRP 的指针或者指向设备对象或者 IRQL 信息的指针。(有关这些描述性字符串的列表以及指定的添加信息,请参阅下表。)
- 进一步操作的查询。可能的响应是 b(中断)、i(忽略)、z(zap)、r(删除)或者 d(禁用)。指示操作系统继续允许我们查看如果未发生此错误会“下线”发生什么。当然,这通常会导致另外的错误检查。“zap”选项实际上会删除导致此错误被发现的断点。
注意 不能以这种方式忽略其他错误检查。
只有这种 I/O 验证错误可以忽略,甚至这些错误也只能在添加内核调试器的情况下忽略。
下表列出了可能出现的 I/O 验证错误。
I/O Error Code | 严重性 | 错误原因 |
---|---|---|
0x200 | 未知 | 此代码涵盖所有未知的 I/O 验证错误。 |
0x201 | 致命错误 | 一个设备正在删除自身,而驱动程序堆栈中它下面还有另一个设备。这可能是因为调用方忘记先调用 IoDetachDevice,或者下层驱动程序可能错误地删除了自己。 参数 2 - 驱动程序代码中检测到错误的地址。 |
0x202 | 致命错误 | 驱动程序试图从没有添加到任何东西的设备对象中分离。如果在同一设备对象上两次调用 detach,则可能会发生这种情况。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - 设备对象地址。 |
0x203 | 致命错误 | 驱动程序调用了 IoCallDriver,但未将 IRP 中的取消例程设置为 NULL。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x204 | 致命错误 | 调用者已将 NULL 作为设备对象传入。这是致命的。 参数 2 - 保留 参数 3 - 保留 |
0x205 | 致命错误 | 调用者正在转发当前在其下方排队的 IRP。在此驱动程序中处理返回 STATUS_PENDING 的 IRP 的代码似乎已损坏。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x206 | 致命错误 | 调用者错误地转发了 IRP(控制字段未清零)。驱动程序应使用 IoCopyCurrentIrpStackLocationToNext 或者 IoSkipCurrentIrpStackLocation。 参数 2 - 保留 参数 3 - 保留 |
0x207 | 致命错误 | 调用者手动复制了堆栈,无意中复制了上层的完成例程。驱动程序应使用 IoCopyCurrentIrpStackLocationToNext。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x208 | 致命错误 | 此 IRP 即将用完堆栈位置。有人可能从另一个堆栈转发了这个 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x209 | 致命错误 | 调用者正在完成当前在其下方排队的 IRP。在此驱动程序中处理返回 STATUS_PENDING 的 IRP 的代码似乎已损坏。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x20A | 致命错误 | IoFreeIrp 的调用者正在释放一个仍在使用的 IRP。 参数 2 - 保留 参数 3 - 保留 |
0x20B | 致命错误 | IoFreeIrp 的调用者正在释放一个仍在使用的 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x20C | 致命错误 | IoFreeIrp 的调用者正在释放一个仍在排队等待线程的 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x20D | 致命错误 | IoInitializeIrp 的调用者传递了一个由 IoAllocateIrp 分配的 IRP。这是非法和不必要的,并导致配额泄漏。如果此 IRP 正在被回收,请检查 IoReuseIrp 的文档。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x20E | 非致命错误 | PNP IRP 的状态无效。(任何 PNP IRP 都必须将其状态初始化为 STATUS_NOT_SUPPORTED。) 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x20F | 非致命错误 | Power IRP 的状态无效。(任何 Power IRP 都必须将其状态初始化为 STATUS_NOT_SUPPORTED。) 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x210 | 非致命错误 | WMI IRP 的状态无效。(任何 WMI IRP 都必须将其状态初始化为 STATUS_NOT_SUPPORTED。) 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x211 | 非致命错误 | 调用者在跳过堆栈中的设备对象时转发了一个 IRP。调用者可能将 IRP 发送到 PDO 而不是 IoAttachDeviceToDeviceStack 返回的设备。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x212 | 非致命错误 | 调用者已经破坏或者没有正确复制 IRP 的堆栈。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x213 | 非致命错误 | 调用者更改了它不理解的 IRP 的状态字段。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x214 | 非致命错误 | 调用者更改了它不理解的 IRP 的信息字段。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x215 | 非致命错误 | IRP_MJ_PNP 的非成功非 STATUS_NOT_SUPPORTED IRP 状态正在向下传递堆栈。必须完成失败的 PNP IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x216 | 非致命错误 | 先前设置的 IRP_MJ_PNP 状态已转换为 STATUS_NOT_SUPPORTED。此故障状态保留供操作系统使用。驱动程序不能使用此值使 PnP IRP 失败。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x217 | 非致命错误 | 驱动程序尚未处理所需的 IRP。驱动程序必须更新 IRP 的状态以指示它是否已被处理。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x218 | 非致命错误 | 驱动程序已响应为堆栈中其他位置的其他设备对象保留的 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x219 | 非致命错误 | IRP_MJ_POWER 的非成功非 STATUS_NOT_SUPPORTED IRP 状态正在向下传递堆栈。必须完成失败的 POWER IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x21A | 非致命错误 | 先前设置的 IRP_MJ_POWER 状态已转换为 STATUS_NOT_SUPPORTED。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x21B | 非致命错误 | 司机返回可疑状态。这可能是由于驱动程序中未初始化的变量错误。 参数 3 - IRP 地址。 |
0x21C | 警告 | 调用者已复制 IRP 堆栈但未设置完成例程。这是低效的——改用 IoSkipCurrentIrpStackLocation。 参数 2 - 保留 参数 3 - 保留 |
0x21D | 致命错误 | 在接收到删除 IRP 时,IRP 调度处理程序没有正确地从它下面的堆栈中分离。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x21E | 致命错误 | 收到删除 IRP 后,IRP 调度处理程序未正确删除其设备对象。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x21F | 非致命错误 | 驱动程序尚未为所需的 IRP 主要功能填写调度例程。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x220 | 非致命错误 | IRP_MJ_SYSTEM_CONTROL 已由 ProviderId 以外的其他人完成。此 IRP 应该更早完成或者应该已传递。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - ProviderId。 |
0x221 | 致命错误 | PDO 的 IRP 调度处理程序已删除其设备对象,但在总线关系查询中未报告硬件丢失。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x222 | 致命错误 | 当 PDO 仍处于活动状态时,总线过滤器的 IRP 调度处理程序在接收到删除 IRP 时已分离。总线过滤器必须在 FastIoDetach 回调中进行清理。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x223 | 致命错误 | 总线过滤器的 IRP 调度处理程序已删除其设备对象,但 PDO 仍然存在。总线过滤器必须在 FastIoDetach 回调中进行清理。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x224 | 致命错误 | IRP 调度处理程序返回的状态与 IRP 的 IoStatus.Status 字段不一致。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 预期的状态代码。 |
0x225 | 非致命错误 | IRP 调度处理程序返回了一个非法状态 (0xFFFFFFFF)。这可能是由于未初始化的堆栈变量造成的。要调试此错误,请使用具有指定地址的 ln(列出最近的符号)命令。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 状态代码。 |
0x226 | 致命错误 | IRP 调度处理程序在没有传递或者完成此 IRP 的情况下返回,或者有人忘记返回 STATUS_PENDING。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x227 | 致命错误 | IRP 完成例程在可分页代码中。(这是不允许的。) 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x228 | 非致命错误 | 如果在传递给驱动程序的 IRP 中设置了 PendingReturned 字段,则驱动程序的完成例程未将 IRP 标记为挂起。这可能会导致 Windows 挂起,尤其是当堆栈返回错误时。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x229 | 致命错误 | 已为 IRP 设置了取消例程,该 IRP 当前正在由堆栈中较低的驱动程序处理,可能会踩踏它们的取消例程。 参数 2 - 保留。 参数 3 - 保留。 |
0x22A | 非致命错误 | 物理设备对象 (PDO) 尚未响应所需的 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x22B | 非致命错误 | 物理设备对象 (PDO) 忘记使用用于 TargetDeviceRelation 查询的 PDO 填写设备关系列表。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x22C | 致命错误 | 实现 TargetDeviceRelation 查询的代码没有在 PDO 上调用 ObReferenceObject。 参数 2 - 保留。 参数 3 - 保留。 |
0x22D | 非致命错误 | 调用者完成了一个它不理解的 IRP_MJ_PNP 而不是传递它。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x22E | 非致命错误 | 调用者已成功完成 IRP_MJ_PNP 而不是将其传递下去。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x22F | 非致命错误 | 调用者完成了一个未触及的 IRP_MJ_PNP(而不是向下传递 IRP),或者非 PDO 使用非法的 STATUS_NOT_SUPPORTED 值使 IRP 失败。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x230 | 非致命错误 | 调用者完成了一个它不理解的 IRP_MJ_POWER 而不是传递它。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x231 | 致命错误 | 调用者已成功完成 IRP_MJ_POWER 而不是将其传递下去。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x232 | 非致命错误 | 调用者已经完成了一个未触及的 IRP_MJ_POWER(而不是向下传递 IRP),或者非 PDO 使用非法的 STATUS_NOT_SUPPORTED 值使 IRP 失败。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x233 | 非致命错误 | 查询功能 IRP 中查询功能结构的版本字段未正确初始化。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x234 | 非致命错误 | 查询功能 IRP 中查询功能结构的大小字段未正确初始化。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x235 | 非致命错误 | 查询功能 IRP 中查询功能结构的地址字段未正确初始化为 -1. 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x236 | 非致命错误 | 查询功能 IRP 中查询功能结构的 UI 编号字段未正确初始化为 -1. 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x237 | 致命错误 | 驱动程序发送了一个仅限系统使用的 IRP。 参数 2 - 保留。 参数 3 - 保留。 |
0x238 | 警告 | IoInitializeIrp 的调用者传递了一个由 IoAllocateIrp 分配的 IRP。这是非法的、不必要的,并且会对正常使用中的性能产生负面影响。如果此 IRP 正在被回收,请参阅 Windows 驱动程序工具包中的 IoReuseIrp。 参数 2 - 保留。 参数 3 - 保留。 |
0x239 | 警告 | IoCompleteRequest 的调用者正在完成一个从未通过调用 IoCallDriver 或者 PoCallDriver 转发的 IRP。这可能是一个错误。 参数 2 - 保留。 参数 3 - 保留。 |
0x23A | 致命错误 | 驱动程序在 IRQL 上转发了一个 IRP,对于这个主要代码是非法的。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x23B | 非致命错误 | 调用者更改了它不理解的 IRP 的状态字段。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
下表列出了可能出现的其他 I/O 验证错误。
激活增强型 I/O 验证时会出现这些错误。
有关详细信息,请参阅增强的 I/O 验证。
I/O Error Code | 严重性 | 错误原因 |
---|---|---|
0x23C | 致命错误 | 驱动程序已完成 IRP,但未将 IRP 中的取消例程设置为 NULL。 参数 2 - 保留。 参数 3 - 保留。 |
0x23D | 非致命错误 | 驱动程序已返回 STATUS_PENDING 但未通过调用 IoMarkIrpPending 将 IRP 标记为挂起。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 状态代码。 |
0x23E | 非致命错误 | 驱动程序已将 IRP 标记为挂起,但未返回 STATUS_PENDING。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 状态代码。 |
0x23F | 致命错误 | 驱动程序没有从它所连接的堆栈继承 DO_POWER_PAGABLE 位。 参数 2 - 保留。 参数 3 - 保留。 |
0x240 | 致命错误 | 驱动程序试图删除已通过先前调用 IoDeleteDevice 删除的设备对象。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 2 - 保留。 参数 3 - 保留。 |
0x241 | 致命错误 | 驱动程序在意外删除 IRP 期间分离了其设备对象。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x242 | 致命错误 | 驱动程序在意外删除 IRP 期间删除了其设备对象。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x243 | 致命错误 | 驱动程序未能清除 AddDevice 末尾的 DO_DEVICE_INITIALIZING 标志。 参数 2 - 保留。 参数 3 - 保留。 参数 4 - |
0x244 | 致命错误 | 驱动程序没有从它添加到的设备对象中复制 DO_BUFFERED_IO 或者 DO_DIRECT_IO 标志。 参数 2 - 保留。 参数 3 - 保留。 |
0x245 | 致命错误 | 驱动程序已设置 DO_BUFFERED_IO 和 DO_DIRECT_IO 标志。这些标志是互斥的。 参数 2 - 保留。 参数 3 - 保留。 |
0x246 | 致命错误 | 驱动程序未能从它所添加的设备对象复制 DeviceType 字段。 参数 2 - 保留。 参数 3 - 保留。 |
0x247 | 致命错误 参数 2 - 保留。 参数 3 - 保留。 | 驱动程序失败了不能合法失败的 IRP。 |
0x248 | 致命错误 | 驱动程序已将不是 PDO 的设备对象添加到设备关系查询中。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x249 | 非致命错误 | 驱动程序枚举了两个返回相同设备 ID 的子 PDO。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - 第一个设备对象地址。 参数 4 - 第二个设备对象地址。 |
0x24A | 致命错误 | 驱动程序错误地调用了 IRQL 不等于 PASSIVE_LEVEL 的文件 I/O 函数。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - 保留。 参数 4 - 保留。 |
0x24B | 致命错误 | 驱动程序已成功完成类型为 TargetDeviceRelation 的 IRP_MN_QUERY_DEVICE_RELATIONS 请求,但未正确填写请求或者将 IRP 转发到底层硬件堆栈。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - 设备对象地址。 |
0x24C | 非致命错误 | 驱动程序已返回 STATUS_PENDING 但未通过调用 IoMarkIrpPending 将 IRP 标记为挂起。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 状态代码。 |
0x24D | 致命错误 | 驱动程序已将无效的设备对象传递给需要 PDO 的函数。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 设备对象地址。 |
0x300 | 非致命错误 | 司机返回可疑状态。这可能是由于驱动程序中未初始化的变量错误。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - 可疑状态代码。 |
0x301 | 非致命错误 | 驱动程序已在 IRQL > DISPATCH_LEVEL 转发 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - IRQL 值不正确 |
0x302 | 非致命错误 | 驱动程序在 IRQL > = APC_LEVEL 转发了一个 IRP。 I/O 管理器需要将 APC 排队以完成此请求。APC 将无法运行,因为调用方已经处于 APC 级别,因此调用方很可能会死锁。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 参数 4 - IRQL 值不正确。 |
0x306 | 非致命错误 | 驱动程序正在完成带有故障状态代码的 IRP_MJ_PNP(主要)和 IRP_MN_REMOVE_DEVICE(次要)请求。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x307 | 非致命错误 | 驱动程序发出一个 I/O 请求,其中的事件已经被通知并收到了 STATUS_PENDING 响应。这可能会导致在 I/O 完成之前展开。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x310 | 非致命错误 | 驱动程序正在重新初始化仍在使用的 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x311 | 非致命错误 | 驱动程序正在重新初始化使用 IoMakeAssociatedIrp、IoBuildAsynchronousFsdRequest、IoBuildSynchronousFsdRequest、IoBuildDeviceIoControlRequest 创建的 IRP。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
0x312 | 非致命错误 | 调用者为 IRP 状态信息字段提供了一个大于系统缓冲区输出部分的值。 参数 2 - 驱动程序代码中检测到错误的地址。 参数 3 - IRP 地址。 |
原因
有关原因的说明,请参阅参数部分中每个代码的说明。
解决方法
仅当 Driver Verifier 被指示监控一个或者多个驱动程序时,才会发生此错误检查。
如果我们不打算使用 Driver Verifier,则应停用它。
有关详细信息,请参阅驱动程序验证程序中的“如何控制驱动程序验证程序”。
我们也可以考虑更新或者删除导致此问题的驱动程序。
如果我们是驱动程序开发人员,请使用通过此错误检查获得的信息来修复代码中的错误。
有关驱动程序验证程序的完整详细信息,请参阅驱动程序验证程序。
DRIVER_VERIFIER_IOMANAGER_VIOLATION 错误检查的值为 0x000000C9.
这是所有驱动程序验证程序 I/O 验证违规的错误检查代码。