Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
[Si applica solo a KMDF]
Se il driver deve intercettare un pacchetto di richiesta di I/O prima o dopo che il framework gestisce l'IRP, il driver può chiamare WdfDeviceInitAssignWdmIrpPreprocessCallback per registrare una funzione di callback degli eventi EvtDeviceWdmIrpPreprocess per un codice funzione di I/O principale e, facoltativamente, per codici di funzione di I/O secondari specifici associati al codice principale. Successivamente, il framework chiama la funzione di callback EvtDeviceWdmIrpPreprocess del driver ogni volta che il driver riceve un IRP che contiene un codice di funzione principale e secondario specificato.
La funzione di callback EvtDeviceWdmIrpPreprocess può eseguire qualsiasi operazione necessaria per pre-elaborare l'IRP e quindi deve chiamare WdfDeviceWdmDispatchPreprocessedIrp per restituire l'IRP al framework a meno che il driver non gestisca un IRP non supportato dal framework.
Dopo che il driver chiama WdfDeviceWdmDispatchPreprocessedIrp, il framework elabora l'IRP nello stesso modo in cui avrebbe avuto se il driver non avesse fornito una funzione di callback EvtDeviceWdmIrpPreprocess . Se il codice della funzione I/O di IRP è uno che il framework passa ai driver, il driver riceverà nuovamente l'IRP come oggetto richiesta.
Se il driver deve post-elaborare l'IRP dopo che un driver di livello inferiore completa l'IRP, la funzione di callback EvtDeviceWdmIrpPreprocess del driver può chiamare IoSetCompletionRoutine per impostare una routine IoCompletion prima di chiamare WdfDeviceWdmDispatchPreprocessedIrp.
Dopo che il driver chiama WdfDeviceInitAssignWdmIrpPreprocessCallback, il framework fa in modo che il gestore di I/O aggiunga una posizione nello stack I/O aggiuntiva a tutti gli IRP, affinché la funzione di callback EvtDeviceWdmIrpPreprocess possa impostare una routine IoCompletion. La funzione di callback deve aggiornare il puntatore della posizione dello stack I/O dell'IRP prima di effettuare la chiamata a WdfDeviceWdmDispatchPreprocessedIrp.
Chiamata a WdfDeviceWdmDispatchPreprocessedIrp
Poiché il gestore di I/O aggiunge una posizione aggiuntiva dello stack I/O all'IRP, la funzione di callback EvtDeviceWdmIrpPreprocess deve chiamare IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext (per configurare la posizione successiva dello stack I/O in IRP) prima di chiamare WdfDeviceWdmDispatchPreprocessedIrp.
Se il driver esegue la pre-elaborazione di un IRP, ma non esegue la post-elaborazione di IRP, il driver non deve impostare una routine IoCompletion per IRP e può chiamare IoSkipCurrentIrpStackLocation, come illustrato nell'esempio di codice seguente.
NTSTATUS
EvtDeviceMyIrpPreprocess(
IN WDFDEVICE Device,
IN OUT PIRP Irp
)
{
//
// Perform IRP preprocessing operations here.
//
...
//
// Deliver the IRP back to the framework.
//
IoSkipCurrentIrpStackLocation(Irp);
return WdfDeviceWdmDispatchPreprocessedIrp(Device, Irp);
}
Se il driver esegue la post-elaborazione dell'IRP, il driver deve chiamare IoCopyCurrentIrpStackLocationToNext e quindi deve chiamare IoSetCompletionRoutine per impostare una routine IoCompletion per l'IRP , come illustrato nell'esempio di codice seguente.
NTSTATUS
EvtDeviceMyIrpPreprocess(
IN WDFDEVICE Device,
IN OUT PIRP Irp
)
{
//
// Perform IRP preprocessing operations here, if needed.
//
...
//
// Set a completion routine and deliver the IRP back to
// the framework.
//
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(
Irp,
MyIrpCompletionRoutine,
NULL,
TRUE,
TRUE,
TRUE
);
return WdfDeviceWdmDispatchPreprocessedIrp(Device, Irp);
}
Il driver non deve chiamare IoCopyCurrentIrpStackLocationToNext (e pertanto non deve impostare una routine IoCompletion) se l'oggetto dispositivo gestito dalla funzione di callback EvtDeviceWdmIrpPreprocess del driver rappresenta un oggetto dispositivo fisico (PDO) e se il codice della funzione principale di IRP è IRP_MJ_PNP o IRP_MJ_POWER. In caso contrario, Driver Verifier segnala un errore.
Per ulteriori informazioni su quando chiamare IoCopyCurrentIrpStackLocationToNext, IoSkipCurrentIrpStackLocation e IoSetCompletionRoutine, vedere Trasmissione di IRP nello stack dei driver.