Invio di indirizzi IP a code di I/O
[Si applica a KMDF e UMDF]
Un driver basato su framework può specificare dinamicamente una coda di destinazione per un'IRP in ingresso. Per inviare un'IRP a una coda specifica, un driver deve chiamare il metodo WdfDeviceWdmDispatchIrpToIoQueue .
In genere, un driver chiama WdfDeviceWdmDispatchIrpToIoQueue dalla sua funzione di callback EvtDeviceWdmIrpPreprocess o EvtDeviceWdmIrpDispatch. Per prestazioni ottimali, la maggior parte dei driver non fornisce entrambe le funzioni di callback.
Nota Un driver UMDF può fornire una funzione di callback EvtDeviceWdmIrpDispatch , ma solo i driver KMDF possono fornire EvtDeviceWdmIrpPreprocess.
Se il driver fornisce già EvtDeviceWdmIrpPreprocess, è possibile usarlo per selezionare dinamicamente una coda. In caso contrario, specificare EvtDeviceWdmIrpDispatch e chiamare WdfDeviceWdmDispatchIrpToIoQueue dall'interno della funzione di callback.
Inoltre, è necessario tenere presente quanto segue:
Un metodo alternativo per l'invio di un'IRP a una coda di I/O consiste nel creare una coda predefinita e quindi dal gestore della coda, chiamare WdfRequestForwardToIoQueue. Questa tecnica è disponibile a partire da KMDF 1.0, ma non funziona bene con le code di avanzamento in avanti ed è in generale più lento. È consigliabile usare invece WdfDeviceWdmDispatchIrpToIoQueue .
Quando si chiama WdfDeviceConfigureWdmIrpDispatchCallback per registrare una funzione di callback EvtDeviceWdmIrpDispatch , il driver deve impostare il parametro MajorFunction su uno dei seguenti: IRP_MJ_DEVICE_CONTROL, IRP_MJ_INTERNAL_DEVICE_CONTROL, IRP_MJ_READ, IRP_MJ_WRITE. Anche se questo requisito non si applica a EvtDeviceWdmIrpPreprocess, solo gli IRP di questi tipi possono essere inviati dinamicamente alle code specificate.
I provider di integrazione che passano a EvtDeviceWdmIrpPreprocess hanno una posizione di stack aggiuntiva. Gli IRP che passano a EvtDeviceWdmIrpDispatch (senza una chiamata precedente di EvtDeviceWdmIrpPreprocess) non sono.
EvtDeviceWdmIrpPreprocess non facilita l'invio di informazioni di contesto definite dal driver, mentre EvtDeviceWdmIrpDispatch esegue.
Invio di IRP non pre-elaborati
Per inviare indirizzi IP da una funzione di callback EvtDeviceWdmIrpDispatch di un driver, usare la procedura seguente:
Dalla sua funzione EvtDriverDeviceAdd callback, il driver chiama WdfDeviceConfigureWdmIrpDispatchCallback per registrare una funzione di callback EvtDeviceWdmIrpDispatch .
Se la destinazione è la coda di I/O del dispositivo padre, un driver KMDF deve chiamare WdfPdoInitAllowForwardingRequestToParent prima di chiama WdfDeviceCreate. Se un driver KMDF ha anche fornito una funzione di callback EvtDeviceWdmIrpPreprocess , il framework chiama prima tale funzione quando arriva un'IRP. Dopo che la funzione di callback pre-elabora la richiesta, chiama WdfDeviceWdmDispatchPreprocessedIrp per restituire l'IRP al framework.
Il framework chiama la funzione di callback EvtDeviceWdmIrpDispatch del driver.
Dall'interno di EvtDeviceWdmIrpDispatch, il driver può chiamare WdfDeviceWdmDispatchIrpToIoQueue o WdfDeviceWdmDispatchIrp, ma non entrambi. Un driver KMDF ha l'opzione aggiuntiva di chiamare nessuno di questi metodi e invece completare l'IRP o contrassegnarlo in sospeso.
Se un driver KMDF ha impostato il flag di WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK e non ha abilitato lo stato di avanzamento in avanti garantito per la coda di I/O di destinazione, il framework chiama il driver EvtIoInCallerContext, se specificato. Dopo aver pre-elaborato la richiesta, la funzione di callback deve accodarla chiamando WdfDeviceEnqueueRequest o completarla chiamando WdfRequestComplete.
Invio di IRP pre-elaborati
Per inviare IP da una funzione di callback evtDeviceWdmIrpPreprocess di un driver a una coda di I/O specifica, usare la procedura seguente:
- Il driver registra una funzione di callback EvtDeviceWdmIrpPreprocess chiamando WdfDeviceInitAssignWdmIrpPreprocessCallback.
- Il driver chiama WdfPdoInitAllowForwardingRequestToParent se la destinazione è la coda I/O del dispositivo padre.
- Da EvtDeviceWdmIrpPreprocess chiamare WdfDeviceWdmDispatchIrpToIoQueue con Flag impostati su WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP.
- Se il driver ha impostato il flag di WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK e non ha abilitato lo stato di avanzamento in avanti garantito per la coda di I/O di destinazione, il framework chiama il driver EvtIoInCallerContext, se specificato. Al termine dell'elaborazione della richiesta, la funzione di callback deve accodarla chiamando WdfDeviceEnqueueRequest o completandola chiamando WdfRequestComplete.