Bug Check 0xC9: DRIVER_VERIFIER_IOMANAGER_VIOLATION
The DRIVER_VERIFIER_IOMANAGER_VIOLATION bug check has a value of 0x000000C9. This is the bug check code for all Driver Verifier I/O 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.
DRIVER_VERIFIER_IOMANAGER_VIOLATION Parameters
When Driver Verifier is active and I/O Verification is selected, various I/O violations will cause this bug check to be issued. Parameter 1 identifies the type of violation.
Parameter 1 | Parameter 2 | Parameter 3 | Parameter 4 | Cause of Error |
---|---|---|---|---|
0x01 |
Address of IRP being freed |
0 |
0 |
The driver attempted to free an object whose type is not IO_TYPE_IRP. |
0x02 |
Address of IRP being freed |
0 |
0 |
The driver attempted to free an IRP that is still associated with a thread. |
0x03 |
Address of IRP being sent |
0 |
0 |
The driver passed IoCallDriver an IRP Type not equal to IRP_TYPE. |
0x04 |
Address of device object |
0 |
0 |
The driver passed IoCallDriver an invalid device object. |
0x05 |
Address of device object associated with offending driver |
IRQL before IoCallDriver |
IRQL after IoCallDriver |
The IRQL changed during a call to the driver dispatch routine. |
0x06 |
IRP status |
Address of IRP being completed |
0 |
The driver called IoCompleteRequest with a status marked as pending (or equal to -1). |
0x07 |
Address of cancel routine |
Address of IRP being completed |
0 |
The driver called IoCompleteRequest while its cancel routine was still set. |
0x08 |
Address of device object |
IRP major function code |
Exception status code |
The driver passed IoBuildAsynchronousFsdRequest an invalid buffer. |
0x09 |
Address of device object |
I/O control code |
Exception status code |
The driver passed IoBuildDeviceIoControlRequest an invalid buffer. |
0x10 |
Current IRQL |
Reserved |
Reserved |
IoCallDriver was called above DISPATCH_LEVEL. |
0x11 |
Driver fast I/O dispatch routine address |
IRQL before calling driver dispatch routine |
Current IRQL |
IoCallDriver was called above DISPATCH_LEVEL. |
0x12 |
Driver dispatch routine address |
IRQL before calling driver dispatch routine |
Current IRQL |
IoCallDriver was called above DISPATCH_LEVEL. |
0x0A |
Address of device object |
0 |
0 |
The driver passed IoInitializeTimer a device object with an already-initialized timer. |
0x0C |
Address of I/O status block |
0 |
0 |
The driver passed an I/O status block to an IRP, but this block is allocated on a stack which has already unwound past that point. |
0x0D |
Address of user event object |
0 |
0 |
The driver passed a user event to an IRP, but this event is allocated on a stack which has already unwound past that point. |
0x0E |
Current IRQL |
Address of IRP |
0 |
The driver called IoCompleteRequest with IRQL > DISPATCH_LEVEL. |
0x0F |
Address of the device object to which the IRP is being sent |
Pointer to the IRP |
Pointer to file object |
The driver sent a create request with a file object that has been closed, or that had its open canceled. |
In addition to the errors mentioned in the previous table, there are a number of I/O Verification errors that will cause Driver Verifier to halt the system, but which are not actually bug checks.
These errors cause messages to be displayed on the blue screen, in a crash dump file, and in a kernel debugger. These messages will appear differently in each of these locations. When these errors occur, the hexadecimal bug check code 0xC9 and the bug check string DRIVER_VERIFIER_IOMANAGER_VIOLATION do not appear on the blue screen or in the debugger, although they will appear in a crash dump file.
On the blue screen, the following data will be displayed:
The message IO SYSTEM VERIFICATION ERROR.
The message WDM DRIVER ERROR XXX, where XXX is a hexadecimal code representing the specific error. (See the table below for a list of the I/O error codes and their meanings.)
The name of the driver which caused the error.
Typically, the address in the driver's code where the error was detected (Parameter 2).
If a kernel-mode crash dump has been enabled, the following information will appear in the crash dump file:
The message BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION).
The hexadecimal I/O error code. (See the table below for a list of the I/O error codes and their meanings.)
Typically, the address in the driver's code where the error was detected (Parameter 2).
If a kernel debugger is attached to the system which has caused this violation, the following information will be sent to the debugger:
The message WDM DRIVER ERROR, along with an assessment of the severity of the error.
The name of the driver which caused the error.
A descriptive string which explains the cause of this error. Often additional information is passed along, such as a pointer to the IRP or a pointer to the device object or IRQL information. (See the table below for a list of these descriptive strings and what additional information is specified.)
A query for further action. Possible responses are b (break), i (ignore), z (zap), r (remove), or d (disable). Instructing the operating system to continue allows you to see what would happen "down the line" if this error had not occurred. Of course, this often will lead to additional bug checks. The "zap" option will actually remove the breakpoint that caused this error to be discovered.
Note No other bug checks can be ignored in this manner. Only this kind of I/O Verification errors can be ignored, and even these errors can only be ignored if a kernel debugger is attached.
The following table lists those I/O Verification errors that can appear.
I/O Error Code | Severity | Cause of Error |
---|---|---|
0x200 |
Unknown |
This code covers all unknown I/O Verification errors. |
0x201 |
Fatal error |
A device is deleting itself while there is another device beneath it in the driver stack. This may be because the caller has forgotten to call IoDetachDevice first, or the lower driver may have incorrectly deleted itself. Param 2 - The address in the driver's code where the error was detected. |
0x202 |
Fatal error |
A driver has attempted to detach from a device object that is not attached to anything. This may occur if detach was called twice on the same device object. Param 2 - The address in the driver's code where the error was detected. Param 3 - Device object address. |
0x203 |
Fatal error |
A driver has called IoCallDriver without setting the cancel routine in the IRP to NULL. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x204 |
Fatal error |
The caller has passed in NULL as a device object. This is fatal. Param 2 - Reserved Param 3 - Reserved |
0x205 |
Fatal error |
The caller is forwarding an IRP that is currently queued beneath it. The code handling IRPs returning STATUS_PENDING in this driver appears to be broken. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x206 |
Fatal error |
The caller has incorrectly forwarded an IRP (control field not zeroed). The driver should use IoCopyCurrentIrpStackLocationToNext or IoSkipCurrentIrpStackLocation. Param 2 - Reserved Param 3 - Reserved |
0x207 |
Fatal error |
The caller has manually copied the stack and has inadvertently copied the upper layer's completion routine. The driver should use IoCopyCurrentIrpStackLocationToNext. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x208 |
Fatal error |
This IRP is about to run out of stack locations. Someone may have forwarded this IRP from another stack. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x209 |
Fatal error |
The caller is completing an IRP that is currently queued beneath it. The code handling IRPs returning STATUS_PENDING in this driver appears to be broken. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x20A |
Fatal error |
The caller of IoFreeIrp is freeing an IRP that is still in use. Param 2 - Reserved Param 3 - Reserved |
0x20B |
Fatal error |
The caller of IoFreeIrp is freeing an IRP that is still in use. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x20C |
Fatal error |
The caller of IoFreeIrp is freeing an IRP that is still queued against a thread. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x20D |
Fatal error |
The caller of IoInitializeIrp has passed an IRP that was allocated with IoAllocateIrp. This is illegal and unnecessary, and has caused a quota leak. Check the documentation for IoReuseIrp if this IRP is being recycled. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x20E |
Non-fatal error |
A PNP IRP has an invalid status. (Any PNP IRP must have its status initialized to STATUS_NOT_SUPPORTED.) Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x20F |
Non-fatal error |
A Power IRP has an invalid status. (Any Power IRP must have its status initialized to STATUS_NOT_SUPPORTED.) Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x210 |
Non-fatal error |
A WMI IRP has an invalid status. (Any WMI IRP must have its status initialized to STATUS_NOT_SUPPORTED.) Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x211 |
Non-fatal error |
The caller has forwarded an IRP while skipping a device object in the stack. The caller is probably sending IRPs to the PDO instead of to the device returned by IoAttachDeviceToDeviceStack. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x212 |
Non-fatal error |
The caller has trashed or has not properly copied the IRP's stack. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x213 |
Non-fatal error |
The caller has changed the status field of an IRP it does not understand. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x214 |
Non-fatal error |
The caller has changed the information field of an IRP it does not understand. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x215 |
Non-fatal error |
A non-successful non-STATUS_NOT_SUPPORTED IRP status for IRP_MJ_PNP is being passed down stack. Failed PNP IRPs must be completed. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x216 |
Non-fatal error |
The previously-set IRP_MJ_PNP status has been converted to STATUS_NOT_SUPPORTED. This failure status is reserved for use by the operating system. Drivers cannot fail a PnP IRP with this value. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x217 |
Non-fatal error |
The driver has not handled a required IRP. The driver must update the status of the IRP to indicate whether or not it has been handled. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x218 |
Non-fatal error |
The driver has responded to an IRP that is reserved for other device objects elsewhere in the stack. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x219 |
Non-fatal error |
A non-successful non-STATUS_NOT_SUPPORTED IRP status for IRP_MJ_POWER is being passed down stack. Failed POWER IRPs must be completed. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x21A |
Non-fatal error |
The previously-set IRP_MJ_POWER status has been converted to STATUS_NOT_SUPPORTED. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x21B |
Non-fatal error |
A driver has returned a suspicious status. This is probably due to an uninitialized variable bug in the driver. Param 3 - IRP address. |
0x21C |
Warning |
The caller has copied the IRP stack but not set a completion routine. This is inefficient -- use IoSkipCurrentIrpStackLocation instead. Param 2 - Reserved Param 3 - Reserved |
0x21D |
Fatal error |
An IRP dispatch handler has not properly detached from the stack below it upon receiving a remove IRP. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x21E |
Fatal error |
An IRP dispatch handler has not properly deleted its device object upon receiving a remove IRP. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x21F |
Non-fatal error |
A driver has not filled out a dispatch routine for a required IRP major function. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x220 |
Non-fatal error |
IRP_MJ_SYSTEM_CONTROL has been completed by someone other than the ProviderId. This IRP should either have been completed earlier or should have been passed down. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - ProviderId. |
0x221 |
Fatal error |
An IRP dispatch handler for a PDO has deleted its device object, but the hardware has not been reported as missing in a bus relations query. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x222 |
Fatal error |
A Bus Filter's IRP dispatch handler has detached upon receiving a remove IRP when the PDO is still alive. Bus Filters must clean up in FastIoDetach callbacks. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x223 |
Fatal error |
An IRP dispatch handler for a bus filter has deleted its device object, but the PDO is still present. Bus filters must clean up in FastIoDetach callbacks. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x224 |
Fatal error |
An IRP dispatch handler has returned a status that is inconsistent with the IRP's IoStatus.Status field. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Expected status code. |
0x225 |
Non-fatal error |
An IRP dispatch handler has returned a status that is illegal (0xFFFFFFFF). This is probably due to an uninitialized stack variable. To debug this error, use the ln (List Nearest Symbols) command with the specified address. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Status code. |
0x226 |
Fatal error |
An IRP dispatch handler has returned without passing down or completing this IRP, or someone forgot to return STATUS_PENDING. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x227 |
Fatal error |
An IRP completion routine is in pageable code. (This is never permitted.) Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x228 |
Non-fatal error |
A driver's completion routine has not marked the IRP pending if the PendingReturned field was set in the IRP passed to it. This may cause Windows to hang, especially if an error is returned by the stack. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x229 |
Fatal error |
A cancel routine has been set for an IRP that is currently being processed by drivers lower in the stack, possibly stomping their cancel routine. Param 2 - Reserved. Param 3 - Reserved. |
0x22A |
Non-fatal error |
The physical device object (PDO) has not responded to a required IRP. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x22B |
Non-fatal error |
The physical device object (PDO) has forgotten to fill out the device relation list with the PDO for the TargetDeviceRelation query. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x22C |
Fatal error |
The code implementing the TargetDeviceRelation query has not called ObReferenceObject on the PDO. Param 2 - Reserved. Param 3 - Reserved. |
0x22D |
Non-fatal error |
The caller has completed a IRP_MJ_PNP it didn't understand instead of passing it down. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x22E |
Non-fatal error |
The caller has completed a successful IRP_MJ_PNP instead of passing it down. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x22F |
Non-fatal error |
The caller has completed an untouched IRP_MJ_PNP (instead of passing the IRP down), or non-PDO has failed the IRP using illegal value of STATUS_NOT_SUPPORTED. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x230 |
Non-fatal error |
The caller has completed an IRP_MJ_POWER it didn't understand instead of passing it down. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x231 |
Fatal error |
The caller has completed a successful IRP_MJ_POWER instead of passing it down. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x232 |
Non-fatal error |
The caller has completed an untouched IRP_MJ_POWER (instead of passing the IRP down), or non-PDO has failed the IRP using illegal value of STATUS_NOT_SUPPORTED. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x233 |
Non-fatal error |
The version field of the query capabilities structure in a query capabilities IRP was not properly initialized. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x234 |
Non-fatal error |
The size field of the query capabilities structure in a query capabilities IRP was not properly initialized. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x235 |
Non-fatal error |
The address field of the query capabilities structure in a query capabilities IRP was not properly initialized to -1. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x236 |
Non-fatal error |
The UI Number field of the query capabilities structure in a query capabilities IRP was not properly initialized to -1. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x237 |
Fatal error |
A driver has sent an IRP that is restricted for system use only. Param 2 - Reserved. Param 3 - Reserved. |
0x238 |
Warning |
The caller of IoInitializeIrp has passed an IRP that was allocated with IoAllocateIrp. This is illegal, unnecessary, and negatively impacts performance in normal use. If this IRP is being recycled, see IoReuseIrp in the Windows Driver Kit. Param 2 - Reserved. Param 3 - Reserved. |
0x239 |
Warning |
The caller of IoCompleteRequest is completing an IRP that has never been forwarded via a call to IoCallDriver or PoCallDriver. This may be a bug. Param 2 - Reserved. Param 3 - Reserved. |
0x23A |
Fatal error |
A driver has forwarded an IRP at an IRQL that is illegal for this major code. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x23B |
Non-fatal error |
The caller has changed the status field of an IRP it does not understand. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
The following table lists additional I/O Verification errors that can appear. These errors appear when Enhanced I/O Verification is activated. For more information, see Enhanced I/O Verification.
I/O Error Code | Severity | Cause of Error |
---|---|---|
0x23C |
Fatal error |
A driver has completed an IRP without setting the cancel routine in the IRP to NULL. Param 2 - Reserved. Param 3 - Reserved. |
0x23D |
Non-fatal error |
A driver has returned STATUS_PENDING but did not mark the IRP pending via a call to IoMarkIrpPending. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Status code. |
0x23E |
Non-fatal error |
A driver has marked an IRP pending but didn't return STATUS_PENDING. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Status code. |
0x23F |
Fatal error |
A driver has not inherited the DO_POWER_PAGABLE bit from the stack it has attached to. Param 2 - Reserved. Param 3 - Reserved. |
0x240 |
Fatal error |
A driver is attempting to delete a device object that has already been deleted via a prior call to IoDeleteDevice. Param 2 - The address in the driver's code where the error was detected. Param 2 - Reserved. Param 3 - Reserved. |
0x241 |
Fatal error |
A driver has detached its device object during a surprise remove IRP. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x242 |
Fatal error |
A driver has deleted its device object during a surprise remove IRP. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x243 |
Fatal error |
A driver has failed to clear the DO_DEVICE_INITIALIZING flag at the end of AddDevice. Param 2 - Reserved. Param 3 - Reserved. Param 4 - |
0x244 |
Fatal error |
A driver has not copied either the DO_BUFFERED_IO or the DO_DIRECT_IO flag from the device object it is attaching to. Param 2 - Reserved. Param 3 - Reserved. |
0x245 |
Fatal error |
A driver has set both the DO_BUFFERED_IO and the DO_DIRECT_IO flags. These flags are mutually exclusive. Param 2 - Reserved. Param 3 - Reserved. |
0x246 |
Fatal error |
A driver has failed to copy the DeviceType field from the device object it is attaching to. Param 2 - Reserved. Param 3 - Reserved. |
0x247 |
Fatal error Param 2 - Reserved. Param 3 - Reserved. |
A driver has failed an IRP that cannot legally be failed. |
0x248 |
Fatal error |
A driver has added a device object that is not a PDO to a device relations query. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x249 |
Non-fatal error |
A driver has enumerated two child PDOs that returned identical Device IDs. Param 2 - The address in the driver's code where the error was detected. Param 3 - First device object address. Param 4 - Second device object address. |
0x24A |
Fatal error |
A driver has mistakenly called a file I/O function with IRQL not equal to PASSIVE_LEVEL. Param 2 - The address in the driver's code where the error was detected. Param 3 - Reserved. Param 4 - Reserved. |
0x24B |
Fatal error |
A driver has completed an IRP_MN_QUERY_DEVICE_RELATIONS request of type TargetDeviceRelation as successful, but did not properly fill out the request or forward the IRP to the underlying hardware stack. Param 2 - The address in the driver's code where the error was detected. Param 3 - Device object address. |
0x24C |
Non-fatal error |
A driver has returned STATUS_PENDING but did not mark the IRP pending by a call to IoMarkIrpPending. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Status code. |
0x24D |
Fatal error |
A driver has passed an invalid device object to a function that requires a PDO. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Device object address. |
0x300 |
Non-fatal error |
A driver has returned a suspicious status. This is probably due to an uninitialized variable bug in the driver. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Suspicious status code. |
0x301 |
Non-fatal error |
A driver has forwarded an IRP at IRQL > DISPATCH_LEVEL. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Incorrect IRQL value |
0x302 |
Non-fatal error |
A driver has forwarded an IRP at IRQL > = APC_LEVEL. The I/O Manager will need to queue an APC to complete this request. The APC will not be able to run because the caller is already at APC level, so the caller is likely to deadlock. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. Param 4 - Incorrect IRQL value. |
0x306 |
Non-fatal error |
The driver is completing an IRP_MJ_PNP (major) and IRP_MN_REMOVE_DEVICE (minor) request with a failure status code. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x307 |
Non-fatal error |
The driver issued an I/O request with an event that was already signaled and received a STATUS_PENDING response. This can result in unwinding before the I/O is complete. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x310 |
Non-fatal error |
The driver is reinitializing an IRP that is still in use. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x311 |
Non-fatal error |
The driver is reinitializing an IRP that was created with IoMakeAssociatedIrp, IoBuildAsynchronousFsdRequest, IoBuildSynchronousFsdRequest, IoBuildDeviceIoControlRequest. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
0x312 |
Non-fatal error |
The caller provided the IRP Status Information field with a value that is greater than the output section of the system buffer. Param 2 - The address in the driver's code where the error was detected. Param 3 - IRP address. |
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. For more information, see "How to control Driver Verifier" in Driver Verifier. You might consider updating or removing the driver which caused this problem as well.
If you are the driver developer, use the information obtained through this bug check to fix the bugs in your code.
For full details on Driver Verifier, see Driver Verifier.