64ビット版Windows上で16ビットWindows(Windows 1.x、2.x、3.0、3.1など)を実行する
16-bit Windows (Windows 1.x, 2.x, 3.0, 3.1, etc.) on 64-bit Windows (github.com)
要約
このプロジェクトは、64ビット版Windows上で古い16ビットWindowsアプリケーションを実行可能にするための、winevdmエミュレータの改変版です。インストール手順やコンパイル方法、そして内部的な動作原理について説明されています。
全文翻訳
winevdm on 64-bit Windows
64ビット版Windows上で16ビットWindows(Windows 1.x、2.x、3.0、3.1など)を実行する
16ビットWindowsエミュレータであるwinevdmを64ビット版Windowsに移植した改変版です。
実行方法
- VCRUNTIME140.dllが見つからないというエラーが発生した場合は、Microsoft Visual C++ Redistributable for Visual Studio 2017 (32-bit)をインストールしてください。
- Win16実行可能ファイルをotvdm.exeにドラッグアンドドロップするか、otvdmw.exeを実行してください。
インストール方法
- ダウンロードまたはコンパイル
- "install"ショートカットを実行するか、install.infを右クリックして"インストール"を選択してください。
- Win16バイナリを直接実行できるようになります!
レジストリがWindows Updateによって初期化された場合は、上記の手順を再度実行してください。
uninstall.regを実行することでアンインストールできます。
設定
otvdm.iniを参照してください。
コンパイル方法 (Visual Studio)
- Visual Studio 2017をインストールしてください。
- PropertySheet.propsを編集してください。
- コンパイルしてください。
コンパイル方法 (cmake)
git clone https://github.com/otya128/winevdm.git
cd winevdm
mkdir build
cd build
cmake ..
make
動作原理
このプログラムは以下の要素を含んでいます。
-
CPUエミュレータ
- 64ビット版WindowsではLDTを変更できません (NtSetInformationProcess(,ProcessLdtInformation,,)は常にエラーを返します)
-
wineベースのWin16->Win32変換コード:
BOOL16 WINAPI DestroyWindow16( HWND16 hwnd ) { return DestroyWindow( WIN_Handle32(hwnd) ); }16ビットから32ビットへのリレー処理はconvspecによって自動生成されます。
53 pascal -ret16 DestroyWindow(word) DestroyWindow16 -
Win16用のDOSエミュレーション
-
16ビット <=> ネイティブHANDLE変換
-
互換性の問題の修正、互換性の問題の修正
install.inf
64ビット版Windowsは、16ビットインストーラを検出すると、16ビットではない代替インストーラを起動するメカニズムを持っています。このプログラムはそれを利用しています。
WINDOWSディレクトリのリダイレクト
一部のWin16プログラムは、設定を%WINDIR%<filename>.iniに保存しようとします。
最近のWindowsでは%WINDIR%への保存が許可されていないため、リダイレクトが行われます。
winevdm
winevdm.exe [--app-name app.exe] コマンドライン
winevdm.exe CALC.EXE
DOS実行可能ファイル(DOSエミュレータのようなもの)も実行できます。VDMDOSVER環境変数でDOSバージョンを設定できます。
DOSエミュレーションは不完全であり、DOSBoxまたはMS-DOS Playerの使用が推奨されます。