Regola deferredRequestCompleted (kmdf)

La regola DeferredRequestCompleted specifica che se una richiesta di I/O presentata alla coda I/O predefinita di un driver non viene completata nella funzione di callback, ma viene posticipata per l'elaborazione successiva, la richiesta deve essere completata in una funzione di callback di elaborazione posticipata, a meno che la richiesta non venga inoltrata e recapitata al framework o a meno che non venga chiamato il metodo WdfRequestStopAcknowledge .

La regola DeferredRequestCompleted richiede di identificare le richieste posticipate usando le macro __sdv_save_request e __sdv_retrieve_request . Per informazioni su come usare queste macro, vedere Uso di __sdv_save_request e __sdv_retrieve_request per chiamate di procedura posticipate. La regola di precondizione AliasWithinTimerDpc verifica la presenza di queste macro.

Una richiesta presentata alla coda predefinita del driver tramite una delle funzioni di callback della coda e posticipata, deve essere completata prima di uscire dalle funzioni di callback delle richieste di I/O, tranne nei casi seguenti:

  • La richiesta di I/O è stata inoltrata a una destinazione di I/O o a un'altra coda

  • La richiesta di I/O è stata recapitata al framework (chiamando WdfDeviceEnqueueRequest)

  • Il metodo WdfRequestStopAcknowledge è stato chiamato

La regola viene verificata quando il driver viene chiuso dalle funzioni di callback seguenti:

  • EvtIoStop, EvtCleanupCallback o EvtDestroyCallback per la coda

  • EvtCleanupCallback o EvtDestroyCallback per l'oggetto file

  • EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback o EvtDestroyCallback per il dispositivo

  • EvtDriverUnload

Le funzioni di callback della coda di I/O per la presentazione della richiesta di I/O sono EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl e EvtIoInternalDeviceControl.

Le funzioni di callback di elaborazione posticipata per una richiesta di I/O sono EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable e EvtWorkItem.

La regola DeferredRequestCompleted usa chiamate ai metodi WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize o WdfWorkItemEnqueue per indicare che la richiesta di I/O viene posticipata.

Modello di driver: KMDF

Come eseguire il test

In fase di compilazione

Eseguire il verifica driver statico e specificare la regola DeferredRequestCompleted .

Usa i passaggi descritti di seguito per eseguire un'analisi del codice:
  1. Prepara il codice (usa dichiarazioni di tipo ruolo).
  2. Esegui Driver Verifier statico.
  3. Visualizza e analizza i risultati.

Per altre informazioni, vedere Uso del verificatore driver statico per trovare i difetti nei driver.

Si applica a

WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctlSynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue