Condividi tramite


Metodi di invio per le richieste di I/O

Quando un driver chiama WdfIoQueueCreate per creare una coda di I/O, specifica un metodo di invio per la coda. Il framework fornisce tre metodi di invio: sequenziale, parallelo e manuale. Il driver può specificare uno di questi metodi di invio per qualsiasi coda di I/O, inclusa la coda di I/O predefinita di un dispositivo.

Il driver imposta il metodo di invio di una coda specificando un valore tipizzato WDF_IO_QUEUE_DISPATCH_TYPE nella struttura di WDF_IO_QUEUE_CONFIG della coda.

Ad esempio, gli usi di ogni metodo di invio, vedere Esempi di usi delle code di I/O.

Invio sequenziale

Se il driver o il dispositivo può elaborare una sola richiesta di I/O da una coda alla volta, è necessario configurare le code di I/O del dispositivo per usare l'invio sequenziale, detto anche invio sincrono. Con questo tipo di invio, il framework invia richieste al driver uno alla volta. Il framework non recapita la richiesta successiva finché il driver non completa, annulla o accoda nuovamente la richiesta precedente.

Dopo che il framework ha recapitato una richiesta a uno dei gestori di richieste del driver, il driver elabora la richiesta. Se il driver inoltra la richiesta a una destinazione di I/O generale, in genere chiama uno dei metodi sincroni dell'oggetto di destinazione I/O. Per altre informazioni su questi metodi, vedere Invio sincrono di richieste di I/O. Il driver deve infine completare o annullare ogni richiesta ricevuta da una coda di I/O.

Un driver che ha configurato una coda di I/O per l'invio sequenziale può chiamare WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject per ottenere un'altra richiesta dalla coda prima che l'ultima richiesta ricevuta sia stata completata o annullata. È possibile eseguire questa operazione in un driver di funzione, in modo che il driver possa avviare l'operazione hardware successiva mentre la funzione di callback EvtInterruptDpc del driver sta ancora elaborando i dati dell'operazione hardware precedente.

Se si creano diverse code di I/O e si impostano tutte le code per l'invio sequenziale, il framework invia le richieste da ogni coda in sequenza, ma le code vengono eseguite in parallelo. Se il driver o il dispositivo può elaborare una sola richiesta alla volta di qualsiasi tipo, è necessario usare una singola coda di I/O con una funzione di callback EvtIoDefault .

Invio parallelo

Se il driver e il dispositivo possono elaborare più richieste di I/O contemporaneamente, è possibile configurare le code di I/O del dispositivo per usare l'invio parallelo in modo che il driver possa elaborare le richieste in modo asincrono. Questo metodo di invio viene chiamato anche invio asincrono.

Se un driver configura una coda di I/O per l'uso dell'invio parallelo, il framework recapita le richieste di I/O al driver non appena sono disponibili nella coda. Il risultato è che il driver potrebbe dover elaborare più richieste contemporaneamente.

Ogni volta che uno dei gestori di richieste del driver riceve una richiesta, il driver deve elaborare la richiesta e quindi completare la richiesta. Se il driver inoltra la richiesta a una destinazione di I/O generale, in genere chiama uno dei metodi asincroni dell'oggetto di destinazione di I/O. Per altre informazioni su questi metodi, vedere Invio asincrono di richieste di I/O. Il driver deve infine completare o annullare ogni richiesta ricevuta da una coda di I/O.

Un driver che usa l'invio parallelo può chiamare WdfIoQueueStop o WdfIoQueueStopSynchronously per arrestare temporaneamente una coda e quindi chiamare WdfIoQueueStart per riavviare la coda.

Invio manuale

Se si vuole che il driver abbia il controllo completo sul recapito delle richieste di I/O, è possibile configurare la coda di I/O di un dispositivo in modo da usare l'invio manuale, il che significa che il framework non recapita le richieste al driver a meno che il driver non ne richieda esplicitamente uno.

Per ottenere una richiesta da una coda manuale, il driver può chiamare WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject in un ciclo che esegue il polling della coda. In alternativa, il driver può chiamare WdfIoQueueReadyNotify per registrare una funzione di callback che il framework chiamerà quando una o più richieste sono disponibili nella coda. Dopo che il framework chiama la funzione di callback, il driver può chiamare WdfIoQueueRetrieveNextRequest o WdfIoQueueRetrieveRequestByFileObject in un ciclo per recuperare le richieste.

Dopo che il driver ottiene una richiesta dalla coda, deve elaborare la richiesta. Il driver deve completare o annullare ogni richiesta.