Compartilhar via


Regra DeferredRequestCompleted (kmdf)

A regra DeferredRequestCompleted especifica que, se uma solicitação de E/S apresentada à fila de E/S padrão de um driver não for concluída na função de retorno de chamada, mas for adiada para processamento posterior, a solicitação deverá ser concluída em uma função de retorno de chamada de processamento adiada, a menos que a solicitação seja encaminhada e entregue à estrutura, ou a menos que o método WdfRequestStopAcknowledge seja chamado.

A regra DeferredRequestCompleted exige que você identifique as solicitações adiadas usando as macros __sdv_save_request e __sdv_retrieve_request . Para obter informações sobre como usar essas macros, consulte Usando __sdv_save_request e __sdv_retrieve_request para chamadas de procedimento adiado. A regra de pré-condição AliasWithinTimerDpc verifica a presença dessas macros.

Uma solicitação apresentada à fila padrão do driver por meio de uma das funções de retorno de chamada de fila e adiada deve ser concluída antes de sair das funções de retorno de chamada de solicitação de E/S, exceto nos seguintes casos:

  • A solicitação de E/S foi encaminhada para um destino de E/S ou para outra fila

  • A solicitação de E/S foi entregue à estrutura (chamando WdfDeviceEnqueueRequest)

  • O método WdfRequestStopAcknowledge foi chamado

A regra é verificada quando o driver sai das seguintes funções de retorno de chamada:

  • EvtIoStop, EvtCleanupCallback ou EvtDestroyCallback para a fila

  • EvtCleanupCallback ou EvtDestroyCallback para o objeto de arquivo

  • EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback ou EvtDestroyCallback para o dispositivo

  • EvtDriverUnload

As funções de retorno de chamada da fila de E/S para a apresentação de solicitação de E/S são EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl e EvtIoInternalDeviceControl.

As funções de retorno de chamada de processamento adiado para uma solicitação de E/S são EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable e EvtWorkItem.

A regra DeferredRequestCompleted usa chamadas para os métodos WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize ou WdfWorkItemEnqueue para indicar que a solicitação de E/S está sendo adiada.

Modelo de driver: KMDF

Como testar

Em tempo de compilação

Execute o Verificador de Driver Estático e especifique a regra DeferredRequestCompleted .

Use as seguintes etapas para executar uma análise do código:
  1. Prepare seu código (use declarações de tipo de função).
  2. Execute o Verificador de Driver Estático.
  3. Exiba e analise os resultados.

Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers.

Aplica-se a

WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctl SynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue