すべてのドライバーは、Windows でサポートされているすべてのハードウェア プラットフォーム間で移植可能である必要があります。 クロスプラットフォームの移植性を実現するには、ドライバー ライターは次の操作を行う必要があります。
C のコード (アセンブリ言語なし)。
WDK で提供されているプログラミング インターフェイスとヘッダーのみを使用して Windows と対話します。
C でのドライバーのコーディング
すべてのカーネル モード ドライバーを C で記述して、システム互換の C コンパイラで再コンパイルし、再リンクし、コードを書き換えたり置き換えたりすることなく、異なる Microsoft Windows プラットフォームで実行できるようにする必要があります。 ほとんどのオペレーティング システム コンポーネントは、アセンブリ言語で記述された HAL コンポーネントとカーネル コンポーネントの小さな部分のみで、C で完全にコード化されるため、オペレーティング システムはハードウェア プラットフォーム間で簡単に移植できます。 カーネル モード ドライバーでは多くの C++ 言語コンストラクトを使用できないため、そのようなコンストラクトを使用して慎重に評価する必要があります。 ドライバーに C++ 機能が含まれている場合に発生する問題の詳細については、 カーネル モード ドライバーの C++ の長所と短所 に関するホワイト ペーパーを参照してください。
ドライバーは、特定のシステム互換 C コンパイラまたは C サポート ライブラリの機能に依存しないでください。これらの機能が、他のシステム互換コンパイラでサポートされるとは限りません。 一般に、ドライバー コードは ANSI C 標準に準拠する必要があり、この標準で "実装定義" と記述されているものには依存しません。
ポータブル ドライバーを記述するには、次を避けるのが最善です。
サイズやレイアウトがプラットフォームによって異なる可能性があるデータ型への依存関係。
状態を維持する標準 C ランタイム ライブラリ関数を呼び出します。
オペレーティング システムが代替サポート ルーチンを提供する標準 C ランタイム ライブラリ関数を呼び出します。
WDK-Supplied インターフェイスの使用
各 Windows NT エグゼクティブ コンポーネントは、ドライバーとその他のすべてのカーネル モード コンポーネントが呼び出すカーネル モード ドライバー サポート ルーチンのセットをエクスポートします。 サポート ルーチンの基になる実装が時間の経過と同時に変化する場合、定義コンポーネントへのインターフェイスは変更されないため、呼び出し元は移植可能なままになります。
WDK には、あるプラットフォームから別のプラットフォームへの移植性を維持するためにドライバー (およびその他のすべてのカーネル モード コンポーネント) が使用するシステム固有のデータ型と定数を定義するヘッダー ファイルのセットが用意されています。 すべてのカーネル モード ドライバーには、wdm.h または Ntddk.h のいずれかのマスター WDK カーネル モード ヘッダー ファイルが含まれています。 マスター ヘッダー ファイルは、基本的なカーネル モードの種類を定義するシステム提供のヘッダーだけでなく、ドライバーが対応するコンパイラ ディレクティブを使用してコンパイルされるときに、プロセッサ アーキテクチャ固有のヘッダーからの適切な選択も取り込みます。
SCSI ミニポート ドライバー、NDIS ドライバー、ビデオ ミニポート ドライバーなど、一部のドライバーには、他のシステム提供のヘッダー ファイルが含まれています。
ドライバーにプラットフォーム依存の定義が必要な場合は、適切なハードウェア プラットフォーム用に各ドライバーをコンパイルしてリンクできるように、 #ifdef ステートメント内でこれらの定義を分離することをお勧めします。 ただし、WDK マスター ヘッダー ファイルで提供されるサポート ルーチン、マクロ、定数、および型を使用して、ドライバーにプラットフォーム固有の条件付きでコンパイルされたコードを実装することをほとんど常に回避できます。
カーネル モード ドライバーは、WDK に記載されているカーネル モード RtlXxx ルーチンを使用できます。 カーネル モード ドライバーは、ユーザー モード RtlXxx ルーチンを呼び出すことはできません。