Gestori di richieste
Se il driver ha specificato il metodo di invio sequenziale o parallelo per una coda di I/O, il framework chiama una funzione di callback fornita dal driver ogni volta che è pronto per recapitare una delle richieste della coda al driver.
Per ogni coda di I/O, il driver può fornire una o più delle funzioni di callback seguenti, denominate gestori di richieste:
EvtIoRead
Il framework chiama la funzione di callback EvtIoRead di una coda di I/O quando una richiesta di lettura è disponibile nella coda.
EvtIoWrite
Il framework chiama la funzione di callback EvtIoWrite di una coda di I/O quando una richiesta di scrittura è disponibile nella coda.
EvtIoDeviceControl
Il framework chiama la funzione di callback EvtIoDeviceControl di una coda di I/O quando una richiesta di controllo di I/O del dispositivo è disponibile nella coda.
EvtIoInternalDeviceControl
Il framework chiama la funzione di callback EvtIoInternalDeviceControl di una coda di I/O di un dispositivo quando è disponibile una richiesta di controllo di I/O interna nella coda.
EvtIoDefault
Il framework chiama la funzione di callback EvtIoDefault di una coda di I/O quando è disponibile una richiesta, se il driver non ha fornito la funzione di callback specifica del tipo di richiesta associata.
Il driver registra le funzioni di callback quando chiama WdfIoQueueCreate per creare una coda di I/O per un dispositivo.
Ognuna di queste funzioni di callback riceve due argomenti di input: un handle per la richiesta di I/O che il framework recapita al driver e un handle alla coda di I/O che ha mantenuto la richiesta. Una funzione di callback può determinare il dispositivo di destinazione chiamando WdfIoQueueGetDevice.
Il framework chiama i gestori di richieste del driver in un contesto di thread arbitrario. Un driver non deve attendere un lungo periodo di tempo durante l'esecuzione in un contesto di thread arbitrario. In alcuni casi, il driver potrebbe usare oggetti dispatcher kernel come meccanismi di sincronizzazione. Per informazioni su quando il driver può attendere gli oggetti dispatcher e sulle operazioni da eseguire quando non è possibile, vedere Introduzione agli oggetti Dispatcher kernel.