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 le 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 fine 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 le richieste al driver finché il dispositivo non entra nello stato di lavoro e il framework non 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 di lavoro (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 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 accodare nuovamente 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 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:

  1. Chiamare WdfIoQueueFindRequest per individuare una richiesta che corrisponde ai criteri specificati dal driver.

  2. Chiamare WdfIoQueueRetrieveFoundRequest per recuperare la richiesta individuata da WdfIoQueueFindRequest .

Eliminazione o svuotamento di una coda di I/O

L'eliminazione di una coda di I/O implica l'interruzione dell'inserimento di richieste di I/O nella coda e l'annullamento di tutte le richieste già presenti nella coda.

Svuotare una coda di I/O significa arrestare l'inserimento di richieste di I/O nella coda, consentendo al driver di recapitare tutte 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 dal risparmio energia, i driver possono fornire funzioni di callback EvtIoStop ed EvtIoResume .

Se alcune code del driver non sono gestite dall'alimentazione, potrebbe essere necessario ripulire o svuotare una coda se il dispositivo associato o il canale di I/O non è più disponibile. In genere, si elimina, anziché 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 ripulire le code, mentre un driver per un dispositivo di archiviazione probabilmente svuota le code.

Se si vuole che il driver ripulire o svuotare una coda di I/O, il driver può chiamare uno dei metodi dell'oggetto coda seguenti:

Prestare attenzione quando si chiamano 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 atteso. Se non si conosce il tempo necessario per il completamento delle richieste di I/O ed è accettabile annullare le richieste in sospeso, è consigliabile 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, potrebbe essere necessario accodare nuovamente 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 inviare nuovamente la richiesta al driver usando il metodo di invio della coda specificata. Per altre informazioni sullo spostamento delle richieste di I/O da una coda di I/O a un'altra, vedere Requeuing I/O Requests (Riaccodamento delle richieste di I/O).

Intercettazione di una richiesta di I/O prima che venga accodata

È possibile che un driver intercetti 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 inviata dal sistema al dispositivo.

In genere, quando una funzione di callback EvtIoInCallerContext riceve una richiesta, esegue alcune elaborazioni preliminari 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, esattamente come avrebbe fatto se non avesse chiamato la funzione di callback EvtIoInCallerContext .

Il motivo principale per cui un driver può fornire una funzione di callback EvtIoInCallerContext è che il driver deve gestire le operazioni di I/O che supportano il metodo di I/O non denominato 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 di dati in Framework-Based driver.

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: