Condividi tramite


Annullamento delle richieste di I/O in UMDF

Avviso

UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Non vengono aggiunte nuove funzionalità a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.

Gli esempi di UMDF 1 archiviati sono disponibili nell'aggiornamento degli esempi di driver di Windows 11 versione 22H2 - Maggio 2022.

Per altre info, vedi Introduzione con UMDF.

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, gestione 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 gestione 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 HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED).

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 viene completato con lo stato di completamento di HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED): le richieste di I/O seguenti associate all'operazione annullata:

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 IRequestCallbackCancel::OnCancel .

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. Ad esempio, il framework potrebbe recapitare una richiesta di I/O a uno dei gestori di richieste del driver e il driver potrebbe successivamente chiamare IWDFIoRequest::ForwardToIoQueue per inserire la richiesta in una coda diversa o IWDFIoRequest2::Requeue per inserire la richiesta nella stessa coda.

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 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 del driver, il driver deve annullare 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 nuovamente, il framework annulla la richiesta (se la richiesta si trova nella coda) a meno che il driver non fornisca una funzione di callback per la coda di I/O.

Chiamata a MarkCancelable

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

Un driver deve chiamare MarkCancelable 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 dover attendere il completamento di un set di richieste create dal driver al momento della ricezione di una singola richiesta.

Se un driver non chiama MarkCancelable o se un driver chiama IWDFIoRequest::UnmarkCancelable dopo aver chiamato MarkCancelable, il driver non è a conoscenza dell'annullamento e quindi gestisce la richiesta come in genere farebbe.

Chiamata a IsCanceled

Se un driver non ha chiamato MarkCancelable per registrare una funzione di callback OnCancel , può chiamare IWDFIoRequest2::IsCanceled per determinare se Gestione I/O ha tentato di annullare una richiesta di I/O. Se IsCanceled restituisce TRUE, il driver deve annullare la richiesta.

Ad esempio, un driver che riceve una richiesta di lettura o scrittura di grandi dimensioni che si interrompe in diverse richieste più piccole potrebbe chiamare IsCanceled dopo che la destinazione di I/O del driver completa ognuna delle richieste più piccole, se il driver non ha chiamato MarkCancelable per la richiesta ricevuta.

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.

  • Chiamata di IWDFIoRequest::CancelSentRequest 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 IWDFIoRequest::Complete o IWDFIoRequest::CompleteWithInformation, con un parametro CompletionStatus di HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED). Se il driver denominato IWDFDevice::CreateRequest per creare un oggetto richiesta, il driver chiama IWDFObject::D eleteWdfObject anziché completare la richiesta.