错误检查 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 - 故障类型(特定于硬件)。 |
原因
有关原因的说明,请参阅“参数”章节中每个代码的说明。
解决方法
只有当驱动程序验证程序被指示监视一个或多个驱动程序时,才能进行此错误检查。 如果不打算使用驱动程序验证程序,则应将其停用。 还可以考虑删除导致此问题的驱动程序。
如果你是驱动程序编写者,请使用通过此错误检查获得的信息来修复代码中的错误。
有关驱动程序验证程序的详细信息,请参阅驱动程序验证程序。