Configurazione della modalità di invio per una coda di I/O

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 Windows universali devono usare UMDF 2.

Per altre informazioni, vedere Introduzione con UMDF.

Quando arrivano richieste di I/O dalle applicazioni, il framework inserisce ogni richiesta nella coda di I/O appropriata. La modalità e il momento in cui le richieste vengono recapitate al driver dipendono dal modo in cui il driver configura l'invio per la coda di I/O e dal modo in cui il driver specifica la sincronizzazione delle funzioni di callback. La coda di I/O interagisce anche con il sottosistema di gestione alimentazione e PnP di UMDF per contenere le richieste di I/O nella coda fino a quando il dispositivo non raggiunge lo stato corretto.

Nota La modalità di invio per la coda di I/O non è correlata alla modalità di sincronizzazione. La configurazione di invio della coda di I/O controlla il numero di richieste che il driver può accettare per l'elaborazione in un determinato momento, mentre la sincronizzazione controlla l'esecuzione simultanea delle funzioni di callback degli eventi che presentano o annullano le richieste. Tuttavia, vengono create diverse modalità operative combinando le modalità di dispatch e di sincronizzazione.

Il driver configura l'invio per una coda di I/O quando il driver chiama il metodo IWDFDevice::CreateIoQueue per configurare la coda predefinita o per creare una coda secondaria. Il driver può specificare uno dei valori del tipo di enumerazione WDF_IO_QUEUE_DISPATCH_TYPE nel parametro DispatchType di IWDFDevice::CreateIoQueue per identificare la modalità di invio. Un oggetto coda di I/O può supportare le modalità di invio seguenti:

  • Sequenziale

    La modalità di invio sequenziale viene specificata usando il valore WdfIoQueueDispatchSequential . In questa modalità di invio, una coda nello stato di elaborazione genera eventi in modo che un driver esezioni una sola richiesta alla volta. La coda rinvia eventuali richieste aggiuntive fino a quando il driver non termina l'elaborazione della richiesta corrente o chiama il metodo IWDFIoRequest::ForwardToIoQueue per accodare nuovamente la richiesta. Quando la richiesta corrente viene completata o inoltrata, la coda genera un evento per fornire la richiesta successiva.

  • Parallelo

    La modalità di invio parallelo viene specificata usando il valore WdfIoQueueDispatchParallel . In questa modalità di invio, una coda nello stato di elaborazione genera eventi non appena le richieste di I/O sono pronte per il driver. Quando il driver riceve una richiesta di I/O, il driver può elaborare la richiesta di I/O in uno dei modi seguenti:

  • Manuale

    La modalità di invio manuale viene specificata usando il valore WdfIoQueueDispatchManual . In questa modalità di invio, la coda di I/O non invia automaticamente una notifica al driver quando le richieste arrivano alla coda. Il driver deve chiamare il metodo IWDFIoQueue::RetrieveNextRequest per recuperare manualmente le richieste dalla coda. Si tratta di un modello di polling.

    In UMDF versioni 1.9 e successive, se il driver usa la modalità di invio manuale, può chiamare IWDFIoRequest2::Requeue per restituire una richiesta di I/O alla testa della coda di I/O da cui il driver l'ha ottenuta. Dopo aver chiamato IWDFIoRequest2::Requeue, la chiamata successiva del driver a IWDFIoQueue::RetrieveNextRequest recupera la richiesta accodata.

Per tutte le modalità di invio, l'oggetto coda di I/O riceve e tiene traccia della richiesta fino a quando il driver non gestisce la richiesta o la richiesta non viene annullata.

Se il driver configura la coda per l'invio seriale o parallelo, il framework invia una notifica al driver di una richiesta tramite le funzioni di callback registrate dal driver quando il driver crea la coda o configura la coda predefinita. Per altre informazioni, vedere Funzioni di callback degli eventi della coda di I/O.