Condividi tramite


Completamento delle richieste di I/O

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

Quando completare una richiesta

Un driver deve completare una richiesta quando determina che uno dei casi seguenti è true:

  • 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 è stata valida al momento della ricezione e non è stato possibile avviare.

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

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

Se il driver riceve una richiesta non supportata o altrimenti 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 chiama in genere WdfRequestComplete dalla sua funzione di callback EvtRequestCancel .

Se il driver inoltra la 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 I/O restituisce solo dopo che un driver di livello inferiore ha completato la richiesta (a meno che non si verifichi un errore). Dopo aver restituito la destinazione di I/O, il driver deve chiamare WdfRequestComplete.

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

Per registrare una funzione di callback di CompletamentoRoutine , 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 in modo asincrono, il driver non deve registrare una funzione di callback di CompletamentoRoutine . Il driver può invece impostare il flag di WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET quando si chiama WdfRequestSend. In questo caso il driver non chiama WdfRequestComplete.

Un driver non completa una richiesta di I/O creata chiamando WdfRequestCreate o WdfRequestCreateFromIrp. Il driver deve invece chiamare WdfObjectDelete per eliminare l'oggetto request, 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 alle destinazioni di I/O del driver può 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:

  • Chiamata di WdfRequestCrea per creare un singolo oggetto 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 di Completamento della richiesta più piccola può chiamare WdfRequestReuse in modo che il driver possa riutilizzare la richiesta e inviarla di nuovo alla destinazione di I/O. Dopo aver completato l'ultima delle richieste più piccole, la funzione di callback di CompletamentoRoutine può chiamare WdfObjectDelete per eliminare l'oggetto richiesta creata dal driver e il driver può chiamare WdfRequestComplete per completare la richiesta originale.

  • Chiamata di WdfRequestCrea per creare diversi oggetti di richiesta aggiuntivi che rappresentano le richieste più piccole.

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

Fornire informazioni di completamento

Quando un driver completa una richiesta, può fornire facoltativamente alcune informazioni aggiuntive che altri driver possono accedere. 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:

Recupero delle 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, WdfRequestGetCompletionParams e WdfRequestGetInformation dopo la chiamata sincrona. Se un driver invia una richiesta di I/O in modo asincrono, in genere chiama questi metodi dall'interno di una funzione di callback Di completamentoRoutine .

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