[基礎解説]

Windowsの互換性テクノロジの仕組み(前編)
―― アプリケーションの互換性を支えるシステムとは ――

1.互換性問題が生じるワケ

佐藤 芳樹
2010/06/17
Page1 Page2 Page3

 マイクロソフトによれば、2009年9月から提供の始まったWindows 7は、2010年5月時点で国内の企業5000社以上に販売され、世界的にはこれまでで最も早いペースで販売が伸びているという(同社のプレスリリース「Windows 7法人向け販売が堅調に推移、企業内導入が本格化」)。Windows XPの延長サポート終了(2014年4月)までに移行すべく、いまも多くの企業がWindows 7の導入を検討していることだろう。

 しかし移行に当たっては、現在のWindows XPクライアントで稼働中の業務アプリケーションが、Windows 7でも正常に利用できるのか、という点が気掛かりだ。過去にも、Windows OSのバージョンが上がって互換性が失われ、既存のアプリケーションが正常に実行できなくなることはあった。Windows 7でも同様の互換性問題が生じないか、心配になるのは無理からぬことだ。

 こうしたアプリケーションの互換性問題に対して、マイクロソフトが用意している解決策のうちの1つが、本稿で取り上げる「Windows互換性テクノロジ」である。先に種を明かすと、これはWindows OS標準装備の技術の1つで、読者諸氏が使用中のWindowsでも既知の互換性問題を解消するのに役立っているのだ。その仕組みと利用方法を理解すれば、個々のアプリケーションの互換性問題にも柔軟に対処できるようになる。

 そこで、Windows 7への移行を検討しているシステム管理者を対象に、前編となる本稿ではWindows互換性テクノロジの動作原理や役割についてまとめる。後編では、Windows互換性テクノロジをカスタマイズしてアプリケーションの互換性問題を解決する手順について詳しく説明する。

アプリケーションの互換性問題が生じる理由

 Windows XP用に開発されたアプリケーションがWindows 7上で動作する際、同じWindows OSなのになぜ互換性問題が発生することがあるのか。それはWindows OSの歴史から1つの答えが考えられる。Windows 2000やWindows XPは、NT5カーネルと呼ばれる1990年代に設計されたカーネルをベースに開発されている。一方、Windows VistaやWindows 7は、Longhornカーネルと呼ばれる最新のカーネルをベースに開発されている。

Windows OSの歴史とカーネルの移り変わり
Windows NT 4.0とWindows 2000、Windows XPとWindows Vistaの間でそれぞれカーネルが変更されている。Windows 7のカーネルはLonghornカーネルとなっている。

 カーネルが異なると、どのような影響が出るのか。それにはいくつか要素が考えられるが、最新カーネルにおけるセキュリティ・アーキテクチャの変更が最も大きな影響を及ぼす。例えば、Longhornカーネルには整合性レベルという新しい考え方が取り入れられている。これは、アプリケーションの実行プロセスを高/中/低の3段階で定義するというもので、低プロセスから中プロセス、中プロセスから高プロセスへのメッセージのやり取りを遮断するという機能を実装している。NT5カーネルではこのような実装はされていなかったため、今まで何事もなくメッセージのやり取りができていたアプリケーション同士がやり取りに失敗してしまうことになる。また、管理者権限で動作するプロセスに対する振る舞いも変更されているため、これまでAdministratorsグループに所属しているユーザーであれば可能だったことが、そのままではできなくなってしまうことも考えられる。

 具体的にどのような問題が起こるのか、その一例をお見せしよう。Windows 7の発売前に購入したPCにWindows 7をインストールし、あるデバイス・ドライバを組み込もうとした際、次のようなエラー画面が表示された。このエラーは、Windows 7のセキュリティ・アーキテクチャの実装変更が原因で、デバイス・ドライバのインストール時にセットアップ・プログラムを管理者権限へ昇格することに失敗してしまった例である。

互換性問題によって発生したエラーの例
Windows 7で、あるデバイス・ドライバのセットアップ・プログラムを実行したところ、このエラー・メッセージが表示された。Windows 7のセキュリティ・アーキテクチャの実装変更により、セットアップ・プログラムが管理者権限へ昇格できなくなってしまったことが原因だ。

Windows互換性テクノロジの動作原理

 Windows OSには、上記のようなアプリケーションとOSの間で発生し得る互換性問題を回避するための仕組みとして「Windows互換性テクノロジ」と呼ばれる機能が標準で実装されている。このテクノロジはWindows 7から新しく搭載されたものではなく、実はWindows 2000の時代からずっと存在している。しかしながら、もちろんこのテクノロジはOSバージョンが上がるごとに向上し、より多くの場面で活用できるものとなってきている。

 ここでは、Windows互換性テクノロジがどのような仕組みでどのように動作するのか、説明する。

Windows互換性テクノロジの実体「shim」
 Windows互換性テクノロジの実体は、アプリケーションとOSの間を取り持つ「shim」と呼ばれる仲介アプリケーション(追加コード)である。shimは、Windows OSへの要求、Windows OSからの応答、またはその両方に変更を加えることができる。要は、互換性のない要求や応答を途中で偽装して、不具合が生じないようにつじつまを合わせてしまうのだ。

shimの動作
Windows互換性テクノロジの実体であるshimは、アプリケーションからWindows OSへの要求(上図の操作A)や、Windows OSからアプリケーションへの応答(操作B)を偽装することで互換性問題を回避する。

shimの動作原理
  一般的にWindows APIは、DLLの集合体を使用して実装されている。Windows向けに構築されたアプリケーションは、Windows APIのDLLをインポートし、各関数の呼び出し先アドレスが格納されたテーブル(インポート・アドレス・テーブル)をメモリ上に読み込んで動作する。shimは、このアドレスをshimエンジン(shimeng.dll)のアドレスに置き換えることでAPIインターセプト(APIに割り込んで間で動作する)を実現している。

アプリケーションの起動とshim読み込みの仕組み
アプリケーションを実行すると、通常、WindowsのローダがDLLをメモリにマップ後、インポート・アドレス・テーブル(IAT)を参照し、初期化処理が実行される。一方、shim関数の適用が要求されている場合は、APIがフックされ、shimが呼び出される。
実行ファイル(EXEファイルなど)からアプリケーションを実行する。
Windowsのローダにより、設定されているshimを適用する。
適用されたshimからフックするAPI情報を取得する。
メモリ上のIATを参照して、フックを配置する場所を決定する。
APIにリダイレクトして、Windows内の関数の代わりにshim関数を実行する。

 shimエンジンはアプリケーションのプロセス内の1つのDLLにすぎないため、アプリケーションから見ると、自分からの要求がWindows OSではなくshimエンジンに送信されていることを認識することはない。同様にWindows OSから見ても、要求がアプリケーション以外の送信元から来ていることを認識することはない。そのため、このようなAPIインターセプトによる処理の偽装が可能となっている。

OSのバージョン偽装shimの例
  このように処理を偽装するためのshimはたくさん存在するが、その中でも特によく利用されるのはOSバージョン偽装shimである。このshimを利用することで、アプリケーションがWindows OSのどのバージョンで実行されているかを特定するために使用するいくつかのAPIをインターセプトできる。通常、このバージョン照会の要求はアプリケーションからWindows OSに渡され、Windowsが正しいバージョン情報を返すという動きをする。しかしバージョン偽装shimが適用されると、こうしたAPIがインターセプトされ、実際と異なるWindows OSのバージョン情報が返される(例えば、Windows 7の真のバージョン「6.1」の代わりに Windows XPの「5.1」が返される)。

バージョン偽装shimの動作例
アプリケーションが「GetVersionEx」というAPIでバージョン情報を照会すると、本来のWindows 7では「6.1」が返される。しかしWindows 2000 Service Pack 3のバージョン偽装をするWin2000SP3VersionLie shimが適用されていると、本来の「6.1」ではなく「5.0」となる。Windows XP Service Pack 2用の偽装shimが適用されている場合は、同様に「5.1」が返される。

 アプリケーションがWindows OSのバージョンをチェックしてWindows XP上でのみ動作するようにプログラミングされている場合には、この方法により、たとえWindows 7上で動作していたとしても、Windows XP上で実行されているとアプリケーションに認識させることが可能となる。

 次のページでは、Windows 7における互換モード機能とshimとの関係や、古いアプリケーションとの互換性確保に効果的なshimについて解説する。


 INDEX
  [基礎解説]Windowsの互換性テクノロジの仕組み(前編)
  1.互換性問題が生じるワケ
    2.Windows 7との互換性を確保する「shim」
    3.互換性テクノロジが効果を発揮する場面
 
  [基礎解説]Windowsの互換性テクノロジの仕組み(後編)
    1.Application Compatibility Toolkit(ACT)とは?
    2.ACTで「互換性データベース」を作る
    3.Windows互換性テクノロジの限界と活用
 基礎解説


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間