DeferredRequestCompleted rule (kmdf)
The DeferredRequestCompleted rule specifies that if an I/O request presented to a driver's default I/O queue is not completed in the callback function but is deferred for later processing, the request must be completed in a deferred processing callback function, unless the request is forwarded and delivered to the framework, or unless the WdfRequestStopAcknowledge method is called.
The DeferredRequestCompleted rule requires that you identify the deferred requests using the __sdv_save_request and __sdv_retrieve_request macros. For information about how to use these macros, see Using __sdv_save_request and __sdv_retrieve_request for Deferred Procedure Calls. The precondition rule AliasWithinTimerDpc checks for the presence of these macros.
A request presented to the driver's default queue through one of the queue callback functions and deferred, must be completed before it exits from the I/O request callback functions, except in the following cases:
The I/O request was forwarded to an I/O target or to another queue
The I/O request was delivered to the framework (by calling WdfDeviceEnqueueRequest)
The WdfRequestStopAcknowledge method was called
The rule is verified when the driver exits from the following callback functions:
EvtIoStop, EvtCleanupCallback or EvtDestroyCallback for the queue
EvtCleanupCallback or EvtDestroyCallback for the file object
EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback or EvtDestroyCallback for the device
The I/O queue callback functions for the I/O request presentation are EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl, and EvtIoInternalDeviceControl.
The deferred processing callback functions for an I/O request are EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable, and EvtWorkItem.
The DeferredRequestCompleted rule uses calls to the WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize, or WdfWorkItemEnqueue methods to indicate that the I/O request is being deferred.
How to test
|At compile time|
Run Static Driver Verifier and specify the DeferredRequestCompleted rule.Use the following steps to run an analysis of your code:
For more information, see Using Static Driver Verifier to Find Defects in Drivers.
WdfDeviceEnqueueRequest WdfDmaTransactionInitialize WdfDmaTransactionInitializeUsingRequest WdfIoTargetSendInternalIoctlOthersSynchronously WdfIoTargetSendInternalIoctlSynchronously WdfIoTargetSendIoctlSynchronously WdfIoTargetSendReadSynchronously WdfIoTargetSendWriteSynchronously WdfRequestComplete WdfRequestCompleteWithInformation WdfRequestCompleteWithPriorityBoost WdfRequestForwardToIoQueue WdfRequestMarkCancelable WdfRequestMarkCancelableEx WdfRequestSend WdfRequestStopAcknowledge WdfRequestUnmarkCancelable WdfWorkItemEnqueue