错误检查 0xE6:DRIVER_VERIFIER_DMA_VIOLATION

DRIVER_VERIFIER_DMA_VIOLATION 错误检查的值为 0x000000E6。 这是所有驱动程序验证程序 DMA 验证违规的错误检查代码。

重要

这篇文章适合程序员阅读。 如果你是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答

注意

未启用驱动程序验证程序时,可以观察到 E6 主要错误检查代码。 如果在未启用驱动程序验证程序的情况下遇到此代码,请参阅 DMA 验证页了解详细信息。

DRIVER_VERIFIER_DMA_VIOLATION 参数

参数 1 是唯一感兴趣的参数。 此参数标识完全冲突。 如果附加了调试器,调试器中会显示一条信息性消息。

参数 1 错误原因和调试器消息

0x00 - 其他 DMA 错误。

该代码表示参数 2 所指示的两种错误:

0x1 - 驱动程序试图将过多的字节刷新到映射寄存器文件的末尾。

参数 3 - MDL 中剩余的字节数。

参数 4 - 请求刷新的剩余字节数。

0x2 - Windows 已用完连续映射寄存器。

参数 3 - 需要映射寄存器。

参数 4 - 连续映射寄存器的数量。

0x01

性能计数器已减少。 将显示计数器的旧值和新值。

0x02

性能计数器增长过快。 计数器值显示在调试器中。

0x03

驱动程序释放了过多的 DMA 通用缓冲区。 通常这意味着它两次释放相同的缓冲区。

参数 2 - 释放的额外通用缓冲区数。

0x04

驱动程序释放了过多的 DMA 适配器通道。 通常这意味着它两次释放同一适配器通道。

参数 2 - 释放的额外适配器通道数。

0x05

驱动程序释放了过多的 DMA 映射寄存器。 通常这意味着它两次释放同一映射寄存器。

参数 2 - 释放的额外映射寄存器数。

0x06

驱动程序释放了过多的 DMA 散点/聚集列表。 通常这意味着它两次释放相同的散点/聚集列表。

参数 2 - 分配的散点聚集列表。

参数 3 - 释放散点聚集列表。

0x07

驱动程序试图在没有首先释放所有公共缓冲区的情况下释放适配器。

参数 2 - 指向 DMA 适配器的指针。

参数 3 - 未完成的公共缓冲区的数量。

参数 4 - 指向相应的内部验证程序数据的指针。

0x08

驱动程序试图释放适配器,但没有首先释放所有适配器通道、公共缓冲区或分散/聚集列表。

参数 2 - 指向 DMA 适配器的指针。

参数 3 - 未完成的适配器通道数。

参数 4 - 指向相应的内部验证程序数据的指针。

0x09

驱动程序试图在未首先释放所有映射寄存器的情况下释放适配器。

参数 2 - 指向 DMA 适配器的指针。

参数 3 - 未完成的映射寄存器数。

参数 4 - 指向相应的内部验证程序数据的指针。

0x0A

驱动程序试图释放适配器,但没有首先释放其所有散点/聚集列表。

参数 2 - 指向 DMA 适配器的指针。

参数 3 - 未完成的散点聚集列表数。

参数 4 - 指向相应的内部验证程序数据的指针。

0x0B

驱动程序同时分配了过多的适配器通道(每个适配器只允许一个适配器通道)。

参数 2 - 未完成的适配器通道。

0x0C

驱动程序试图同时分配过多的映射寄存器。

参数 2 - 必需的映射寄存器。

参数 3 - 最大映射寄存器数。

0x0D

驱动程序未刷新其适配器缓冲区。

参数 2 - 映射的字节数。

参数 3 - 一次可映射的最大字节数。

0x0E

驱动程序尝试在没有锁定缓冲区的情况下进行 DMA 传输。 有问题的缓冲区位于分页内存中。

参数 2 - DMA 缓冲区 MDL 的地址。

0x0F

驱动程序或硬件在其分配的 DMA 缓冲区之外写入。 参数 2 是冲突代码。

0x01:DMA 缓冲区之前的标记已被修改。所需标记为 DmaVrfy0。

参数 3 - 缓冲区长度。

参数 4 - 缓冲区启动。

0x02:DMA 缓冲区之前的标记已被修改。

所需标记为 DmaVrfy0。

参数 3 - 缓冲区长度。

参数 4 - 缓冲区启动。

0x03:可用映射寄存器被覆盖。

参数 3 - 损坏地址。 所需填充模式为 0x0F。

0x04:缓冲区之前的填充被错误地修改。

参数 3 - 缓冲区启动。 所需填充为 0x0F。

参数 4 - 损坏地址。

0x05:缓冲区之后的填充被错误地修改。

参数 3 - 缓冲区启动。

参数 4 - 损坏地址。 所需填充模式为 0x0F。

0x10

驱动程序试图释放其映射寄存器,而有些寄存器仍在映射中。

参数 2 - 仍映射的寄存器数。

0x11

驱动程序对适配器有太多未完成的引用计数。

参数 2 - 引用计数。

参数 3 - 指向 DMA 适配器的指针。

参数 4 - 指向相应的内部验证程序数据的指针。

0x13

驱动程序以不正确的 IRQL 调用 DMA 例程。 参数 2 是冲突代码。

0x01:当前的 IRQL 与预期不同。

参数 3 - 预期 IRQL。

参数 4 - 当前 IRQL。

0x02:当前 IRQL 高于预期。

参数 3 - 预期的最大 IRQL。

参数 4 - 当前 IRQL。

0x14

驱动程序以不正确的 IRQL 调用 DMA 例程。

0x15

驱动程序试图分配过多的映射寄存器。

参数 2 - 分配的映射寄存器。

参数 3 - 最大映射寄存器数。

0x16

驱动程序试图刷新未映射的缓冲区。

参数 2 - 映射寄存器的系统虚拟空间中的地址。

参数 3 - 指向相应的内部验证程序数据的指针。

0x18

驱动程序使用一个已释放但已不存在的适配器尝试 DMA 操作。

参数 2 - 指向 DMA 适配器的指针。

参数 3 - 指向相应的内部验证程序数据的指针。

0x19

驱动程序向 HAL 例程传递了一个空 DMA_ADAPTER 值。

0x1B

驱动程序将地址和 MDL 传递给 HAL 例程。 但是,此地址不在此 MDL 的范围内。

参数 2 - 超出 MDL 边界的虚拟地址。

参数 3 - MDL。

0x1D

驱动程序试图映射已映射的地址范围。

参数 2 - 映射开始的缓冲区。

参数 3 - 映射结束的缓冲区。

参数 4 - 缓冲区中已映射的系统地址。

0x1E

驱动程序调用 HalGetAdapter。 此函数已过时 -- 必须改用 IoGetDmaAdapter

0x1F

无效的 DMA 缓冲区。 驱动程序引用了无效的系统地址,要么是在第一个 MDL 之前,要么是在第一个 MDR 结束之后,要么是使用了一个比 MDL 缓冲区更长的传输长度,并且在 MDL 内跨越了一个页面边界。参数 2 是违规代码。

0x01:虚拟缓冲区地址位于第一个 MDL 之前。

参数 3 - DMA 缓冲区开始的虚拟地址。

参数 4 - 指向描述 DMA 缓冲区的第一个 MDL 的指针。

0x02:虚拟地址位于第一个 MDL 之后。

参数 3 - DMA 缓冲区开始的虚拟地址。

参数 4 - 指向描述 DMA 缓冲区的第一个 MDL 的指针。

0x03:额外的传输长度越过页面边界。

参数 3 - 指向描述 DMA 缓冲区的 MDL 的指针。

参数 4 - DMA 传输的长度。

0x04:DMA 缓冲区的虚拟地址未与缓存对齐。

参数 3 - DMA 缓冲区开始的虚拟地址。

参数 4 - 指向描述 DMA 缓冲区的 MDL 的指针。

0x05:DMA 缓冲区长度未与缓存对齐。

参数 3 - DMA 缓冲区的长度。

参数 4 - 指向描述 DMA 缓冲区的 MDL 的指针。

0x20

驱动程序试图刷新尚未映射的映射寄存器。

参数 2 - 映射寄存器基。

参数 3 - DMA 缓冲区开始的 VA。

参数 4 - 指向用于描述 DMA 缓冲区的 MDL 的指针。

0x21

驱动程序试图映射一个零长度的缓冲区进行传输。

参数 2 - 指向相应的内部验证程序数据的指针。

0x22

DMA 缓冲区未映射到系统 VA 中。

参数 2 - MDL

0x23

无法刷新尚未完成或取消的通道。

参数 2 - 冲突代码。

值:0x00:非法通道刷新

参数 3 - 控制器 ID。

参数 4 - 通道号。

0x24

缓冲区不足,无法满足请求的长度。

参数 2 - 未计入的长度。

0x25

未知设备说明版本。

0x26

IOMMU 检测到 DMA 冲突。

参数 2 - 故障设备的设备对象。

参数 3 - 故障信息(通常是物理地址故障)。

参数 4 - 故障类型(特定于硬件)。

原因

有关原因的说明,请参阅“参数”章节中每个代码的说明。

解决方法

只有当驱动程序验证程序被指示监视一个或多个驱动程序时,才能进行此错误检查。 如果不打算使用驱动程序验证程序,则应将其停用。 还可以考虑删除导致此问题的驱动程序。

如果你是驱动程序编写者,请使用通过此错误检查获得的信息来修复代码中的错误。

有关驱动程序验证程序的详细信息,请参阅驱动程序验证程序