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:
Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers. |
Aplica-se a
WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctl SynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue