Regla DeferredRequestCompleted (kmdf)
La regla DeferredRequestCompleted especifica que si una solicitud de E/S presentada a la cola de E/S predeterminada de un controlador no se completa en la función de devolución de llamada, pero se aplaza para su procesamiento posterior, la solicitud debe completarse en una función de devolución de llamada de procesamiento diferida, a menos que se reenvíe y entregue la solicitud al marco, o a menos que se llame al método WdfRequestStopAcknowledge .
La regla DeferredRequestCompleted requiere que identifique las solicitudes diferidas mediante las macros __sdv_save_request y __sdv_retrieve_request . Para obtener información sobre cómo usar estas macros, vea Uso de __sdv_save_request y __sdv_retrieve_request para llamadas a procedimiento diferido. La regla de condición previa AliasWithinTimerDpc comprueba la presencia de estas macros.
Una solicitud presentada a la cola predeterminada del controlador a través de una de las funciones de devolución de llamada de cola y diferida debe completarse antes de salir de las funciones de devolución de llamada de solicitud de E/S, excepto en los casos siguientes:
La solicitud de E/S se reenvía a un destino de E/S o a otra cola.
La solicitud de E/S se entregó al marco (llamando a WdfDeviceEnqueueRequest).
Se llamó al método WdfRequestStopAcknowledge .
La regla se comprueba cuando el controlador sale de las siguientes funciones de devolución de llamada:
EvtIoStop, EvtCleanupCallback o EvtDestroyCallback para la cola
EvtCleanupCallback o EvtDestroyCallback para el objeto de archivo
EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback o EvtDestroyCallback para el dispositivo
EvtDriverUnload
Las funciones de devolución de llamada de cola de E/S para la presentación de solicitudes de E/S son EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl y EvtIoInternalDeviceControl.
Las funciones de devolución de llamada de procesamiento diferido para una solicitud de E/S son EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable y EvtWorkItem.
La regla DeferredRequestCompleted usa llamadas a los métodos WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize o WdfWorkItemEnqueue para indicar que la solicitud de E/S se está aplazando.
Modelo de controlador: KMDF
Cómo probar
En tiempo de compilación |
---|
Ejecute el comprobador de controladores estáticos y especifique la regla DeferredRequestCompleted . Usa los pasos siguientes para ejecutar un análisis de tu código:
Para obtener más información, consulte Uso del comprobador de controladores estáticos para buscar defectos en controladores. |
Se aplica a
WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctlWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue