Windows 蓝屏代码 0xE6:DRIVER_VERIFIER_DMA_VIOLATION

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

说明

未启用驱动程序验证程序时,可以观察到 E6 主要错误检查代码。
如果我们在未启用驱动程序验证程序的情况下遇到此代码,请参阅 DMA 验证页面以获取更多信息。

解决方法

仅当 Driver Verifier 被指示监控一个或者多个驱动程序时,才会发生此错误检查。
如果我们不打算使用 Driver Verifier,则应停用它。
我们也可以考虑删除导致此问题的驱动程序。

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

有关驱动程序验证程序的更多信息,请参阅驱动程序验证程序。

www. On IT Road .com

原因

有关原因的说明,请参阅参数部分中每个代码的说明。

DRIVER_VERIFIER_DMA_VIOLATION 参数

参数 1 是唯一感兴趣的参数。
此参数标识确切的违规。
如果添加了调试器,调试器中会显示一条信息性消息。

参数 1错误原因和调试器消息
0x00 - Miscellaneous DMA error.此代码可以表示参数 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驱动程序将空 DMA_ADAPTER 值传递给 HAL 例程。
0x1B驱动程序将地址和 MDL 传递给 HAL 例程。但是,此地址不在此 MDL 的范围内。
参数 2 - 超出 MDL 范围的虚拟地址。
参数 3 - MDL。
0x1D驱动程序尝试映射已映射的地址范围。
参数 2 - 映射开始的缓冲区。
参数 3 - 映射结束的缓冲区。
参数 4 - 已映射的缓冲区中的系统地址。
0x1E驱动程序称为 HalGetAdapter。此函数已过时——我们必须改用 IoGetDmaAdapter。
0x1F无效的 DMA 缓冲区。驱动程序引用了一个无效的系统地址——或者在第一个 MDL 之前,或者在第一个 MDL 结束之后,或者通过使用比 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 - 指向相应内部验证器数据的指针。
0x22DMA 缓冲区未映射到系统 VA 中。
参数 2 - MDL
0x23无法刷新尚未完成或者取消的通道。
参数 2 - 违规代码。
值:0x00:非法通道刷新
参数 3 - 控制器 ID。
参数 4 - 频道编号。
0x24请求长度的缓冲区不足。
参数 2 - 未计长度。
0x25未知的设备描述版本。
0x26IOMMU 检测到 DMA 违规。
参数 2 - 故障设备的设备对象。
参数 3 - 故障信息(通常是故障物理地址)。
参数 4 - 故障类型(特定于硬件)。
日期:2020-09-17 00:16:14 来源:oir作者:oir