Portabile

Tutti i driver devono essere portabili in tutte le piattaforme hardware supportate da Windows. Per ottenere la portabilità multipiattaforma, i writer di driver devono:

  • Codice in C (nessun linguaggio di assembly).

  • Interagire con Windows usando solo le interfacce di programmazione e le intestazioni fornite nel WDK.

Driver di codifica in C

Tutti i driver in modalità kernel devono essere scritti in C in modo che possano essere ricompilati con un compilatore C compatibile con il sistema, rilinkato ed eseguito in piattaforme Microsoft Windows diverse senza riscrivere o sostituire qualsiasi codice. La maggior parte dei componenti del sistema operativo è codificata interamente in C, con solo piccole parti dei componenti HAL e kernel scritti nel linguaggio di assembly, in modo che il sistema operativo sia facilmente portatile tra piattaforme hardware. Non è possibile usare molti costrutti del linguaggio C++ nei driver in modalità kernel, pertanto è consigliabile valutare attentamente l'uso di tali costrutti. Per altre informazioni sui problemi che si verificano quando i driver includono funzionalità C++, vedere il white paper C++ for Kernel Mode Driver: Pro e Cons .

I driver non devono basarsi sulle funzionalità di un determinato compilatore C compatibile con il sistema o la libreria di supporto C se tali funzionalità non sono garantite da altri compilatori compatibili con il sistema. In generale, il codice driver deve essere conforme allo standard ANSI C e non dipende da nulla che questo standard descrive come "implementazione definita".

Per scrivere driver portatili, è consigliabile evitare:

  • Dipendenze di tipi di dati che possono variare in dimensioni o layout da una piattaforma a un'altra.

  • Chiamata a qualsiasi funzione di libreria di runtime C standard che mantiene lo stato.

  • Chiamata a qualsiasi funzione di libreria di runtime C standard per cui il sistema operativo fornisce una routine di supporto alternativa.

Uso di interfacce WDK-Supplied

Ogni componente esecutivo di Windows NT esporta un set di routine di driver in modalità kernel che supportano le routine che chiamano driver e tutti gli altri componenti in modalità kernel. Se l'implementazione sottostante di una routine di supporto cambia nel tempo, i chiamanti rimangono portabili perché l'interfaccia al componente di definizione non cambia.

WdK fornisce un set di file di intestazione che definiscono tipi di dati e costanti specifici del sistema che i driver (e tutti gli altri componenti in modalità kernel) usano per mantenere la portabilità da una piattaforma a un'altra. Tutti i driver in modalità kernel includono uno dei file di intestazione in modalità kernel WDK master, Wdm.h o Ntddk.h. I file di intestazione master estraggono non solo le intestazioni fornite dal sistema che definiscono i tipi di base in modalità kernel, ma anche le selezioni appropriate da eventuali intestazioni specifiche dell'architettura del processore quando un driver viene compilato con la direttiva del compilatore corrispondente.

Alcuni driver, ad esempio i driver miniport SCSI, idriver NDIS e i driver miniport video, includono altri file di intestazione forniti dal sistema.

Se un driver richiede definizioni dipendenti dalla piattaforma, è consigliabile isolare tali definizioni all'interno di istruzioni #ifdef , in modo che ogni driver possa essere compilato e collegato per la piattaforma hardware appropriata. Tuttavia, è quasi sempre possibile evitare di implementare codice specifico della piattaforma, compilato in modo condizionale in un driver usando le routine di supporto, le macro, le costanti e i tipi forniti dai file di intestazione master WDK.

I driver in modalità kernel possono usare routine RtlXxx in modalità kernel documentate in WDK. I driver in modalità kernel non possono chiamare routine RtlXxx in modalità utente.