やじうまPC Watch

.NET FrameworkをWindows 95にバックポートした強者現る

 MattKC氏が、.NET FrameworkをWindows 95にバックポートした様子を動画としてYouTubeに11日公開した。

 Visual Studioでは、現在も.NET Framework 2.0をサポートしており、Windows 98(Second Edition)でも動作するアプリケーションを作成できる。しかし、Windows 95では.NET Frameworkがサポートされておらず、動作させることができない。同氏は、ゲーム「LEGO Island」のMODおよびパッチツールである「LEGO Island Rebuilder」(同氏開発)の旧バージョンを使ってテストしながらバックポートに挑戦した。

 まず、.NET Frameworkのインストールを試みたが、ライブラリが見つからないとインストーラのエラーが発生する状態だった。これはVisual Studioでコンパイルを行なった際に、アプリの動作に必要ない場合でも、デフォルトでいくつかのライブラリがアプリにリンクされてしまい、それらの依存関係の影響を受けてしまうためだという。ツールを使って足りないライブラリを特定し、代用したり、偽のライブラリを用意したりして呼び出しを処理したり対処したという。

 それでもインストールが進められないため、インストーラ自体の解析や改造を試みたが、これは困難だった。そこで、インストール時に実行されるレジストリ値の登録をそのまま移植した。数は5,409個にもなったという。加えて、グローバルアセンブリキャッシュのインストーラも移植し、インストール操作自体は完了できた。

 しかし、実際にLEGO Island Rebuilderを起動しようとするとエラーが発生。調べてみると、「ndphlpr.vxd」と呼ばれるドライバを呼び出していることが原因だと判明。Windows 98では使われていないものだが、.NETが起動する際に必要になるという。このドライバについて分析したところ、実際には.NETがドライバに対して「0x86427531」を送り、ドライバが「0x40」を返すだけの動作だったため、これを再現するよう修正を施した。

 それでもエラーは解消できず、Windows 95上ではエラーメッセージが提示するようなジャストインタイムデバッグができないため、Windows 95対応のマシンコードデバッガ(WinDbg)を使って、Windows 98上のものと並べて、何日もかけて命令を1つずつ実行しながらデバッグを進めていったという。

 その結果、「F2 0F 10 44 24 08 F2 0F 2C C0」の命令でエラーが発生していて、これがSSE2のCVTTSD2SI命令であることが分かった。本来、SSE2非対応CPUにも対応するため、SSE2命令を使用する際に対応状況をチェックをするコードが各所に入っていたが、この部分のみコードが抜けており、エラーが発生してしまっていたという。

 この部分への対応を行なうと、LEGO Island Rebuilderの起動が可能になった。この時点ではUIを操作すると例外エラーが起こる状態だったが、欠けている別のWindows APIを呼び出そうとしていることが原因だったため、これを修正。すると、問題なくアプリの起動と動作が可能になった。

 同氏が作製した、Windows+Shift+Sキーによるスクリーンショット機能を再現するアプリも動作するようになっており、.NET FrameworkのWindows 95へのバックポートに成功したとしている。

LEGO Island Rebuilderが動く様子
Windows+Shift+Sキーでスクリーンショットを撮影する自作アプリも動作したという
I ported THOUSANDS of apps to Windows 95