2012年12月3日月曜日

Windows XP で IE9 が動くのか。 (アプリの互換性を考えてみる)

Windows XP で IE9 が動くのか。(アプリの互換性を考えてみる)



結果: ThinAppで仮想化したとしても、Windows XPではIE9は、動きません。
※Windows Vista / Windows 7では動作します。

アプリケーションの仮想化の目的の一つに
「古いOSで動作するアプリを新しいOSで動作させたい」というのがあります。
例) WindowsXPで動くアプリをWindows7で動かす。

古いOSから新しいOSでの動作は、俗にいう
後方互換性です。 "backward compatibility"
新しいOSは、古いOSのアプリがある程度動くように
意識して作られています。

今回のチャレンジは、その逆です。
前方互換性です。"forward compatibility"
Windows XPの立場で考えると、まだ見ぬ新しいOS用に開発されたアプリが
動くかどうかなんか分かるわけ無いのです。
IE9を作った人たちがWindows XPで動くように作ったか否かだけですね。
IE9はWindowsXPで動くように作られていません。



そもそも、OSの主な役割は、アプリを動かすための基盤です。
OSが普及するためには、その上で動作するアプリの数と質が非常に
重要です。

その点、Windowsは圧倒的なアプリの数を誇り
今のポジションにあると言えます。
ゲーム機と似ていますね。
任天堂の携帯型ゲーム機は、1世代前のハードウェア用の
ソフトが遊べるようになっているかと思います。
※細かいところを気にすると例外もあるのでザックリです。
GameBoy->GameBoy Advanced->DS->3DS

1世代前のソフトが遊べると、新しいゲーム機の購入がしやすいですよね。
しかしながら、どうしても古い物に縛られてしまうために
新しくて革新的な物を生み出すためには、足かせになったり
新旧を維持することでコストが上がってしまったりと
全てがうまくいくわけではありませんよね。
PlayStation3の発売時は、PS2のソフトが遊べなくて色々と物議を醸しました
訂正:PlayStation3の発売時(初期型)は、PS2との互換性のためにPS2のCPU(Emotion Engine)とGPUを搭載してました。その後の普及モデルではPS2互換は取り去られました。
スーパーファミコンはファミコンのソフトが遊べなかったりと。

時には、古いアプリを切り捨てて
より前に進む決断をする事もあります。

Windows RTを見ていると、新しい世界に
踏み込む初期フェーズが発動されたんだな~と感じていたりします。
x86用のデスクトップアプリがWindows RT(ARM)では、動かない。
(WindowsRTでは3rdパーティー製は、Windows ストアアプリのみ。)
これからのWindowsは、今までの膨大なソフトウェア資産を維持しつつ、新しいストアアプリが
どんどん増えて行く事で益々盤石な基盤として進歩していくんでしょうか。。。

話が外れてしまいましたが、今回は重要な資産である
Windowsアプリ(今はデスクトップアプリと呼ぶみたい)の互換性について
考えてみたいと思います。

「Windows XP でIE9が動くのか?」
という素朴な疑問について、実際にアプリ仮想化テクノロジーを利用して
結果を確認してみました。
(前方互換性"forward compatibility")

結論から言うと、「WindowsXPでは、IE9は動作しません。」
当たり前の結果が出ました。
それでは、面白く無いのでもう少し掘り下げて、調査してみましたので
お付き合い下さい。

今回利用したアプリ仮想化テクノロジーは、VMware ThinAppです。
(IE6,7,8,9を仮想アプリ化して動作させることができます。)

IE9自体の動作サポートされているOSは、以下になります。
・Windows Vista
・Windows7
※Windows XP は動作環境としてサポートされていません。


始めに、表示されたエラーメッセージについて

「~~~は有効な Win32 アプリケーションではありません」

このメッセージが表示されるパターンは、ざっくり2パターンあります。
・本当にEXEが壊れている場合
・開発者が意図的に実行可能OSのバージョンを指定している場合
 実行OSの最小バージョンとなります。XP(NT5.1)以上とかVista(NT6.0)以上とか。

IE9は、後者になります。
具体的には、バイナリエディタでiexplorer.exeを確認すると
最小OSバージョンがVista(NT6.0)以上となっています。 [06 00 00 00]
※EXEファイルの形式である、PEヘッダーの情報は、こちらで詳しく解説されているので興味ある方は参照ください。
http://codezine.jp/article/detail/403
IMAGE_OPTIONAL_HEADER32のMajorSubsystemVersion、MinorSubsystemVersionの事です。
http://msdn.microsoft.com/ja-jp/library/windows/desktop/ms680339(v=vs.85).aspx


この値をWindows XPでもEXEとして認識できるように「05」へと変更してみました。


その後 ThinAppで改造したiexplorer.exeをパッケージに入れて再Build後にWindowsXPで動作させてみました。

結果:動作しません。
詳細:ADVAPI32.dllで提供されている”はず”のEventWrite APIが見つからないというかミスってる!




MSDNライブラリで、EventWrite APIを検索した結果


http://msdn.microsoft.com/ja-jp/library/windows/desktop/aa363752(v=vs.85).aspx

・ADVAPI32.dllで提供される。
・対応する最小のクライアントOS: Windows Vista

ということで、Windows Vistaから提供される Win32 APIをIE9は利用している事になります。

調査結果から、他にも多数のWindows Vistaから追加されたAPIを利用している可能性があったり、
はじめから、動作環境としてVista以降しか、考慮していないといえます。
そのため、Windows XPなどでは、動かないようにEXE自体に最小限のOSを設定して
「~~~は有効な Win32 アプリケーションではありません」と表示する優しさが感じられました。

アプリ仮想化とWin32 APIとOSの関係について。

ThinAppを持ってしても、IE9は、Windows Vista以降しか動作しませんでした。
しかしながら、IE6は、Windows XP、Vista、7、8で動作します。
この違いが何故なのかについて、まとめてみました。

IE6の動作概要について



IE9の動作概要について


基本APIって、何?
各OSで標準的に備えているWin32 APIと思って下さい。(私が勝手に命名しましたw)
Windowsのアプリが動作するための、基盤は、Win32 Subsystem(Win32.k)です。


追加APIって、何?
OSがバージョンアップすると、追加される物です。
今までは、やりたいことを実現するために、複数のAPIを組み合わせたりしていた
物が、新しく便利なAPIが増えることで、簡単になったり機能が増えたりと。
いいこと多数ですが、前方互換性が損なわれます。


Windows7のAPIのうち、代表的な基本API+追加APIは、以前にまとめた以下の投稿を参照ください。

  • Kernel32.dll (1362個)
  • Nt.dll (1982個)
  • User32.dll (822個)
  • Advapi32.dll (805個)
  • Shell32.dll (333個)


http://tunemicky.blogspot.jp/2012/01/win32apidllexport.html