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:
  1. Prepara el código (usa declaraciones de tipos de rol).
  2. Ejecuta el comprobador de controlador estático.
  3. Consulta y analiza los resultados.

Para obtener más información, consulte Uso del comprobador de controladores estáticos para buscar defectos en controladores.

Se aplica a

WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctlWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue