Concetti di WDM per i driver WDF
Windows Driver Frameworks (WDF) è un wrapper intorno alle interfacce WDM (Microsoft Windows Driver Model). Anche se il framework semplifica molti concetti WDM e nasconde completamente altri in modo che non sia necessario usarli, è comunque necessario comprendere alcuni dei concetti di base dei driver WDM. In particolare, è necessario comprendere i tipi di driver, gli stack di driver, gli stack di dispositivi e i pacchetti di richiesta di I/O.
I driver basati su Windows sono suddivisi in tre tipi: driver del bus, driver di funzione e driver di filtro. I driver del bus supportano gli autobus di I/O rilevando i dispositivi figlio collegati a un bus padre e segnalandone le caratteristiche. Questa attività è denominata enumerazione del bus. I driver di funzione controllano le operazioni di I/O per i dispositivi e gli autobus. I driver di filtro ricevono, esaminano e possono modificare i dati che passano tra applicazioni utente e driver o tra singoli driver.
I driver per gli autobus sono essenzialmente driver di funzione che enumerano anche i figli. Un conducente funge da "driver del bus" quando enumera i dispositivi figlio in un bus. In caso contrario, lo stesso driver funge da "driver di funzione" per il bus quando gestisce le operazioni di I/O che accedono all'hardware dell'adattatore del bus.
Un driver User-Mode Driver Framework (UMDF) non può essere un driver del bus.
Nel sistema operativo Windows i driver WDM vengono a livelli in una sequenza di chiamate verticali denominata stack di driver. Il driver più alto nello stack riceve in genere richieste di I/O dalle applicazioni utente, dopo che le richieste sono passate attraverso la gestione I/O del sistema operativo. I livelli di driver inferiori comunicano in genere con l'hardware del computer.
Uno stack di driver semplice include un driver del bus nella parte inferiore dello stack, che gestisce operazioni di I/O specifiche del bus ed enumera i dispositivi figlio connessi. In genere, uno o più driver di funzione specifici del dispositivo sono sopra il driver del bus. Questi driver di funzione gestiscono le operazioni di I/O ai dispositivi connessi al bus. I driver di filtro possono essere superiori ai driver di funzione oppure possono risiedere tra un driver del bus e un driver di funzione. Un sistema in esecuzione include diversi stack di driver che supportano diversi tipi di dispositivi.
Ogni stack di driver supporta uno o più stack di dispositivi. Uno stack di dispositivi è un set di oggetti dispositivo creati da strutture di DEVICE_OBJECT definite da WDM. Ogni stack di dispositivi rappresenta un dispositivo. Ogni driver crea un oggetto dispositivo per ogni dispositivo e collega ogni oggetto dispositivo a uno stack di dispositivi. Gli stack di dispositivi vengono creati e rimossi perché i dispositivi sono collegati e scollegati e ogni volta che il sistema viene riavviato.
Quando un driver del bus rileva che i dispositivi figlio sono stati collegati o scollegati, informa il gestore Plug and Play (PnP). In risposta, il gestore PnP chiede al driver del bus di creare un oggetto dispositivo fisico (PDO) per ogni dispositivo figlio connesso al dispositivo padre (ovvero il bus). L'oggetto PDO diventa la parte inferiore di uno stack di dispositivi.
Successivamente, il gestore PnP carica i driver di funzione e filtro per supportare ogni dispositivo (se non sono già caricati) e quindi il gestore PnP chiama questi driver in modo che ogni possa creare un oggetto dispositivo e aggiungerlo all'inizio dello stack di dispositivi. I driver di funzione creano oggetti dispositivo funzionale (FDO) e filtrano i driver creano oggetti dispositivo filtro (filtri DO).
Quando il gestore I/O invia una richiesta di I/O ai driver di un dispositivo, passa la richiesta al driver che ha creato l'oggetto dispositivo più alto nello stack di dispositivi. Se tale driver chiede al gestore di I/O di passare la richiesta al driver inferiore successivo, il gestore di I/O usa lo stack di dispositivi per determinare il driver inferiore successivo. Il driver successivo è il driver che ha creato l'oggetto dispositivo inferiore successivo.
WDF crea un oggetto dispositivo framework per ogni oggetto dispositivo WDM. I driver basati su framework accedono a questi oggetti del dispositivo framework anziché agli oggetti dispositivo WDM.
Gestione I/O invia le richieste di I/O di un'applicazione ai driver creando pacchetti di richiesta di I/O (IRP). Un'IRP può contenere una richiesta per eseguire un'operazione di I/O (ad esempio un'operazione di lettura/scrittura) o una richiesta per eseguire un'azione I/O (IOCTL) (ad esempio la restituzione dello stato). Inoltre, il gestore PnP crea irP che rappresentano operazioni di gestione delle energia e PnP che devono eseguire i driver e invia questi indirizzi IP ai driver.
In genere, la gestione I/O crea un'IRP di lettura o scrittura quando un'applicazione utente richiede un'operazione di lettura o scrittura. Il gestore di I/O passa l'IRP al driver nella parte superiore dello stack di driver e che il driver esegue la richiesta o passa la richiesta al driver inferiore successivo. Alcune richieste viaggiano nella parte inferiore dello stack e alcune vengono completamente elaborate da driver di livello superiore.
Ogni volta che un driver riceve un'IRP, il driver riceve anche un puntatore all'oggetto dispositivo che rappresenta il dispositivo che deve gestire l'operazione. Pertanto, i driver in uno stack di driver usano oggetti dispositivo per determinare quale dei dispositivi collegati a una determinata richiesta dovrebbe andare.
I driver WDF in genere non accedono direttamente ai provider di integrazione. Il framework converte gli IP WDM che rappresentano operazioni di controllo I/O di lettura, scrittura e dispositivo in oggetti di richiesta framework che Kernel-Mode Driver Framework (KMDF) e i driver UMDF ricevono nelle code di I/O. Il framework gestisce PnP e power management IRP internamente e usa funzioni di callback degli eventi per informare il driver di PnP ed eventi di alimentazione.