Inoltro di richieste di I/O

Quando un driver riceve una richiesta di I/O che non può elaborare, in genere esegue una delle operazioni seguenti:

  • Inoltra la richiesta ricevuta a un altro driver.

  • Crea richieste aggiuntive e li invia a un altro driver.

I driver basati su framework inoltrano le richieste usando destinazioni di I/O, che rappresentano altri driver nel sistema. I driver possono usare una delle tecniche seguenti per inoltrare una richiesta a una destinazione di I/O:

  • Un driver può inoltrare le richieste di I/O al driver inferiore successivo chiamando WdfDeviceGetIoTarget, seguito da WdfRequestFormatRequestUsingCurrentType e infine WdfRequestSend.

    Questa tecnica è utile solo se il driver riceve una richiesta che non deve modificare prima dell'inoltro.

  • Un driver può chiamare WdfFdoInitSetFilter per registrarsi come driver di filtro.

    Se un driver di filtro non fornisce una coda di I/O per un determinato tipo di richiesta di I/O, il framework inoltra automaticamente le richieste di tale tipo al driver inferiore successivo.

  • In genere, un driver di funzione esamina il contenuto di ogni richiesta di I/O. Se un driver di funzione non può elaborare una richiesta, potrebbe modificare la richiesta e inoltrarla a una destinazione di I/O. In alternativa, potrebbe creare una o più nuove richieste e inviarle a una destinazione di I/O.

    L'oggetto di destinazione I/O del framework definisce diversi metodi per inviare richieste di I/O ad altri driver. Ad esempio, un driver può chiamare WdfIoTargetFormatRequestForRead, seguito da WdfRequestSend, per inviare una richiesta di lettura a una destinazione di I/O. Per altre informazioni sulle destinazioni di I/O, vedere Uso delle destinazioni di I/O.

    Raramente, un writer driver potrebbe voler specificare il contenuto della posizione dello stack WDM I/O sottostante di una richiesta prima di inviare una richiesta a una destinazione di I/O . Per questi casi, il driver può chiamare WdfRequestWdmFormatUsingStackLocation prima di chiama WdfRequestSend.

A volte, un driver deve inviare la stessa richiesta a diverse destinazioni di I/O, in genere perché il driver deve inviare un singolo comando a tutti i relativi dispositivi. Prima di inviare una richiesta a una destinazione di I/O, il driver può chiamare WdfRequestChangeTarget per verificare che la destinazione di I/O sia accessibile.

Il driver deve infine completare ogni richiesta inoltrata a una destinazione di I/O, a meno che non venga impostato il flag di WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET quando si chiama WdfRequestSend.

Si noti che quando un driver inoltra una richiesta, il framework non trasferisce letteralmente l'oggetto richiesta framework dal driver di invio al driver di ricezione. Il framework crea invece un nuovo oggetto request nel driver che riceve la richiesta. Solo il pacchetto di richiesta I/O sottostante della richiesta (IRP) della richiesta viene trasferito da un driver a un altro.