Freigeben über


Tragbar

Alle Treiber müssen auf allen windows-unterstützten Hardwareplattformen portierbar sein. Um plattformübergreifende Portabilität zu erreichen, sollten Treiberautoren:

  • Code in C (keine Assemblysprache).

  • Interagieren Sie mit Windows nur mithilfe der Programmierschnittstellen und Header, die im WDK bereitgestellt werden.

Codieren von Treibern in C

Alle Kernelmodustreiber sollten in C geschrieben werden, damit sie mit einem systemkompatiblen C-Compiler neu kompiliert, neu verknüpft und auf verschiedenen Microsoft Windows-Plattformen ausgeführt werden können, ohne Code neu zu schreiben oder zu ersetzen. Die meisten Betriebssystemkomponenten sind vollständig in C codiert, wobei nur kleine Teile der HAL- und Kernelkomponenten in der Assemblysprache geschrieben sind, sodass das Betriebssystem problemlos auf Hardwareplattformen portierbar ist. Sie können nicht viele C++-Sprachkonstrukte in Kernelmodustreibern verwenden, daher sollten Sie diese Konstrukte sorgfältig auswerten. Weitere Informationen zu Problemen, die auftreten, wenn Treiber C++-Features enthalten, finden Sie im Whitepaper "C++" für Kernelmodustreiber: Pros und Cons .

Treiber sollten sich nicht auf die Features eines bestimmten systemkompatiblen C-Compilers oder einer C-Supportbibliothek verlassen, wenn diese Features nicht garantiert von anderen systemkompatiblen Compilern unterstützt werden. Im Allgemeinen sollte der Treibercode dem ANSI C-Standard entsprechen und nicht von etwas abhängen, das dieser Standard als "implementierungsdefiniert" beschreibt.

Um tragbare Treiber zu schreiben, empfiehlt es sich, Folgendes zu vermeiden:

  • Abhängigkeiten von Datentypen, die je nach Größe oder Layout von einer Plattform zu einer anderen variieren können.

  • Aufrufen einer beliebigen C-Laufzeitbibliotheksfunktion, die den Zustand verwaltet.

  • Aufrufen einer beliebigen C-Laufzeitbibliotheksfunktion, für die das Betriebssystem eine alternative Supportroutine bereitstellt.

Verwenden von WDK-Supplied Schnittstellen

Jede Windows NT-Executive-Komponente exportiert eine Reihe von Kernelmodustreiberunterstützungsroutinen, die Treiber und alle anderen Kernelmoduskomponenten aufrufen. Wenn sich die zugrunde liegende Implementierung einer Supportroutine im Laufe der Zeit ändert, bleiben die Aufrufer portabel, da sich die Schnittstelle zur definierenden Komponente nicht ändert.

Der WDK stellt eine Reihe von Headerdateien bereit, die systemspezifische Datentypen und Konstanten definieren, die Treiber (und alle anderen Kernelmoduskomponenten) verwenden, um die Portabilität von einer Plattform zu einer anderen zu gewährleisten. Alle Kernelmodustreiber enthalten eine der Master-WDK-Kernelmodusheaderdateien, Wdm.h oder Ntddk.h. Die Masterheaderdateien rufen nicht nur vom System bereitgestellte Header ein, die die grundlegenden Kernelmodustypen definieren, sondern auch geeignete Auswahlen von prozessorarchitekturspezifischen Headern, wenn ein Treiber mit der entsprechenden Compilerdirektive kompiliert wird.

Einige Treiber, z. B. SCSI-Miniporttreiber, NDIS-Treiber und Videominiporttreiber, enthalten andere vom System bereitgestellte Headerdateien.

Wenn ein Treiber plattformabhängige Definitionen erfordert, empfiehlt es sich, diese Definitionen in #ifdef Anweisungen zu isolieren, damit jeder Treiber kompiliert und für die entsprechende Hardwareplattform verknüpft werden kann. Sie können jedoch fast immer verhindern, dass plattformspezifischer, bedingt kompilierter Code in einem Treiber mithilfe der Supportroutinen, Makros, Konstanten und Typen implementiert wird, die die WDK-Masterheaderdateien bereitstellen.

Kernelmodustreiber können Kernelmodus-RtlXxx-Routinen verwenden, die im WDK dokumentiert sind. Kernelmodustreiber können keine Rtl Xxx-Routinen im Benutzermodus aufrufen.