Bug Check 0xE6: DRIVER_VERIFIER_DMA_VIOLATION

The DRIVER_VERIFIER_DMA_VIOLATION bug check has a value of 0x000000E6. This is the bug check code for all Driver Verifier DMA Verification violations.

Important

This article is for programmers. If you're a customer who has received a blue screen error code while using your computer, see Troubleshoot blue screen errors.

Note

The E6 major bugcheck code can be observed when Driver Verifier is not enabled. Please see the DMA Verification page for more information if you are experiencing this code without Driver Verifier enabled.

DRIVER_VERIFIER_DMA_VIOLATION Parameters

Parameter 1 is the only parameter of interest. This parameter identifies the exact violation. If a debugger is attached, an informative message is displayed in the debugger.

Parameter 1 Cause of Error and Debugger Message

0x00 - Miscellaneous DMA error.

This code can represent two kinds of errors as indicated by parameter 2:

0x1 - The driver tried to flush too many bytes to the end of the map register file.

Parameter 3 - Number of bytes left in the MDL.

Parameter 4 - Number of bytes left requested to be flushed.

0x2 - Windows has run out of contiguous map registers.

Parameter 3 - Map registers needed.

Parameter 4 - Number of contiguous map registers.

0x01

The performance counter has decreased. The old and new values of the counter are displayed.

0x02

The performance counter has increased too fast. The counter value is displayed in the debugger.

0x03

The driver freed too many DMA common buffers. Usually this means it freed the same buffer two times.

Parameter 2 - Number of extra common buffers freed.

0x04

The driver freed too many DMA adapter channels. Usually this means it freed the same adapter channel two times.

Parameter 2 - Number of extra adapter channels freed.

0x05

The driver freed too many DMA map registers. Usually this means it freed the same map register two times.

Parameter 2 - Number of extra map registers freed.

0x06

The driver freed too many DMA scatter/gather lists. Usually this means it freed the same scatter/gather list two times.

Parameter 2 - Allocated scatter-gather lists.

Parameter 3 - Freed scatter-gather lists.

0x07

The driver tried to release the adapter without first freeing all its common buffers.

Parameter 2 - Pointer to the DMA adapter.

Parameter 3 - Number of outstanding common buffers.

Parameter 4 - Pointer to the corresponding internal verifier data.

0x08

The driver tried to release the adapter without first freeing all adapter channels, common buffers, or scatter/gather lists.

Parameter 2 - Pointer to the DMA adapter.

Parameter 3 - Number of outstanding adapter channels.

Parameter 4 - Pointer to the corresponding internal verifier data.

0x09

The driver tried to release the adapter without first freeing all map registers.

Parameter 2 - Pointer to the DMA adapter.

Parameter 3 - Number of outstanding map registers.

Parameter 4 - Pointer to the corresponding internal verifier data.

0x0A

The driver tried to release the adapter without first freeing all its scatter/gather lists.

Parameter 2 - Pointer to the DMA adapter.

Parameter 3 - Number of outstanding scatter-gather lists.

Parameter 4 - Pointer to the corresponding internal verifier data.

0x0B

The driver has allocated too many adapter channels at the same time (Only one adapter channel is permitted per adapter.)

Parameter 2 - Outstanding adapter channels.

0x0C

The driver tried to allocate too many map registers at the same time.

Parameter 2 - Required map registers.

Parameter 3 - Maximum map registers.

0x0D

The driver did not flush its adapter buffers.

Parameter 2 - Number of bytes mapped.

Parameter 3 - Maximum number of bytes that can be mapped at a time.

0x0E

The driver tried a DMA transfer without locking the buffer. The buffer in question was in paged memory.

Parameter 2 - Address of the DMA buffer MDL.

0x0F

The driver or the hardware wrote outside its allocated DMA buffer. Parameter 2 is the Violation code.

0x01 : The tag before the DMA buffer has been modified.Expected tag is DmaVrfy0.

Parameter 3 - Buffer length.

Parameter 4 - Buffer start.

0x02 : The tag after the DMA buffer has been modified.

Expected tag is DmaVrfy0.

Parameter 3 - Buffer length.

Parameter 4 - Buffer start.

0x03 : Free map register was overwritten.

Parameter 3 - Corruption address. Expected fill pattern is 0x0F.

0x04 : Padding before the buffer has been incorrectly modified.

Parameter 3 - Buffer start. Expected padding is 0x0F.

Parameter 4 - Corruption address.

0x05 : Padding after the buffer has been incorrectly modified.

Parameter 3 - Buffer start.

Parameter 4 - Corruption address. Expected padding pattern is 0x0F.

0x10

The driver tried to free its map registers while some were still mapped.

Parameter 2 - Number of registers still mapped.

0x11

The driver has too many outstanding reference counts for the adapter.

Parameter 2 - Reference count.

Parameter 3 - Pointer to the DMA adapter.

Parameter 4 - Pointer to the corresponding internal verifier data.

0x13

The driver called a DMA routine at an improper IRQL. Parameter 2 is the Violation code.

0x01 : Current IRQL is different than expected.

Parameter 3 - Expected IRQL.

Parameter 4 - Current IRQL.

0x02 : Current IRQL is higher than expected.

Parameter 3 - Expected maximum IRQL.

Parameter 4 - Current IRQL.

0x14

The driver called a DMA routine at an improper IRQL.

0x15

The driver tried to allocate too many map registers.

Parameter 2 - Allocated map registers.

Parameter 3 - Maximum map registers.

0x16

The driver tried to flush a buffer that is not mapped.

Parameter 2 - Address in the system virtual space of the map register.

Parameter 3 - Pointer to the corresponding internal verifier data.

0x18

The driver tried a DMA operation by using an adapter that was already released and no longer exists.

Parameter 2 - Pointer to the DMA adapter.

Parameter 3 - Pointer to the corresponding internal verifier data.

0x19

The driver passed a null DMA_ADAPTER value to a HAL routine.

0x1B

The driver passed an address and MDL to a HAL routine. However, this address is not within the bounds of this MDL.

Parameter 2 - Virtual address that is out of MDL bounds.

Parameter 3 - MDL.

0x1D

The driver tried to map an address range that was already mapped.

Parameter 2 - Buffer to map start.

Parameter 3 - Buffer to map end.

Parameter 4 - System address in buffer that is already mapped.

0x1E

The driver called HalGetAdapter. This function is obsolete -- you must use IoGetDmaAdapter instead.

0x1F

Invalid DMA buffer. The driver referenced an invalid system address -- either before the first MDL, or after the end of the first MDL, or by using a transfer length that is longer than the MDL buffer and crosses a page boundary within the MDL.Parameter 2 is the Violation code.

0x01 : Virtual buffer address is before the first MDL.

Parameter 3 - Virtual address of the start of the DMA buffer.

Parameter 4 - Pointer to the first MDL describing the DMA buffer.

0x02 : Virtual address is after the first MDL.

Parameter 3 - Virtual address of the start of the DMA buffer.

Parameter 4 - Pointer to the first MDL describing the DMA buffer.

0x03 : Extra transfer length crosses a page boundary.

Parameter 3 - Pointer to the MDL describing the DMA buffer.

Parameter 4 - Length of the DMA transfer.

0x04 : Virtual address of a DMA buffer is not cache aligned.

Parameter 3 - Virtual address of the start of the DMA buffer.

Parameter 4 - Pointer to MDL describing the DMA buffer.

0x05 : DMA buffer length is not cache aligned.

Parameter 3 - Length of the DMA buffer.

Parameter 4 - Pointer to MDL describing the DMA buffer.

0x20

The driver tried to flush a map register that hasn't been mapped.

Parameter 2 - Map register base.

Parameter 3 - The VA of the start of the DMA buffer.

Parameter 4 - Pointer to the MDL used to describe the DMA buffer.

0x21

The driver tried to map a zero-length buffer for transfer.

Parameter 2 - Pointer to the corresponding internal verifier data.

0x22

DMA buffer not mapped in system VA.

Parameter 2 - MDL

0x23

Cannot flush a channel that hasn't been completed or cancelled.

Parameter 2 - Violation code.

Value: 0x00 : Illegal channel flush

Parameter 3 - Controller Id.

Parameter 4 - Channel Number.

0x24

Insufficient buffer for requested length.

Parameter 2 - Unaccounted length.

0x25

Unknown device description version.

0x26

IOMMU detected DMA violation.

Parameter 2 - Device Object of faulting device.

Parameter 3 - Faulting information (usually faulting physical address).

Parameter 4 - Fault type (hardware specific).

Cause

See the description of each code in the Parameters section for a description of the cause.

Resolution

This bug check can only occur when Driver Verifier has been instructed to monitor one or more drivers. If you did not intend to use Driver Verifier, you should deactivate it. You might also consider removing the driver that caused this problem.

If you are the driver writer, use the information obtained through this bug check to fix the bugs in your code.

For more information on Driver Verifier, see Driver Verifier.