Gestione delle code di I/O
Avvio di una coda di I/O
Quando un driver chiama WdfIoQueueCreate per creare una coda di I/O, il framework consente automaticamente alla coda di ricevere richieste di I/O e di recapitarle a un driver.
I driver in genere chiamano WdfIoQueueCreate dall'interno di una funzione di callback EvtDriverDeviceAdd . Il framework può iniziare a recapitare le richieste di I/O al driver dopo la restituzione della funzione di callback EvtDriverDeviceAdd del driver.
Se il driver usa code di I/O gestite dall'alimentazione , il framework non può iniziare a recapitare richieste al driver fino a quando il dispositivo non entra nello stato di lavoro e il framework ha chiamato la funzione di callback EvtDeviceD0Entry del driver.
Arresto e riavvio di una coda di I/O
Il driver può chiamare WdfIoQueueStop o WdfIoQueueStopSynchronously per impedire temporaneamente al framework di recapitare richieste di I/O da una coda di I/O. Per riprendere il recapito delle richieste di I/O, il driver chiama WdfIoQueueStart.
Se il driver usa code di I/O gestite dall'alimentazione, il framework arresta automaticamente le code di un dispositivo quando il dispositivo lascia lo stato funzionante (D0) e il framework riavvia le code quando lo stato del dispositivo torna a D0.
Aggiunta di richieste a una coda di I/O
Quando il sistema invia una richiesta di controllo di I/O di lettura, scrittura o dispositivo a un driver, il framework inserisce la richiesta in una coda di I/O. Il driver può controllare i tipi di richieste archiviate dal framework in ogni coda chiamando WdfDeviceConfigureRequestDispatching.
Un driver può anche rieseguere le richieste ricevute dal framework chiamando WdfRequestForwardToIoQueue.
Recupero di richieste da una coda di I/O
Se un driver specifica il metodo di invio sequenziale o parallelo per una coda di I/O, riceve le richieste nei gestori di richieste.
Se un driver specifica il metodo di invio manuale o sequenziale, può ottenere richieste chiamando WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject.
Ricerca di una richiesta di I/O
Se un driver specifica il metodo di invio manuale per una coda di I/O, può usare la procedura seguente per cercare richieste specifiche nella coda:
Chiamare WdfIoQueueFindRequest per individuare una richiesta che corrisponda ai criteri specificati dal driver.
Chiamare WdfIoQueueRetrieveFoundRequest per recuperare la richiesta che WdfIoQueueFindRequest si trova.
Eliminazione o svuotamento di una coda di I/O
L'eliminazione di una coda di I/O significa interrompere l'inserimento delle richieste di I/O nella coda e annullare tutte le richieste già presenti nella coda.
Lo svuotamento di una coda di I/O significa interrompere l'inserimento delle richieste di I/O nella coda, consentendo al driver le richieste già presenti nella coda.
I driver in genere eliminano o svuotano le code solo se le code non sono gestite dall'alimentazione. Per le code di I/O gestite dall'alimentazione, i driver possono fornire funzioni di callback EvtIoStop e EvtIoResume .
Se alcune code del driver non sono gestite dall'alimentazione, è possibile eliminare o svuotare una coda se il dispositivo o il canale di I/O associato diventa non disponibile. In genere, si elimina, invece di svuotare, una coda a meno che non vi sia una probabilità elevata che ogni richiesta contenga informazioni molto importanti. Ad esempio, un driver per un dispositivo di rete potrebbe eliminare le code, mentre un driver per un dispositivo di archiviazione probabilmente svuota le code.
Se si vuole che il driver ripulisci o svuota una coda di I/O, il driver può chiamare uno dei metodi dell'oggetto coda seguenti:
WdfIoQueuePurge o WdfIoQueuePurgeSynchronously, per interrompere l'accodamento delle richieste di I/O a una coda di I/O e per annullare le richieste non elaborate.
WdfIoQueueDrain o WdfIoQueueDrainSynchronously, per interrompere l'accodamento delle richieste di I/O a una coda di I/O, consentendo al contempo il recapito e l'elaborazione di richieste già in coda.
Prestare attenzione quando si chiama WdfIoQueueDrain e WdfIoQueueDrainSynchronously. Poiché un'operazione di svuotamento attende il completamento delle richieste, è consigliabile svuotare una coda solo se si è certi che le richieste in sospeso della coda verranno completate in modo tempestivo. Se non si conosce il tempo necessario per il completamento delle richieste di I/O ed è accettabile annullare le richieste in sospeso, valutare la possibilità di eliminare la coda.
Spostamento di richieste da una coda di I/O a un'altra
Dopo che il driver ha ricevuto una richiesta di I/O, è possibile che il driver riscriva la richiesta in una coda di I/O diversa. A tale scopo, il driver chiama WdfRequestForwardToIoQueue o WdfRequestForwardToParentDeviceIoQueue, che aggiunge la richiesta alla parte finale di una coda specificata. Infine, il framework recapita nuovamente la richiesta al driver usando il metodo di invio della coda specificato. Per altre informazioni sullo spostamento delle richieste di I/O da una coda di I/O a un'altra, vedere Requeuing I/O Requests .For more information about moving I/O requests from one I/O queue to another, see Requeuing I/O Requests.
Intercettazione di una richiesta di I/O prima che venga accodata
È possibile che un driver intercetta una richiesta di I/O prima che il framework inserisca la richiesta in una coda di I/O. Per intercettare le richieste di I/O, il driver deve chiamare WdfDeviceInitSetIoInCallerContextCallback per registrare una funzione di callback EvtIoInCallerContext .
Il framework associa la funzione di callback EvtIoInCallerContext a un dispositivo. Di conseguenza, il framework chiama la funzione di callback EvtIoInCallerContext ogni volta che riceve una richiesta che il sistema invia al dispositivo.
In genere, quando una funzione di callback EvtIoInCallerContext riceve una richiesta, esegue un'elaborazione preliminare per la richiesta. La funzione di callback chiama quindi WdfDeviceEnqueueRequest, che restituisce la richiesta al framework. Il framework può quindi inserire la richiesta nella coda di I/O appropriata, proprio come se non avesse chiamato la funzione di callback EvtIoInCallerContext .
Il motivo principale per cui un driver potrebbe fornire una funzione di callback EvtIoInCallerContext è che il driver deve gestire le operazioni di I/O che supportano il metodo di I/O chiamato i/O memorizzato nel buffer né diretto. Per questo metodo di I/O, il driver deve accedere ai buffer ricevuti nel contesto del processo dell'origine della richiesta di I/O. Per altre informazioni, vedere Accesso ai buffer dei dati nei driver Framework-Based.
Recupero delle proprietà della coda di I/O
Per ottenere le proprietà di un oggetto coda del framework, il driver può chiamare i metodi seguenti:
WdfIoQueueGetDevice, per ottenere un handle per l'oggetto dispositivo a cui appartiene l'oggetto queue.
WdfIoQueueGetState, per ottenere informazioni sullo stato sulla coda.