Bug 检查0xE6:驱动程序 _ 验证程序 _ DMA _ 冲突

驱动程序 _ 验证程序 _ DMA _ 冲突 bug 检查的值为0x000000E6。 这是所有驱动程序验证程序 DMA 验证 冲突的 bug 检查代码。

重要

本主题面向程序员。 如果您是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答

备注

未启用驱动程序验证程序时,可以观察到 E6 的主要错误检查代码。 如果你遇到此代码,但未启用驱动程序验证程序,请参阅 DMA 验证 页。

驱动程序 _ 验证程序 _ DMA _ 冲突参数

参数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 例程传递了 null DMA_ADAPTER 值。

0x1B

驱动程序将地址和 MDL 传递到 HAL 例程。 但是,此地址不在此 MDL 的边界内。

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

参数 3-MDL。

0x1D

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

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

参数 3-要映射的缓冲区。

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

0x1E

称为 HalGetAdapter的驱动程序。 此函数已过时 -- 必须改为使用 IoGetDmaAdapter。

0x1F

DMA 缓冲区无效。 驱动程序引用了无效的系统地址 - 第一个 MDL 之前或第一个 MDL 的末尾之后,或者通过使用比 MDL 缓冲区长且跨越 MDL.Parameter 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

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

参数 2-MDL

0x23

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

参数 2-冲突代码。

值:0x00:非法的通道刷新

参数 3-控制器 Id。

参数 4-频道号。

0x24

请求长度的缓冲区不足。

参数 2-无人负责长度。

0x25

未知设备说明版本。

0x26

IOMMU 检测到 DMA 冲突。

参数 2-出错设备的设备对象。

参数 3-错误信息 (通常是错误的物理地址) 。

参数 4-错误类型 (硬件特定) 。

原因

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

解决方法

此 bug 检查只能在已指示驱动程序验证器监视一个或多个驱动程序时出现。 如果你不打算使用驱动程序验证程序,则应停用它。 你还可以考虑删除导致此问题的驱动程序。

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

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