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.