DeferredRequestCompleted-Regel (kmdf)

Die DeferredRequestCompleted-Regel gibt an, dass die Anforderung in einer Rückruffunktion abgeschlossen werden muss, wenn eine E/A-Anforderung, die an die Standard-E/A-Warteschlange eines Treibers übermittelt wird, nicht in der Rückruffunktion für die verzögerte Verarbeitung abgeschlossen werden muss, es sei denn, die Anforderung wird weitergeleitet und an das Framework übermittelt, oder es sei denn, die WdfRequestStopAcknowledge-Methode wird aufgerufen.

Die DeferredRequestCompleted-Regel erfordert, dass Sie die verzögerten Anforderungen mithilfe der makros __sdv_save_request und __sdv_retrieve_request identifizieren. Informationen zur Verwendung dieser Makros finden Sie unter Verwenden von __sdv_save_request und __sdv_retrieve_request für verzögerte Prozeduraufrufe. Die Vorbedingungsregel AliasWithinTimerDpc überprüft, ob diese Makros vorhanden sind.

Eine Anforderung, die an die Standardwarteschlange des Treibers über eine der Warteschlangenrückruffunktionen vorgelegt und verzögert wird, muss abgeschlossen werden, bevor sie aus den E/A-Anforderungsrückruffunktionen beendet wird, außer in den folgenden Fällen:

  • Die E/A-Anforderung wurde an ein E/A-Ziel oder eine andere Warteschlange weitergeleitet.

  • Die E/A-Anforderung wurde an das Framework übermittelt (durch Aufrufen von WdfDeviceEnqueueRequest).

  • Die WdfRequestStopAcknowledge-Methode wurde aufgerufen.

Die Regel wird überprüft, wenn der Treiber die folgenden Rückruffunktionen verlässt:

  • EvtIoStop, EvtCleanupCallback oder EvtDestroyCallback für die Warteschlange

  • EvtCleanupCallback oder EvtDestroyCallback für das Dateiobjekt

  • EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback oder EvtDestroyCallback für das Gerät

  • EvtDriverUnload

Die E/A-Warteschlangenrückruffunktionen für die E/A-Anforderungspräsentation sind EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl und EvtIoInternalDeviceControl.

Die Rückruffunktionen für die verzögerte Verarbeitung für eine E/A-Anforderung sind EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable und EvtWorkItem.

Die DeferredRequestCompleted-Regel verwendet Aufrufe der Methoden WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize oder WdfWorkItemEnqueue , um anzugeben, dass die E/A-Anforderung verzögert wird.

Treibermodell: KMDF

So führen Sie einen Test durch

Beim Kompilieren:

Führen Sie static Driver Verifier aus, und geben Sie die DeferredRequestCompleted-Regel an .

Gehen Sie folgendermaßen vor, um Ihren Code zu analysieren:
  1. Bereiten Sie den Code vor (verwenden Sie Rollentypdeklarationen).
  2. Führen Sie Static Driver Verifier aus.
  3. Überprüfen und analysieren Sie die Ergebnisse.

Weitere Informationen finden Sie unter Verwenden der statischen Treiberüberprüfung, um Fehler in Treibern zu finden.

Gilt für:

WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronlyWdfIoTargetSendInternalIoctlSynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue