コンピューティングにおいて、Windows Driver Model ( WDM )は、かつてはWin32 Driver Modelとも呼ばれていたデバイスドライバのフレームワークであり、Windows 98およびWindows 2000で導入され、 Windows 95やWindows 3.1などの古いバージョンの Windows で使用されていたVxDやWindows NT Driver Modelに取って代わりました。
WDM ドライバーはスタックに階層化され、 I/O 要求パケット(IRP)を介して相互に通信します。Microsoft Windows ドライバー モデルは、要件を標準化し、記述する必要のあるコードの量を削減することで、Windows 9x および Windows NT 製品ラインのドライバー モデルを統合しました。WDM ドライバーは、Windows 95 (WDM モデルをサイドロードする OSR2 アップデートの前)、Windows NT 4.0、Windows 3.1 など、Windows 98 または Windows 2000 より前のオペレーティングシステムでは実行できません。WDM に準拠することで、ドライバーはx86ベースのコンピューター上のWindows 98、Windows 98 Second Edition、Windows Me、Windows 2000、Windows XP、Windows Server 2003間でバイナリ互換性とソース互換性を維持できます。WDM ドライバーは前方互換性を持つように設計されているため、ドライバーが最初に作成されたバージョンよりも新しいバージョンの Windows で実行できますが、そうすると、ドライバーは新しいバージョンで導入された新機能を利用できなくなります。 WDMは一般的に下位互換性がありません。つまり、WDMドライバが古いバージョンのWindowsで動作することは保証されていません。例えば、Windows XPはWindows 2000用に作成されたドライバを使用できますが、Windows XPで導入された新しいWDM機能は利用できません。ただし、Windows XP用に作成されたドライバがWindows 2000でロードされるかどうかは保証されません。
WDMはWinHEC 1996で発表され、当初はWindows NT 5.0のコアドライバモデルとして登場しました。[ 1 ] WDMはWindows 2000カーネルモードドライバの中間層に存在し、Windowsのドライバ作成の機能性と容易性を向上させるために導入されました。WDMは主にWindows 98とWindows 2000の間でバイナリとソースの互換性を持つように設計されましたが、必ずしもそれが望ましいとは限らないため、それぞれのオペレーティングシステム向けに特定のドライバを開発することも可能です。
マイクロソフトは、デバイス向け Windows ドライバ モデル (WDM) で、 Windows オペレーティングシステムに固有のカーネル モードドライバのアプローチを実装しています。WDM はデバイス ドライバの階層型アーキテクチャを実装しており、コンピュータのすべてのデバイスはドライバのスタックによってサービスされます。ただし、そのスタック内の各ドライバは、ハードウェアに依存しない機能を上下のドライバから分離することができます。そのため、スタック内のドライバは互いに直接やり取りする必要はありません。WDM は、ディスプレイやネットワーク カードなどのさまざまなデバイスのアーキテクチャとデバイス手順を定義しており、これはネットワーク ドライバ インターフェイス仕様(NDIS)として知られています。NDIS アーキテクチャでは、階層型ネットワーク ドライバには、ハードウェアを管理する下位レベルのドライバと、伝送制御プロトコル(TCP) などのネットワーク データ転送を実装する上位レベルのドライバが含まれます。[ 2 ]
WDMでは3種類のデバイスドライバが定義されていますが、特定のデバイス用のドライバスタックにはすべての種類のデバイスドライバが含まれているわけではありません。3種類のWDMデバイスドライバは次のとおりです。[ 2 ]
バスドライバ:メインボード上の各バスには1つのバスドライバがあり、そのバスに接続されているすべてのデバイスを識別し、プラグアンドプレイイベントに応答するという主要な責任を負います。Microsoftは、 PCI、PnPISA、SCSI、USB、FireWireなどのバスドライバをオペレーティングシステムの一部として提供します[ 2 ]。
機能ドライバ:これはデバイスの主要なドライバであり、読み取りおよび書き込み操作を処理することでデバイスの動作インターフェースを提供します。機能ドライバはデバイスベンダーによって作成され、ハードウェアとのやり取りには、Windows オペレーティングシステムに特定のバスドライバが存在することに依存します。[ 2 ]
フィルタドライバ:このドライバはオプションであり、入力および出力要求などのデバイスの動作を変更できます。これらのドライバは、下位レベルおよび上位レベルのフィルタドライバとして実装できます。[ 2 ]
関数ドライバとバスドライバは、多くの場合、ドライバ/ミニドライバのペアとして実装されます。実際には、クラスまたはミニクラス、あるいはポートまたはミニポートのペアになります。[ 3 ]
バスに接続されたデバイス用のバスドライバはクラスドライバとして実装され、ハードウェアに依存しません。特定の種類のデバイスの動作をサポートします。Windows オペレーティングシステムには、キーボード用の kbdclass.sys ドライバなど、多くのクラスドライバが含まれています。一方、ミニクラスドライバはデバイスのベンダーによって提供され、特定のクラスの特定のデバイスに対して、デバイス固有の動作のみをサポートします。[ 3 ]
ポートドライバは、周辺ハードウェアインターフェイスの一般的な入出力(I/O)操作をサポートします。ポートドライバのコア機能はオペレーティングシステムによって規定されており、Windowsオペレーティングシステムにはさまざまなポートドライバが統合されています。たとえば、8042マイクロコントローラ用のi8042prt.sysポートドライバは、PS/2キーボードをメインボードの周辺バスに接続します。ミニポートドライバは、ミニクラスドライバと同様に、ハードウェアベンダーによって提供され、メインボード上のポートに接続された周辺ハードウェアのデバイス固有の操作のみをサポートします。[ 4 ] [ 5 ]
デバイスの I/O 要求を処理する各ドライバには、メイン メモリにロードされる対応するオブジェクトがあります。デバイス オブジェクトは、関連付けられたデバイス クラスから Windows オペレーティングシステムによって作成されます。デバイス オブジェクトには、ドライバへのポインタを格納する DEVICE_OBJECT 型の構造体が含まれています。実行時には、これらのポインタを使用してドライバのディスパッチ ルーチンとメンバ関数が特定されます。WDM ドライバ スタックでは、上位フィルタと呼ばれるフィルタ ドライバ デバイス オブジェクトが、 I/O マネージャからデバイスのI/O 要求パケット(IRP) を受信します。上位フィルタ ドライバが要求を処理できない場合、ドライバ スタックの 1 段階下のドライバ オブジェクトが特定されます。IRP は、関数 IoCallDriver() を呼び出すことによってドライバ スタックを下方に渡され、機能デバイス オブジェクトとも呼ばれる機能ドライバ デバイス オブジェクトによって処理されます。機能ドライバ デバイス オブジェクトは、IRP を別のフィルタ デバイス オブジェクトである下位フィルタに渡す場合があります。その後、IRP は物理デバイス オブジェクトとして動作するバス ドライバに渡されます。バスドライバオブジェクトはドライバスタックの最下層にあり、Windowsオペレーティングシステムカーネルの一部であるハードウェア抽象化レイヤーと相互作用します。これにより、Windowsオペレーティングシステムは、さまざまなプロセッサ、さまざまなメモリ管理ユニットアーキテクチャ、およびさまざまなI/Oバスアーキテクチャを持つさまざまなコンピュータシステムで実行できます。[ 6 ] IRPの実行は、スタック内のいずれかのドライバオブジェクトが結果とステータスフラグとともに要求をI/Oマネージャに返したときに終了します。[ 7 ]
WDMフレームワークは、オペレーティングシステムとカーネル内のドライバ間の通信を簡素化するためにMicrosoftによって開発されました。Windowsオペレーティングシステムでは、WDMドライバはポータブル実行可能形式のダイナミックリンクライブラリ(.DLL)または.SYSファイルとして実装されます。WDM準拠のドライバは、設計、初期化、プラグアンドプレイ、電源管理、およびメモリ割り当てのルールに従う必要があります。実際には、WDMドライバプログラマは、新しいオブジェクト指向ドライバを構築する際に、大きなコード片を再利用します。これは、WDMスタックのドライバには、仕様書に記載されていない残存機能が含まれている可能性があることを意味します。[ 7 ] Microsoftの品質テストに合格したドライバは、Microsoftによってデジタル署名されます。Microsoftハードウェア互換性テストとドライバ開発キットには、信頼性テストとストレステストが含まれています。[ 8 ]
特定のハードウェア コンポーネント向けに設計されていないデバイス ドライバでも、別のデバイスが動作する場合があります。これは、ハードウェア デバイス クラスの基本的な機能が似ているためです。たとえば、ビデオ カード クラスの機能により、Microsoft Basic Display Adapter ドライバはさまざまなビデオ カードで動作します。ただし、デバイスに間違ったドライバをインストールすると、デバイスのすべての機能が使用できなくなり、パフォーマンスの低下や Windows オペレーティングシステムの不安定化につながる可能性があります。ハードウェア デバイス ベンダーは、パフォーマンスの向上、機能の追加、またはバグの修正のために、特定の Windows オペレーティングシステム向けに更新されたデバイス ドライバをリリースする場合があります。デバイスが期待どおりに動作しない場合は、ベンダーの Web サイトから最新のデバイス ドライバをダウンロードしてインストールする必要があります。[ 9 ]
デバイス ドライバは特定の Windows オペレーティングシステム バージョン向けに設計されており、以前のバージョンの Windows 用のデバイス ドライバは、他のバージョンでは正しく動作しないか、まったく動作しない可能性があります。多くのデバイス ドライバはカーネル モードで実行されるため、以前のオペレーティングシステム バージョン用のドライバをインストールすると、Windows オペレーティングシステムが不安定になる可能性があります。そのため、コンピュータをより高いバージョンの Windows オペレーティングシステムに移行するには、すべてのハードウェア コンポーネントに新しいデバイス ドライバをインストールする必要があります。最新のデバイス ドライバを見つけてWindows 10にインストールすることは、移行プロセスに複雑さをもたらしています。[ 9 ]
一般的なデバイスドライバの互換性の問題には、32 ビットWindows オペレーティングシステムには 32 ビット デバイスドライバが必要であり、64ビット Windows オペレーティングシステムには 64 ビット デバイスドライバが必要であることが含まれます。64 ビット デバイスドライバはカーネル モードで実行され、コンピュータ ハードウェアへの無制限のアクセス権限を持つため、Microsoft による署名が必要です。Windows 10 より前のオペレーティングシステムでは、ベンダーが互換性テストを実施していることを前提として、Microsoft はベンダー自身による 64 ビット ドライバへの署名を許可していました。しかし、Windows 10 の 64 ビット ドライバは現在、Microsoft による署名が必要です。そのため、デバイス ベンダーはテストと承認のためにドライバを Microsoft に提出する必要があります。ドライバのインストール パッケージには .inf ディレクトリ内のすべてのファイルが含まれており、パッケージ内のすべてのファイルをインストールする必要があります。そうしないと、デバイス ドライバのインストールが失敗する可能性があります。Windows 10 より前のオペレーティングシステム バージョンでは、この要件が一貫して適用されていなかったため、ドライバのインストールに必要なすべてのファイルがパッケージに含まれていませんでした。一部のデバイス ドライバ インストーラにはユーザー インターフェイスGUIがあり、多くの場合、ユーザーによる構成入力が必要です。ユーザーインターフェイスがないからといって、デバイスドライバのインストールが成功していないわけではありません。また、Windows 10 デバイスドライバにはユーザーインターフェイスを含めることは許可されていません。Windows 10 オペレーティングシステムでは、ネットワークデバイスにネットワークドライバインターフェイス仕様(NDIS) 10.x が使用されています。Windows XP用のネットワークデバイスドライバはNDIS 5.x を使用しており、後続の Windows オペレーティングシステムでも動作する可能性がありますが、パフォーマンス上の理由から、ネットワークデバイスドライバは NDIS 6.0 以降を実装する必要があります。[ 9 ]
デバイスマネージャーは、Microsoft Windows オペレーティングシステムのコントロール パネル アプレットです。これにより、ユーザーはコンピューターに接続されているハードウェアを表示および制御できます。ハードウェア デバイスのプロパティを表示および変更することができ、デバイス ドライバーを管理するための主要なツールでもあります。[ 9 ]
Windows ドライバー モデルは、それ以前に使用されていたVxDおよびWindows NT ドライバー モデルに比べて大幅に改善されているものの、ドライバー ソフトウェア開発者から批判を受けており、[ 10 ]特に以下の点が問題視されている。
マイクロソフトが提供したドキュメントやサンプルの品質についても、多くの懸念が表明された。
これらの問題を受けて、マイクロソフトはWDMの上に新たなフレームワーク群であるWindows Driver Frameworks(WDF、旧称Windows Driver Foundation)をリリースしました。これには、カーネルモードドライバーフレームワーク(KMDF)とユーザーモードドライバーフレームワーク(UMDF)が含まれます。Windows Vistaは、純粋なWDMと新しいWDFの両方をサポートしています。KMDFはWindows XPおよびWindows 2000向けにもダウンロード可能で、UMDFはWindows XP以降向けに提供されています。
デバイス クラス固有のドライバー モデルは通常、Microsoft が作成したポート ドライバーと、独立したハードウェア ベンダーが作成したミニポート ドライバーの組み合わせとして構成されます。ポート ドライバーはデバイス クラスに必要な処理の大部分を実行し、ミニポート ドライバーはデバイス固有の特性をサポートします。