Condividi tramite


Completamento delle richieste di I/O

Ogni driver basato su framework deve completare ogni richiesta di I/O ricevuta dal framework. I driver completano le richieste chiamando il metodo WdfRequestComplete , WdfRequestCompleteWithInformation , o WdfRequestCompleteWithPriorityBoost dell'oggetto richiesta.

Quando completare una richiesta

Un conducente deve completare una richiesta quando ritiene che uno dei casi seguenti sia vero:

  • L'operazione di I/O richiesta è stata completata correttamente.

  • L'operazione di I/O richiesta è stata avviata ma non è riuscita prima del completamento.

  • L'operazione di I/O richiesta non è supportata o non è valida al momento della ricezione e non può essere avviata.

  • L'operazione di I/O richiesta è stata annullata.

Se il driver esegue la richiesta di I/O creando un'attività di I/O nel dispositivo, il driver chiama in genere WdfRequestComplete dalla sua funzione di callback EvtInterruptDpc o EvtDpcFunc.

Se il driver riceve una richiesta non supportata o non valida, in genere chiama WdfRequestComplete dal gestore della richiesta che ha ricevuto la richiesta.

Se l'operazione di I/O è stata annullata, il driver in genere chiama WdfRequestComplete dalla sua funzione di callback EvtRequestCancel.

Se il driver inoltra richiesta di I/O a una destinazione di I/O , il driver completa la richiesta dopo che la destinazione di I/O completa la richiesta, come indicato di seguito:

  • Se il driver inoltra la richiesta di I/O in modo sincrono alla destinazione di I/O, la chiamata del driver alla destinazione di I/O viene restituita solo dopo che un driver di livello inferiore ha completato la richiesta (a meno che non si verifichi un errore). Quando la destinazione I/O ritorna, il driver deve chiamare WdfRequestComplete.

  • Se il driver inoltra la richiesta di I/O in modo asincrono, si vuole che il driver venga informato quando un driver di livello inferiore completa la richiesta. Se il driver registra una CompletionRoutine funzione di callback, il framework chiama questa funzione di callback dopo che la destinazione di I/O completa la richiesta. La funzione di callback CompletionRoutine chiama in genere WdfRequestComplete.

Per registrare la funzione di callback CompletionRoutine, il driver deve chiamare WdfRequestSetCompletionRoutine prima di inoltrare la richiesta di I/O a una destinazione di I/O.

Se il driver non deve ricevere una notifica quando una destinazione di I/O completa una richiesta di I/O inoltrata asincronamente, il driver non necessita registrare una funzione di callback CompletionRoutine. Al contrario, il driver può impostare il flag di WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET quando si chiama WdfRequestSend. In questo caso il driver non effettua la chiamata a WdfRequestComplete.

Un driver non completa una richiesta di I/O creata chiamando WdfRequestCreate o WdfRequestCreateFromIrp. Al contrario, il driver deve chiamare WdfObjectDelete per eliminare l'oggetto richiesta, in genere dopo che una destinazione di I/O ha completato la richiesta.

Ad esempio, un driver potrebbe ricevere una richiesta di lettura o scrittura per una quantità di dati maggiore rispetto a quanto le destinazioni di I/O del driver possano gestire contemporaneamente. Il driver deve dividere i dati in diverse richieste più piccole e inviare queste richieste più piccole a una o più destinazioni di I/O. Le tecniche per la gestione di questa situazione includono:

  • Chiamare WdfRequestCreate per creare un unico oggetto di richiesta aggiuntivo che rappresenta una richiesta più piccola.

    Il driver può inviare questa richiesta in modo sincrono a una destinazione di I/O. La funzione di callback CompletionRoutine della richiesta più piccola può invocare WdfRequestReuse, permettendo al driver di riutilizzare la richiesta e inviarla nuovamente alla destinazione di I/O. Dopo che il target di I/O completa l'ultima delle richieste più piccole, la funzione di callback CompletionRoutine può chiamare WdfObjectDelete per eliminare l'oggetto richiesta creata dal driver e il driver può chiamare WdfRequestComplete per completare la richiesta originale.

  • Chiamando WdfRequestCreate per creare diverse richieste aggiuntive che rappresentano richieste più piccole.

    Le destinazioni di I/O del driver possono elaborare queste richieste più piccole in modo asincrono. Il driver può registrare una funzione di callback CompletionRoutine per ciascuna delle richieste più piccole. Ogni volta che viene chiamata la CompletionRoutine funzione di callback, può chiamare WdfObjectDelete per eliminare un oggetto richiesta creato dal driver. Al termine del completamento di tutte le richieste più piccole dalla destinazione di I/O, il driver può chiamare WdfRequestComplete per completare la richiesta originale.

Fornire informazioni sulla conclusione

Quando un driver completa una richiesta, può fornire facoltativamente alcune informazioni aggiuntive a cui possono accedere altri driver. Ad esempio, un driver potrebbe fornire il numero di byte trasferiti per una richiesta di lettura o scrittura. Per fornire queste informazioni, il driver può eseguire una delle operazioni seguenti:

ottenere informazioni di completamento

Per ottenere informazioni su una richiesta di I/O completata da un altro driver, un driver può:

Se un driver invia una richiesta di I/O in modo sincrono, in genere chiama WdfRequestGetStatus, WdfRequestGetCompletionParamse WdfRequestGetInformation dopo la restituzione della chiamata sincrona. Se un driver invia una richiesta di I/O in modo asincrono, in genere chiama questi metodi dall'interno di una CompletionRoutine funzione di callback.

Per altre informazioni sul completamento delle richieste di I/O, vedere Sincronizzazione del codice di annullamento e completamento.