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 a 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 quando una richiesta di controllo I/O del dispositivo interno è disponibile 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 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 del kernel come meccanismi di sincronizzazione. Per informazioni su quando il driver può attendere gli oggetti dispatcher e su cosa fare quando non è possibile, vedere Introduzione agli oggetti dispatcher del kernel.