次の方法で共有


移植性があります。

すべてのドライバーは、Windows でサポートされているすべてのハードウェア プラットフォーム間で移植可能である必要があります。 クロスプラットフォームの移植性を実現するには、ドライバー ライターは次の操作を行う必要があります。

  • C のコード (アセンブリ言語は使用しない)。

  • WDK で提供されているプログラミング インターフェイスとヘッダーのみを使用して Windows とやり取りします。

C でのドライバーのコーディング

すべてのカーネル モード ドライバーを C で記述して、システムと互換性のある C コンパイラで再コンパイルでき、コードを書き換えたり置き換えたりすることなく、異なる Microsoft Windows プラットフォームで再リンク、実行できるようにする必要があります。 ほとんどのオペレーティング システム コンポーネントは C で完全にコード化され、アセンブリ言語で記述された HAL コンポーネントとカーネル コンポーネントはわずかな部分のみです。このため、オペレーティング システムはハードウェア プラットフォーム間で簡単に移植できます。 カーネル モード ドライバーでは多くの C++ 言語コンストラクトを使用できないため、そのようなコンストラクトを使用して慎重に評価する必要があります。 ドライバーに C++ 機能が含まれている場合に発生する問題の詳細については、「カーネル モード ドライバーの C++: 長所と短所」のホワイト ペーパーを参照してください。

システムと互換性のある特定の C コンパイラまたは C サポート ライブラリの機能が、システムと互換性のある他のコンパイラでサポートされるという保証がない場合は、ドライバーがこれらの機能に依存しないようにしてください。 一般に、ドライバー コードは ANSI C 規格に準拠する必要があり、この規格で "implementation-defined (実装で定義されている)" と記述されているものには依存しないようにします。

移植可能なドライバーを記述するには、次を避けることが最善です。

  • プラットフォーム間でサイズやレイアウトが異なる可能性があるデータ型への依存関係。

  • 状態を維持する標準 C ランタイム ライブラリ関数の呼び出し。

  • オペレーティング システムが代替サポート ルーチンを提供する標準 C ランタイム ライブラリ関数の呼び出

WDK で提供されるインターフェイスの使用

各 Windows NT エグゼクティブ コンポーネントは、ドライバーとその他のすべてのカーネル モード コンポーネントが呼び出すカーネル モード ドライバーのサポート ルーチンのセットをエクスポートします。 サポート ルーチンの基礎となる実装が時間の経過に伴って変化した場合、定義コンポーネントへのインターフェイスが変更されないため、呼び出し元は移植可能な状態で維持されます。

WDK では、ドライバー (およびその他のすべてのカーネル モード コンポーネント) が使用するシステム固有のデータ型と定数を定義するヘッダー ファイルのセットが用意されており、プラットフォーム間での移植性を維持するのに役立ちます。 すべてのカーネル モード ドライバーには、Wdm.h または Ntddk.h のいずれかのマスター WDK カーネル モード ヘッダー ファイルが含まれています。 マスター ヘッダー ファイルは、基本的なカーネル モードの種類を定義するシステム提供のヘッダーだけでなく、ドライバーが対応するコンパイラ ディレクティブを使用してコンパイルされるときに、プロセッサ アーキテクチャ固有のヘッダーからの適切な選択も取り込みます。

SCSI ミニポート ドライバーNDIS ドライバービデオ ミニポート ドライバーなど、一部のドライバーには、システム提供の他のヘッダー ファイルが含まれています。

ドライバーにプラットフォーム依存の定義が必要な場合は、適切なハードウェア プラットフォーム用に各ドライバーをコンパイルしてリンクできるように、#ifdef ステートメント内にこれらの定義を分離することをお勧めします。 ただし、WDK マスター ヘッダー ファイルで提供されるサポート ルーチン、マクロ、定数、型を使用して、ドライバーにプラットフォーム固有の、条件付きでコンパイルされたコードを実装することをほぼ回避できます。

カーネル モード ドライバーは、WDK に記載されているカーネル モードの RtlXxx ルーチンを使用できます。 カーネル モード ドライバーは、ユーザー モードの RtlXxx ルーチンを呼び出すことはできません。