exeに設定を書けばポータブル
- エロゲが名前付きMMファイルを作る
- エロゲが適当なほかののプロセスに対して監視スレッドを流し込む
- 監視スレッドはMMファイルのハンドルを開き、エロゲのプロセス終了に対して待機状態に入る
- エロゲがMMファイルの値を更新し、いずれ終了する
- 待機していた監視スレッドが再開し、MMファイルの情報を元にエロゲの実行ファイルを書き換える
エロゲを再起動した場合、MMファイルが生きていれば1-3のステップは省略できることになる。
Adminならcsrss.exeに流せば監視スレッドは絶対生きてることが保証されるからキレイ。Usersならマルチプロセスで相互監視するとかして信頼性を高める必要がある。テンポラリファイルを使うってのは美しくない。設定ファイルは論外。
設定はバイナリ形式のリソースにするのが柔軟。リソースのセクションブロックを追加したりすることができれば、マルチユーザに対応できるかもしれない。
そういえばProgram Filesにあるファイルには書き込みできないような気もするが、どうでもいい。
VistaSP1+VC9でDetours Express 2.1をビルドしたメモ
- Detoursをダウンロードしてインストール
- コンパイルエラーになる部分を修正
- detoured.dll にASLRが適用されるようにビルドするならMakefileを編集
- スタートメニューの[Visual C++ 9.0 Express Edition]->[Visual Studio Tools]->[Visual Studio 2008 Command Prompt]を管理者権限で実行
- カレントディレクトリをインストールディレクトリまで移動する。
標準ではC:\Program Files\Microsoft Research\Detours Express 2.1
>cd C:\Program Files\Microsoft Research\Detours Express 2.1 - ビルド。
>nmake
コンパイルエラーになる部分を修正は以下のとおり。
- .\samples\findfunc\symtest.cpp の83行目あたりが次のようになっているのでconstに変更
//static BOOL WINAPI SymEnumerateCallback(PSTR pszModule, static BOOL WINAPI SymEnumerateCallback(PCSTR pszModule,
- .\samples\traceapi\_win32.cpp の先頭のほう(適当な場所)にwarning無効を追加。
#pragma warning(disable: 4995)
- .\samples\traceapi\_win32.cpp の395・5983・6037・7379行目の代入でキャストを追加。
//= CheckColorsInGamut; = reinterpret_cast<BOOL (__stdcall *)(HDC,LPVOID,LPVOID,DWORD)>(CheckColorsInGamut);
//= ReadConsoleA; = reinterpret_cast<BOOL (__stdcall *)(HANDLE,LPVOID,DWORD,LPDWORD,LPVOID)>(ReadConsoleA);
//= ReadConsoleW; = reinterpret_cast<BOOL (__stdcall *)(HANDLE,LPVOID,DWORD,LPDWORD,LPVOID)>(ReadConsoleW);
//= SystemTimeToTzSpecificLocalTime; = reinterpret_cast<BOOL (__stdcall *)(LPTIME_ZONE_INFORMATION,LPSYSTEMTIME,LPSYSTEMTIME)>(SystemTimeToTzSpecificLocalTime);
これでおk。実際に作業するときは管理者でログオンしてからのほうがストレスがない。
2006年から更新されていないライブラリなので今更感があるが、自前のAPIフックよりはましだろう。