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:
Per altre informazioni, vedere Uso del verificatore driver statico per trovare i difetti nei driver. |
Si applica a
WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalIoctlOthersSynchronouslyWdfIoTargetSendInternalIoctlSynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue