Règle DeferredRequestCompleted (kmdf)
La règle DeferredRequestCompleted spécifie que si une demande d’E/S présentée à la file d’attente d’E/S par défaut d’un pilote n’est pas terminée dans la fonction de rappel, mais est différée pour un traitement ultérieur, la demande doit être effectuée dans une fonction de rappel de traitement différé, sauf si la demande est transférée et remise à l’infrastructure, ou si la méthode WdfRequestStopAcknowledge est appelée.
La règle DeferredRequestCompleted vous oblige à identifier les demandes différées à l’aide des macros __sdv_save_request et __sdv_retrieve_request . Pour plus d’informations sur l’utilisation de ces macros, consultez Utilisation de __sdv_save_request et __sdv_retrieve_request pour les appels de procédure différée. La règle de condition préalable AliasWithinTimerDpc vérifie la présence de ces macros.
Une demande présentée à la file d’attente par défaut du pilote via l’une des fonctions de rappel de file d’attente et différée doit être effectuée avant de quitter les fonctions de rappel de demande d’E/S, sauf dans les cas suivants :
La demande d’E/S a été transférée à une cible d’E/S ou à une autre file d’attente
La demande d’E/S a été remise au framework (en appelant WdfDeviceEnqueueRequest)
La méthode WdfRequestStopAcknowledge a été appelée
La règle est vérifiée lorsque le pilote quitte les fonctions de rappel suivantes :
EvtIoStop, EvtCleanupCallback ou EvtDestroyCallback pour la file d’attente
EvtCleanupCallback ou EvtDestroyCallback pour l’objet file
EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback ou EvtDestroyCallback pour l’appareil
EvtDriverUnload
Les fonctions de rappel de file d’attente d’E/S pour la présentation de la demande d’E/S sont EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl et EvtIoInternalDeviceControl.
Les fonctions de rappel de traitement différé pour une requête d’E/S sont EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable et EvtWorkItem.
La règle DeferredRequestCompleted utilise des appels aux méthodes WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize ou WdfWorkItemEnqueue pour indiquer que la demande d’E/S est différée.
Modèle de pilote : KMDF
Comment tester
Au moment de la compilation |
---|
Exécutez Static Driver Verifier et spécifiez la règle DeferredRequestCompleted . Utilisez les étapes suivantes pour exécuter l’analyse de votre code :
Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes. |
S’applique à
WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctlSynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue