Partager via


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 :
  1. Préparez votre code (utilisez les déclarations de type).
  2. Exécutez le vérificateur de pilote statique.
  3. Affichez et analysez les résultats.

Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes.

S’applique à

WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctlSynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue