Freigeben über


Portabel

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

  • Code in C (keine Assemblysprache).

  • Interagieren Sie mit Windows, indem Sie nur die Programmierschnittstellen und Header verwenden, 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 die Verwendung solcher Konstrukte sorgfältig auswerten. Weitere Informationen zu Problemen, die auftreten, wenn Treiber C++-Features enthalten, finden Sie im Whitepaper C++ für Kernelmodustreiber: Vor- und Nachteile .

Treiber sollten sich nicht auf die Features einer bestimmten systemkompatiblen C-Compiler- oder C-Unterstützungsbibliothek 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 portable Treiber zu schreiben, sollten Sie Folgendes vermeiden:

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

  • Aufrufen einer beliebigen C-Runtime-Standardbibliotheksfunktion, die den Zustand aufrecht erhält.

  • Aufrufen einer beliebigen C-Runtime-Standardbibliotheksfunktion, für die das Betriebssystem eine alternative Unterstützungsroutine bereitstellt.

Verwenden WDK-Supplied Schnittstellen

Jede ausführende Windows NT-Komponente exportiert eine Reihe von Kernelmodustreiberunterstützungsroutinen, die Von Treibern und allen anderen Kernelmoduskomponenten aufgerufen werden. 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.

Das 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 zur anderen zu gewährleisten. Alle Kernelmodustreiber enthalten eine der master WDK-Kernelmodusheaderdateien Wdm.h oder Ntddk.h. Die master Headerdateien ziehen nicht nur vom System bereitgestellte Header ein, die die grundlegenden Kernelmodustypen definieren, sondern auch geeignete Auswahlen aus allen prozessorarchitekturspezifischen Headern, wenn ein Treiber mit der entsprechenden Compilerdirektive kompiliert wird.

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

Wenn ein Treiber plattformabhängige Definitionen erfordert, ist es am besten, diese Definitionen in #ifdef-Anweisungen zu isolieren, sodass jeder Treiber kompiliert und für die entsprechende Hardwareplattform verknüpft werden kann. Sie können jedoch fast immer die Implementierung von plattformspezifischem, bedingt kompiliertem Code in einem Treiber vermeiden, indem Sie die Supportroutinen, Makros, Konstanten und Typen verwenden, die die WDK-master-Headerdateien bereitstellen.

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