Cygwin上でPEACE

NetBSD、FreeBSDでWin32アプリケーションを動かすためのプログラム群PEACEの一部をCygwin/XFreeで動作するようにしてみました。

動機

はじめてX Window Systemを触ったとき、Xのアプリケーションが実行するコンピュータと表示するコンピュータを別にすることが出来ることを知って、すごいなと思ったものです。Windowsでもいまでは、Terminal Serviceやリモートデスクトップなどがありますが、デスクトップ全体が表示されてしまうのでXのアプリケーションのようにアプリケーション単位ということが出来ません。また、表示するコンピュータもWindowsに限られます。

そこで、PEACEがGDI.DLLやUSER32.DLL等のGUIの機能をXlibを使用して実現しているのに目をつけ、このPEACEをWindows(Cygwin/XFree)に移植すればWindowsでもWindowsのアプリケーションをXのアプリケーションのようなネットワーク透過にできると思い、移植してみることにしました。

やったこと

基本的にUSER32.DLL、GDI32.DLLの実 実装であるui.soを移植しています。やったのは...

これで、一応makeが通るようになりました。

あと、プログラムがCreateWindowEx等のWin32APIを呼ぶ代わりにPEACEのCreateWindowEx等を呼ばせるようにするために Microsoft ResearchのDetoursというプログラムを利用するようにしました。

現状

私が試した中では、マインスイーパーぐらいしか動きません。

あと、Cygwin版のXFreeがXShmをサポートしていないせいか遅いです。

実行確認環境

ダウンロード

ビルド

PEACEのmake

$ tar zxvf cygpeace-030316.tar.gz
$ cd peace/dll/cygpeace
$ make
$ make install

Detoursのサンプルwithdllのmake(Visual C++が必要です)

$ ./detours.exe ([unzip to folder:] ./detours)
$ cd detours
$ rm lib/detours.pdb
$ nmake
$ cp samples/bin/withdll.exe /usr/local/bin/

実行

$ export PEACE_FONTPATH=`cygpath -u $WINDIR/Fonts`
$ export DISPLAY=:0.0
$ XWin -rootless &
$ openbox &
$ withdll -d:peacehook.dll winmine

ライブラリとして

$ cat msgbox.c

#include <windows.h>
int main()
{
    MessageBox(NULL, "test", NULL, MB_OK);
    return 0;
}

$ gcc msgbox.c -o msgbox -L/usr/local/lib -lui.so
$ export DISPLAY=:0.0
$ ./msgbox

スクリーンショット

参考リンク

mail