Debugging Tools for Windows |
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.
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. |
See the description of each code in the Parameters section for a description of the cause.
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.