Debugging Tools for Windows

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.

Parameters

The following parameters are displayed on the blue screen. 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 This code can represent two kinds of errors:

1. The driver tried to flush too many bytes to the end of the map register file. The number of bytes permitted and the number of bytes attempted are displayed.

2. Windows has run out of contiguous map registers. The number of map registers needed and the largest block of contiguous map registers is displayed.

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.
0x04 The driver freed too many DMA adapter channels. Usually this means it freed the same adapter channel two times.
0x05 The driver freed too many DMA map registers. Usually this means it freed the same map register two times. The number of active map registers is displayed.
0x06 The driver freed too many DMA scatter/gather lists. Usually this means it freed the same scatter/gather list two times. The number of lists allocated and the number of lists freed is displayed.
0x07 The driver tried to release the adapter without first freeing all its common buffers. The adapter address and the number of remaining buffers is displayed.
0x08 The driver tried to release the adapter without first freeing all adapter channels, common buffers, or scatter/gather lists. The adapter address and the number of remaining items is displayed.
0x09 The driver tried to release the adapter without first freeing all map registers. The adapter address and the number of remaining map registers is displayed.
0x0A The driver tried to release the adapter without first freeing all its scatter/gather lists. The adapter address and the number of remaining scatter/gather lists is displayed.
0x0B HV_TOO_MANY_ADAPTER_CHANNELSThe driver has allocated too many adapter channels at the same time. . (Only one adapter channel is permitted per adapter.)
0x0C The driver tried to allocate too many map registers at the same time. The number requested and the number allowed are displayed.
0x0D The driver did not flush its adapter buffers. The number of bytes that the driver tried to map and the maximum number of bytes allowed are displayed.
0x0E The driver tried a DMA transfer without locking the buffer. The buffer in question was in paged memory. The address of the MDL is displayed.
0x0F The driver or the hardware wrote outside its allocated DMA buffer. The nature of the error (overrun or underrun) is displayed, as well as the relevant addresses.
0x10 The driver tried to free its map registers while some were still mapped. The number of map registers still mapped is displayed.
0x11 The driver has too many outstanding reference counts for the adapter. The number of reference counts and the adapter address are displayed.
0x13 The driver called a DMA routine at an improper IRQL. The required IRQL and the actual IRQL are displayed.
0x14 The driver called a DMA routine at an improper IRQL. The required IRQL and the actual IRQL are displayed.
0x15 The driver tried to allocate too many map registers. The number requested and the number allowed are displayed.
0x16 The driver tried to flush a buffer that is not mapped. The address of the buffer is displayed.
0x18 The driver tried a DMA operation by using an adapter that was already released and no longer exists. The adapter address is displayed.
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. The address passed and the address of the MDL are displayed.
0x1D The driver tried to map an address range that was already mapped. The address range and the current mapping for that range are displayed.
0x1E The driver called HalGetAdapter. This function is obsolete — you must use IoGetDmaAdapter instead.
0x1F HV_BAD_MDLThe 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. . Either the invalid address and the first MDL address, or the MDL address and the extra transfer length are displayed.
0x20 The driver tried to flush a map register that hasn't been mapped. The map register base, flushing address, and MDL are displayed.
0x21 The driver tried to map a zero-length buffer for transfer.

Cause

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

Resolving the Problem

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.

The Driver Verifier DMA Verification option is only available in Windows XP and later versions. For full details on Driver Verifier, see the Windows Driver Kit.

Build machine: CAPEBUILD