Windows Driver Model
Windows Driver Model (WDM) とは、Windows 98とWindows 2000で導入されたデバイスドライバーのフレームワークであり、それ以前のWindowsで使われていたVxDなどを代替するものとして登場した。導入当時はWin32 Driver Modelと呼ばれていた。
WDMドライバーは複雑に階層化されており、I/O要求パケット (I/O Request Packet, IRP) を使って相互に通信する。WDMは、各種要求を標準化し書くべきコード量を削減した統一的ドライバーモデルとして、Windows 98とWindows 2000向けに定義された。WDMドライバーは、それ以前のWindows(Windows 95やWindows 3.1、Windows NT 4.0など)では動作しない。WDMに従ったドライバーは、Windows 98 / Windows 98 Second Edition / Windows Me / Windows 2000 / Windows XP / Windows Server 2003 / Windows Vistaが動作するx86ベースのコンピュータでバイナリ互換とソースコード互換を実現する。WDMは前方互換を保つよう設計されている。すなわち、ある版のWDMはそれ以前の版のWDMに従って書かれたドライバーと互換性を有する。そのようなWDMドライバーは新たなOS機能を利用することはできないが、新たなOS上でも動作自体は可能である。逆方向の互換性はない。すなわち、新しい版に従ったドライバーを古いOSで使おうとすると失敗する。例えば、Windows XPのWDMはWindows 2000向けドライバーをロード可能だが、Windows XPの新規機能は使えない。逆にWindows 2000のWDMはWindows XP向けドライバーをロードできない。
WDM仕様に準拠するカーネルモードドライバーはWDMドライバー(WDM driver)と呼ばれる。
WDMはWindows 2000のカーネルモードドライバーの中間層として存在し、Windows向けドライバー作成に際しての機能を増やし、ドライバーを書きやすくすることを意図していた。WDMはWindows 98とWindows 2000の間でバイナリ互換性およびソースコード互換性を保つよう設計された。WDMドライバーは以下のように分類される。
ファンクションドライバーは、デバイス用の主要なドライバーである。ファンクションドライバーはデバイスベンダーが作成するのが普通である。1つのドライバーが複数のデバイスを制御することもできる。
他のクラスドライバーやミニポートドライバーをその上に構築できる、一種のフレームワークドライバー。WDMアーキテクチャの異なる階層間のインターフェイスを提供する。異なるクラス階層に属するドライバー間の共通機能はクラスドライバーとして書くことができ、それを他のクラスドライバーやミニポートドライバーから利用する。クラスドライバーの最下層側はミニポートドライバーとのインターフェイスを持ち、最上層側はOSとのインターフェイスを持つ。クラスドライバーは必要に応じて、動的にロード / アンロードできる。ハードウェアやバス固有の機能というよりも、クラス固有の機能を持つことが多く、場合によっては単なる列挙 (enumeration) のような機能しか持たないこともある。
USB、サウンドカード、SCSI、ネットワークカードなどに対応したファンクションドライバー。これらはWindowsのバージョン間でバイナリおよびソースコード互換性があり、ハードウェア固有のものだが、ハードウェアへのアクセス制御を固有バスのクラスドライバー経由で行なう。
バスドライバーは、バスコントローラー、バスアダプター、バスブリッジなどを扱う。マイクロソフトが提供しているバスドライバーとしては、PCI、PnPISA、SCSI、USB、IEEE 1394などがある。各ベンダーは必要に応じて独自のバスドライバーを作成できる。バスドライバーは、同じタイプのバスが複数あれば、それらをまとめて制御できる。
フィルタードライバーはオプション的なドライバーであり、機能を付加したりデバイスの動作を変更したりするドライバーや、デバイスとは関係ないドライバーが属する。フィルタードライバーは同時に複数のサービスを提供できる。上位層のフィルタードライバーは、デバイス用ファンクションドライバーの上位に位置し、下位層のフィルタードライバーはファンクションドライバーとバスドライバーの中間に位置する。
カーネルレベルのフィルタードライバーであり、Windowsサービスとして実装され、アプリケーションからデバイスを使えるようにする。
Windows 98系OS (98, 98SE, Me) は、WDMとVxDの両標準をサポートしている。これらは同じハードウェアに対して異なる機能を提供するが、Windows Me登場以降の世代のハードウェアではWDMの方が機能が豊富なものがあった。例えば、TVチューナーカードをVxDドライバーで使うと画像の解像度が384×288ピクセルだったものが、同じカードをWDMドライバーで使うと768×576ピクセルが可能となることがある。これは、WDMの一部であるBroadcast Driver Architectureによる改善である。
しかし、改良された機能を使用するにはハードウェアベンダーの努力が不可欠である。
古いハードウェアではVxDドライバーでは持っていた機能の一部が、WDMドライバーには提供されずに開発が終了されたものも。また、Windows 9x系のWDMはNtkern.vxdという一種のVxDドライバーがNTカーネルをエミュレートする形であったため、逆にパフォーマンスや安定性で不利になることもあった。
Windows Driver Modelは、それ以前のVxDとWindows NTドライバーモデルを大幅に改良したが、以下のような点でドライバー開発者から批判されている。
WDMは習熟が困難である。
電源管理イベントとプラグアンドプレイの連携が難しい。これは、ドライバーコードにおけるバグのせいでWindowsマシンが正しくスリープあるいは復帰できないといった様々な状況を引き起こす。
I/Oの取り消しがほぼ不可能である。
全てのドライバーに似たような大量のサポートコードを書く必要がある。
純粋なユーザーモードドライバーを書くためのサポートが存在しない。
また、マイクロソフトが提供する文書やサンプルについてもいくつかの問題が指摘されている。
このような問題があるため、マイクロソフトはWDMの代替となる新たなフレームワークWindows Driver Foundationをリリースした。これには、Kernel-Mode Driver Framework (KMDF) とUser-Mode Driver Framework (UMDF) が含まれる。Windows VistaはWDMとWindows Driver Foundationの両方をサポートしている。KMDFはWindows XPとWindows 2000向けにダウンロード可能であり、UMDFはWindows XP向けにダウンロード可能となっている。
Windowsドライバーはセキュリティ上の配慮から、正式な作成者を確認することのできるデジタル署名を行なってリリースすることが推奨されている。デジタル署名の手段としてはWHQL (Windows Hardware Quality Labs) 署名もしくはAuthenticode署名(自己署名)が存在する。Windows Vista以降の32bit版OSでは署名のないドライバーをインストールしようとした際に警告が表示されるものの、インストールおよび動作は可能となる。一方、64bit版OSでは署名のないカーネルモードのドライバーを動作させることはできない。署名のないドライバーをインストールおよび動作できるテストモードも用意されているが、これは開発者向けの内部テスト目的であり、エンドユーザー環境では推奨されない。
Windows 8では、64bit版においてカーネルモードだけでなくユーザーモードのドライバーも署名が必須となった。
Windows 10では2016年1月1日のSHA-1証明書廃止ポリシーを受けて、カーネルモードのドライバーは32bit/64bitにかかわらずマイクロソフト社による署名が必須となることが予定されている。ユーザーモードのドライバーに関しては、Windows 8.1同様にAuthenticode署名が利用可能である。