Annullamento delle richieste di I/O

L'operazione di I/O in corso di un dispositivo ,ad esempio una richiesta di lettura di diversi blocchi da un disco, può essere annullata da un'applicazione, dal sistema o da un driver. Se l'operazione di I/O di un dispositivo viene annullata, il gestore di I/O tenta di annullare tutte le richieste di I/O non elaborate associate all'operazione di I/O. I driver del dispositivo possono registrarsi per ricevere una notifica quando il gestore di I/O tenta di annullare le richieste di I/O e i driver possono annullare le richieste di cui sono proprietari completandole con lo stato di completamento di STATUS_CANCELLED.

Il framework gestisce alcune operazioni di annullamento per i driver basati su framework. Se l'operazione di I/O di un dispositivo viene annullata, il framework completa le richieste di I/O seguenti (con stato di completamento di STATUS_CANCELLED) associate all'operazione annullata:

  • Richieste di I/O non recapitate che il framework ha inserito nella coda di I/O predefinita del driver.

  • Richieste di I/O non recapitate che il framework ha inoltrato a un'altra coda perché il driver denominato WdfDeviceConfigureRequestDispatching.

Poiché il framework annulla queste richieste, non li recapita al driver.

Dopo che il framework ha recapitato una richiesta di I/O al driver, il driver è proprietario della richiesta e il framework non può annullarlo. A questo punto, solo il driver può annullare la richiesta di I/O, ma il framework deve notificare al driver che una richiesta deve essere annullata. I driver ricevono questa notifica fornendo una funzione di callback EvtRequestCancel .

A volte un driver riceve una richiesta di I/O da una coda di I/O, ma, invece di elaborare la richiesta, il driver accoda nuovamente la richiesta alla stessa o a un'altra coda di I/O per un'elaborazione successiva. Di seguito sono riportati alcuni esempi di questa situazione:

In questi casi, il framework può annullare la richiesta di I/O perché la richiesta si trova in una coda di I/O. Tuttavia, se il driver ha registrato una funzione di callback EvtIoCanceledOnQueue per la coda di I/O in cui risiede la richiesta, il framework chiama la funzione di callback, anziché annullare la richiesta, quando l'operazione di I/O associata viene annullata. Se il framework chiama la funzione di callback EvtIoCanceledOnQueue del driver, il driver deve completare la richiesta.

In sintesi, quando un'operazione di I/O viene annullata, il framework annulla sempre tutte le richieste di I/O associate che non sono mai state recapitate al driver. Se il driver riceve una richiesta e la accoda di nuovo, il framework annulla la richiesta (se la richiesta si trova nella coda) a meno che il driver non fornisca una funzione di callback EvtIoCanceledOnQueue per la coda di I/O.

Chiamata a WdfRequestMarkCancelable o WdfRequestMarkCancelableEx

Un driver può chiamare WdfRequestMarkCancelable o WdfRequestMarkCancelableEx per registrare una funzione di callback EvtRequestCancel . Se il driver ha chiamato WdfRequestMarkCancelable o WdfRequestMarkCancelableEx e se l'operazione di I/O associata alla richiesta viene annullata, il framework chiama la funzione di callback EvtRequestCancel del driver in modo che il driver possa annullare la richiesta di I/O.

Un driver deve chiamare WdfRequestMarkCancelable o WdfRequestMarkCancelableEx se possiede una richiesta per un periodo di tempo relativamente lungo. Ad esempio, un driver potrebbe dover attendere la risposta di un dispositivo oppure potrebbe attendere il completamento di un set di richieste create dal driver quando ha ricevuto una singola richiesta.

Se un driver non chiama WdfRequestMarkCancelable o WdfRequestMarkCancelableEx o se un driver chiama WdfRequestUnmarkCancelable dopo aver chiamato WdfRequestMarkCancelable o WdfRequestMarkCancelableEx, il driver non è a conoscenza dell'annullamento e quindi gestisce la richiesta come normalmente.

Chiamata a WdfRequestIsCanceled

Se un driver non ha chiamato WdfRequestMarkCancelable o WdfRequestMarkCancelableEx per registrare una funzione di callback EvtRequestCancel , può chiamare WdfRequestIsCanceled per determinare se il gestore di I/O ha tentato di annullare una richiesta di I/O. Se WdfRequestIsCanceled restituisce TRUE e il driver è proprietario della richiesta, il driver deve annullare la richiesta. Se il driver non è proprietario della richiesta, non deve chiamare WdfRequestIsCanceled.

Un driver che non ha chiamato WdfRequestMarkCancelable o WdfRequestMarkCancelableEx potrebbe chiamare WdfRequestIsCanceled nelle circostanze seguenti:

Annullamento della richiesta

L'annullamento di una richiesta di I/O può comportare una delle operazioni seguenti:

  • Arresto di un'operazione di I/O in corso.

  • Non inoltrare la richiesta a una destinazione di I/O.

  • Chiamando WdfRequestCancelSentRequest per tentare di annullare una richiesta inviata in precedenza al driver a una destinazione di I/O.

Se un driver annulla una richiesta di I/O per un oggetto richiesta ricevuto dal framework dal driver, il driver deve sempre completare la richiesta chiamando WdfRequestComplete, WdfRequestCompleteWithInformation o WdfRequestCompleteWithPriorityBoost, con un parametro Status di STATUS_CANCELLED. Se il driver denominato WdfRequestCreate per creare un oggetto richiesta, il driver chiama WdfObjectDelete invece di completare la richiesta.

Sincronizzazione dell'annullamento

Per informazioni sulla sincronizzazione del codice che annulla le richieste di I/O, vedere: