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:

Invio di IRP non pre-elaborati

Per inviare indirizzi IP da una funzione di callback EvtDeviceWdmIrpDispatch di un driver, usare la procedura seguente:

  1. 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.

  2. Il framework chiama la funzione di callback EvtDeviceWdmIrpDispatch del driver.

  3. 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.

  4. 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:

  1. Il driver registra una funzione di callback EvtDeviceWdmIrpPreprocess chiamando WdfDeviceInitAssignWdmIrpPreprocessCallback.
  2. Il driver chiama WdfPdoInitAllowForwardingRequestToParent se la destinazione è la coda I/O del dispositivo padre.
  3. Da EvtDeviceWdmIrpPreprocess chiamare WdfDeviceWdmDispatchIrpToIoQueue con Flag impostati su WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP.
  4. 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.