Creazione di code di I/O

Gli oggetti code del framework rappresentano code di I/O, ovvero contenitori per le richieste di I/O ricevute da un driver. Ogni driver può creare una o più code di I/O per ogni dispositivo. L'oggetto coda del framework definisce un set di funzioni di callback degli eventi che il driver può fornire e un set di metodi oggetto che il driver può chiamare.

Quando il framework riceve una richiesta di I/O indirizzata a uno dei dispositivi del driver, il framework inserisce la richiesta nella coda di I/O appropriata. Se il driver registra uno o più gestori di richieste, il framework può notificare al driver ogni volta che è disponibile una richiesta di I/O. In alternativa, il driver può eseguire il polling della coda di I/O per le richieste.

La maggior parte dei driver crea code di I/O nella funzione EvtDriverDeviceAggiungi callback. Per creare una coda di I/O per un dispositivo, il driver chiama il metodo WdfIoQueueCreate dell'oggetto della coda del framework ( che crea un oggetto coda framework). Il driver fornisce una struttura WDF_IO_QUEUE_CONFIG al metodo. Questa struttura contiene informazioni di configurazione sulla coda, ad esempio il metodo di invio della coda e i puntatori ai gestori delle richieste che il framework chiama quando le richieste sono disponibili nella coda. La struttura indica anche se la coda sarà gestita dall'alimentazione e se il driver supporta buffer a lunghezza zero per le richieste di I/O della coda.

Se il driver imposta il membro DefaultQueue della struttura WDF_IO_QUEUE_CONFIG su TRUE, la coda diventa la coda di I/O predefinita del dispositivo. Se il driver crea una coda di I/O predefinita, il framework inserisce tutte le richieste di I/O del dispositivo in questa coda, a meno che non si creino code aggiuntive per ricevere alcune delle richieste. Un driver può ottenere un handle per la coda di I/O predefinita di un dispositivo chiamando il metodo WdfDeviceGetDefaultQueue .

Se si vuole usare più code di I/O per un dispositivo, il driver può chiamare WdfIoQueueCreate per creare tutti gli oggetti di coda necessari. Se un driver crea più code, può chiamare WdfDeviceConfigureRequestDispatching, che indica al framework di indirizzare diversi tipi di richieste a code diverse. Ad esempio, è possibile specificare che tutte le richieste di lettura verranno recapitate a una coda e tutte le richieste di scrittura verranno recapitate a un'altra coda.

Se il driver crea un set di code di I/O e chiama WdfDeviceConfigureRequestDispatching per indirizzare ogni tipo di richiesta che il driver può ricevere a una coda specifica, il driver non necessita di una coda predefinita.

Se un driver non fornisce una coda di I/O per le richieste di un tipo specifico e se il driver è un driver di funzione, il framework completa le richieste di tale tipo con un valore di stato di completamento di STATUS_INVALID_DEVICE_REQUEST. Se il driver è un driver di filtro e ha chiamato WdfFdoInitSetFilter, il framework inoltra automaticamente queste richieste al driver inferiore successivo nello stack di driver. Pertanto, ad esempio, un driver di filtro che non elabora le richieste di lettura non deve fornire una coda di I/O che riceve le richieste di lettura.

Per esempi di come i driver possono usare le code di I/O, vedere Esempi di usi di code di I/O.