フランケンシュタインテストとは?
ソフト開発においてフランケンシュタインテスト(Frankenstein test)とは、異なるシステムの部品を入れ替えてテストすること。あるSF小説に登場するフランケンシュタインと呼ばれる人造人間に由来する。
ReactOSはWindows Server 2003 SP2 (略してWin2k3SP2)をメインターゲットとして開発されており、Win2k3の部品をReactOS内部に入れてテストしたり、ReactOSの部品をWin2k3内部に入れてテストすることはよくある。
フランケンシュタインに成功すれば、入れ替えた部品はある程度、互換性があると言えるが、最悪の場合、システムが起動しないこともあり得る。
準備
VirtualBoxでGuest Additionsを追加した後、ネットワークフォルダを使って評価版のWin2k3の次のファイルを取り出す。
- user32.dll
- gdi32.dll
- winsrv.dll
- win32k.sys
- imm32.dll
これらに対応するReactOSのファイルはアウトプットフォルダ内部の次の場所にある:
- win32ss\user\user32\user32.dll
- win32ss\gdi\gdi32\gdi32.dll
- win32ss\user\winsrv\winsrv.dll
- win32ss\win32k.sys
- dll\win32\imm32\imm32.dll
ビルド時にWin2k3のファイルをReactOS内部に入れる方法
例えばimm32.dllを置き換えたい場合は、次のようにする。
- ReactOSビルド後のアウトプットフォルダの「dll\win32\imm32\imm32.dll」をWin2k3のimm32.dllで置き換える。
- そして置き換えた「imm32.dll」をtouchする(ファイルの日時を現在の日時に更新する)。
- 「ninja bootcd」する。
- できたbootcd.isoを試してみる。
- 置き換わったかどうかを確かめるには、DLLファイルのプロパティのバージョン情報を確認するとよい。
毎回、コピー&touchが面倒なら、次のようなバッチファイル(franken.bat)かシェルスクリプトを作るのをオススメする。ただし、touchというプログラムが必要なのでどこかから取得せねばならない。
rem コピー元。自分の環境に合わせること。
set SRC=C:\Users\katahiromz\Desktop\SHARED\2k3
rem コピー先。自分の環境に合わせること。
set DEST=C:\Users\katahiromz\reactos-1\output-MinGW-i386
copy %SRC%\user32.dll %DEST%\win32ss\user\user32\user32.dll
touch %DEST%\win32ss\user\user32\user32.dll
copy %SRC%\gdi32.dll %DEST%\win32ss\gdi\gdi32\gdi32.dll
touch %DEST%\win32ss\gdi\gdi32\gdi32.dll
copy %SRC%\winsrv.dll %DEST%\win32ss\user\winsrv\winsrv.dll
touch %DEST%\win32ss\user\winsrv\winsrv.dll
copy %SRC%\win32k.sys %DEST%\win32ss\win32k.sys
touch %DEST%\win32ss\win32k.sys
copy %SRC%\imm32.dll %DEST%\dll\win32\imm32\imm32.dll
touch %DEST%\dll\win32\imm32\imm32.dll
pause
touchした状態を元に戻したいのであれば、対象のファイルを消して再ビルドすればいい。対象のファイルを消すバッチ(del-franken.bat)は次のように。
rem コピー先。自分の環境に合わせること。
set DEST=C:\Users\katahiromz\reactos-1\output-MinGW-i386
del %DEST%\win32ss\user\user32\user32.dll
del %DEST%\win32ss\gdi\gdi32\gdi32.dll
del %DEST%\win32ss\user\winsrv\winsrv.dll
del %DEST%\win32ss\win32k.sys
del %DEST%\dll\win32\imm32\imm32.dll
pause
実行時にDLLファイルをシステム内部に入れる方法
WindowsやReactOSでは使用中のDLLファイルはロックされていて、そのままでは置き換えることができないが、katahiromz/DelayedMove を使えば、再起動時にファイルを置き換えることができる。例えば、次のコマンドを実行して再起動すれば、現在のディレクトリにあるimm32.dllに置き換わる。katahiromz/DelayedMove はMoveFileEx
というAPI関数を使っている。
DelayedMove.exe imm32.dll %WINDIR%\system32
改造の邪魔をする、やっかいなファイル保護機能
しかし、Win2k3やWinXPのように「Windows ファイル保護機能(WFP)」が有効ならば、置き換えたはずのシステムファイルが元に戻ってしまう。WFPを無効化するツールは有る/有った(「Disable WFP」で検索してリンク切れのURLをInternet Archiveで漁る)が、ウイルス扱いされている。さあ、どうすればいいのか。ウイルスに対する扱いが中立的なOSを使うことは危険だし、不便。
Windows のセーフモードではWFPが無効化されるが、起動時にファイルが元に戻るので使えない。
特定のバージョンで有効な改造方法があるようだ: http://ttp.nm.land.to/others/wfp.html
sfc_os.dllのSetSfcFileException関数を使った方法もあるようだ(未確認): https://www.codeproject.com/Articles/14933/A-simple-way-to-hack-Windows-File-Protection-WFP-u
コメント