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. Nessuna nuova funzionalità viene aggiunta a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.

Gli esempi di UMDF 1 archiviati sono disponibili nell'Windows 11, versione 22H2 - Aggiornamento degli esempi di driver di maggio 2022.

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. Come e quando le richieste vengono recapitate al driver dipendono dal modo in cui il driver configura l'invio per la coda di I/O e sul modo in cui il driver specifica la sincronizzazione della funzione callback. La coda di I/O interagisce anche con il sottosistema PnP e power management di UMDF per contenere le richieste di I/O nella coda fino a quando il dispositivo raggiunge lo stato appropriato.

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 qualsiasi momento, mentre la sincronizzazione controlla l'esecuzione simultanea delle funzioni di callback eventi che presentano o annullano le richieste. Tuttavia, diverse modalità di operazione vengono create combinando le modalità di invio e 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 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 elabora una sola richiesta alla volta. La coda disattiva eventuali richieste aggiuntive fino al termine dell'elaborazione della richiesta corrente o chiama il metodo IWDFIoRequest::ForwardToIoQueue per ripetere 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 parallela 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 notifica automaticamente 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.

    Nelle versioni UMDF 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 è stato ottenuto il driver. Dopo aver chiamato IWDFIoRequest2::Requeue, la chiamata successiva del driver a IWDFIoQueue::RetrieveNextRequest recupera la richiesta riquedata.

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

Se il driver configura la coda per l'invio seriale o parallelo, il framework 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 dell'evento di coda I/O.