連載
» 2010年09月09日 00時00分 公開

64bit Windows時代到来:第4回 64bit版デバイス・ドライバ (1/3)

64bit版Windowsではデバイス・ドライバを64bit対応させるだけでなく、コードの改ざんなどを防ぐためにデジタル署名も必須となっている。

[打越浩幸,デジタルアドバンテージ]
64bit Windows時代到来
Windows Server Insider


「64bit Windows時代到来」のインデックス

連載目次


 前回は64bit版Windows OS環境におけるアプリケーションの互換性問題について見てきた。今回は連載の最後として、64bit版Windows OS導入時の最大の懸念事項と思われる、64bit版デバイス・ドライバの話題について触れる。

デバイス・ドライバ・アーキテクチャの変遷

 デバイス・ドライバとは、Windows OSカーネル内部にあって、特定のハードウェア・デバイスの制御やデータ入出力などを行うための、特別なソフトウェアのことを指す。OSカーネルのコードはOSのバージョンやエディションによらず、すべて同じものが使われるが、ハードウェアの構成の違いについては、デバイス・ドライバがその違いを吸収する。利用されているデバイスに応じてドライバを変えることにより、数多くのハードウェアのバリエーションに対応できるし、使われているハードウェアに必要なデバイス・ドライバだけをロードすることにより、OS全体のサイズも最適化される(最小にできる)。

 現在のWindows OSで利用されるデバイス・ドライバのアーキテクチャにはいくつか種類がある。

アーキテクチャ 対象OS 概要
DDK(Device Driver Development Kit) Windows 9x/Windows NT 3.x DDKはアーキテクチャ名ではなく、単なる機能セット名。OSごとに、個別に提供されていた
WDM(Windows Driver Model) Windows NT 4.0〜/Windows 2000/Windows XP/Windows Server 2003以降 Windows 9xとWindows NT系列のドライバを統合したアーキテクチャ。DDKをベースに、電源管理やプラグ&プレイなど、新しいハードウェア機能のサポートや、機能(ドライバ・モデル)の整理などが行われている
WDF(Windows Driver Foundation) Windows Vista/Windows Server 2008/Windows 7/Windows Server 2008 R2以降 カーネル・モードとユーザー・モードで動作するモジュールを分割し、カーネル側では最低限の機能だけを実装するようにしている。これにより、デバイス・ドライバの不具合でシステム全体がクラッシュする危険性を減らし、安全性を高めている。ユーザー・モードのドライバではWin32 APIが利用できるし、カーネル・モードのデバッグほど難しくないので、開発も用意になるなどのメリットがある
Windows OS向けの主なデバイス・ドライバ・アーキテクチャ
ここでは概要のみを示しているが、Windows OSのリリースに合わせてWDMやWDF自身の仕様もいくらか強化、進化している。最新のWindows 7/Windows Server 2008 R2でも従来のWDM形式のデバイス・ドライバは利用できるが(一部制限はあるが、逆に、WDFを従来のWindows 2000でも利用することなども可能)、64bitのカーネル・モード・ドライバではデジタル署名が必須になっているなど、要求仕様に若干の違いがある。

 WDFはWindows Vista/Windows Server 2008以降で導入された新しいドライバ・モデルであり(一部機能に制限は付くが、それ以前のOSで利用することも可能)、従来のWDMと比較すると、カーネル・モードで動作するコード(KMDF:Kernel Mode Driver Framework)とユーザー・モードで動作するコード(UMDF:User Mode Driver Framework)が分離されたのが大きな特徴である。

 従来はデバイス・ドライバのコードはほぼすべてカーネル・モードで動作していたが、何らかの理由でデバイス・ドライバがクラッシュすると、システム全体も同時にクラッシュしてしまう可能性があった。カーネル・モードではOS内のすべてメモリやデータにアクセスできてしまうからだ。

 これに対して新しいWDFモデルでは、カーネル側には必要最小限の機能だけを置き、必ずしもカーネル・モードで処理する必要のない機能はユーザー・モードで実装することができる。例えばネットワーク・インターフェイス・カードの場合なら、データを読み書きしたり、割り込みなどを処理したりするドライバは高速性/リアルタイム性が求められるのでカーネル・モードに置くが、上位のプロトコル処理(TCP/IPやBluetooth、FireWireなど)はユーザー・モードで処理しても構わない。ユーザー・モード側に置けば、たとえ不具合が発生しても終了するのはそのプロセスだけであり(ユーザー・モードではプロセス空間は独立している)、ほかのプロセスやカーネル・コードが巻き込まれてクラッシュする可能性が低くなる。カーネル・モードとユーザー・モードの分離モデルを採用することにより、システム全体の信頼性を高くできる。

 KMDFの開発では、カーネル・モード専用のデバッグ環境を用意したり、特別なコマンドを利用したりするなど簡単ではない。だがUMDFの開発は、C++言語やCOMインターフェイス、Win32 APIといった、従来から慣れ親しんだ開発ツールやデバッグ手法などが利用できる。今後はこのWDFモデルに基づくデバイス・ドライバ開発が主流になるであろう。

 デバイス・ドライバの開発に関する情報は、以下のサイトなどを参照していただきたい。

 Windows OS向けデバイス・ドライバ開発用のソフトウェアを「WDK(Windows Driver Kit)」というが、これは以下のサイトで配布されている。原稿執筆時点では、WDK 7.1.0がリリースされている。

デジタル署名が必須の64bitデバイス・ドライバ

 64bit Windows OSでは、ユーザーのアプリケーションは32bitコードでも64bitコードでも実行できるが、デバイス・ドライバは64bitコードで記述されていなければならない。Windows OSのカーネルやそれを構成するコンポーネントはすべて64bitコードで記述されているからだ。第2回「Win32アプリケーションを実行するWOW64」で解説したような、32bitと64bitのアプリケーション・プログラム間での中継(「サンク」という)を行うような機能は、デバイス・ドライバでは利用できない。64bit Windows OSのデバイス・ドライバは、64bit幅のポインタを使って、オーバー4Gbytes以上のアドレス空間を操作できるように作らなければならない。とはいえ第2回で述べたように、過去との互換性を重視するプログラミング・モデルを採用しているので、デバイス・ドライバであっても32bit版と64bit版ではポインタのサイズ以外に大きな違いはなく、64bit対応のデバイス・ドライバが作りやすくなっている。

 64bit版Windows OSで要求されるデバイス・ドライバは、32bit版Windows OSで要求されるデバイス・ドライバとほぼ同じであるが、次のような制限がある。

  • カーネル・モードで動作するデバイス・ドライバにはデジタル署名が必須

 ここでいうデジタル署名とは、カーネル・モードのデバイス・ドライバを構成するファイル(*.SYSファイルなど)に対して、そのファイルの作成者は誰か、そのファイルの内容は正しいか(改変されていないか)などということを保証するために付けられる、電子的な署名のことである。従来の32bit Windows OSでもデバイス・ドライバに対してデジタル署名を付けることはできたし、多くのデバイス・ドライバが署名を行っていたが、必ずしもすべてのデバイス・ドライバがデジタル署名を持っているというわけではなかった。だが、64bit版のWindows OSではこのデジタル署名が必須になり、署名のないドライバは、(デフォルトでは)インストールもロードもできなくなっている。これはつまり、そのデバイスが利用できなくなるということである(ユーザー・モードで動作するデバイス・ドライバの場合は、現在のWindows 7やWindows Server 2008 R2ではまだ必須ではない。しかし信頼性を重視するために、将来はこの設定が変更される可能性がある)。

デジタル署名の付いたデバイス・ドライバの例
これは64bit版Windows 7に標準で含まれているイーサネット・インターフェイスのデバイス・ドライバの署名の例。
 (1)Windows 7の標準ドライバなので、マイクロソフト社のデジタル署名(ハードウェア互換認証をパスしたという署名)が付けられている。

 デジタル署名が付けられたデバイス・ドライバのインストール用ファイル(.INFファイル)の例を次に示しておく。「CatalogFile.NT = 〜」の行がデジタル署名のカタログ・ファイル(.CATファイル)を指定する変数である。なお、64bit Windows OS用のデバイス・ドライバの場合、セクション名の最後に「.NTamd64」というタグが付けられている。64bit Windows(x64 Windows)では、この指定が存在するセクションのみを処理するようになっている。もし存在しなければ、それはほかのアーキテクチャ(通常は32bitのx86)向けのデバイス設定ファイルである。

64bit Windows OS用デバイス・ドライバ設定ファイルの例
これはx64版Windows OS向けのデバイス・ドライバの設定情報ファイル(.INFファイル)の例である。デバイス・ドライバの作り方にもよるが、このように32bit版と64bit版では別の設定ファイルが用意されていることが多い。
 (1)これはデバイス・ドライバの正当性を示すデジタル署名ファイル(カタログ・ファイル。拡張子は.CAT)へのリンク。
 (2)x64版(AMD64もしくはIntel 64用)の設定ファイルには、このようにセクション名の末尾に「.NTamd64」という文字列が付加されている。
 (3)x64向けのデバイス・ドライバ・ファイルの記述。

 デジタル署名はカタログ・ファイル(.CATファイル)に保存され、通常はデバイス・ドライバを構成するファイル(.SYSや.EXE、.DLLなど)と共に配布されている。このファイルをダブルクリックすると、次のように署名の内容を確認できる。

デジタル署名の例
上のネットワーク・インターフェイス・カードに付けられていたデジタル署名ファイルの例。「netrtx64.cat」ファイルをエクスプローラでダブルクリックすると表示される。このファイルはインストールされると、%Windir%\System32\Catrootもしくはドライバ・ストア・フォルダ(%Windir%\System32\DriverStore)フォルダに保存される。
 (1)このタブを選択すると、個別のファイルに付けられているデジタル署名のハッシュ値を確認できる。1つのカタログ・ファイルに複数のドライバ・ファイルに対する署名を保存できる。
 (2)セキュリティ・カタログの内容。
 (3)デジタル署名の内容や署名に利用されている証明書パスなどを確認できる。


       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。