pe_server で dllmain を利用して初期化を行っていたが、dllmain に引数を渡すことで 終了処理にもつかう。
2chで頂いた以下のアドバイスを元にしています.
DllMain()で初期化と終了処理を兼ねさせるなら 動的生成ブートストラップがこんな感じになるかな? (テキトーなんでWindowsの仕様に合わせてはいない) いずれにせよこれやらないとDLLのデストラクタが呼ばれない push dword 0 call monapi:dllmain add esp,4 test eax,eax jz ERROR push dword 0 call monalibc:dllmain add esp,4 test eax,eax jz ERROR call user_start test eax,eax jnz ERROR # DLLと逆なので注意 (続く) 376 Name: Be名無しさん [sage] Date: 2006/12/23(土) 20:19:26 ID: Be: (続き) push dword 1 call monalibc:dllmain # コンストラクタとは逆順で呼ぶ add esp,4 test eax,eax jz ERROR push dword 1 call monalibc:dllmain add esp,4 test eax,eax jz ERROR # 正常終了 ret ERROR: # エラー処理等 ret (続く) 377 Name: Be名無しさん [sage] Date: 2006/12/23(土) 20:24:30 ID: Be: >>376の訂正 訂正 2つ目のcall monalibc:dllmainはmonapi:dllmainの間違い (続き) dllmainの例 extern "C" int dllmain(int reason) { switch (reason) { case 0: // DLL_PROCESS_ATTACH相当 invokeFuncList(__CTOR_LIST__, __FILE__, __LINE__); break; case 1: // DLL_PROCESS_DETACH相当 invokeFuncList(__DTOR_LIST__, __FILE__, __LINE__); break; } return 1; }
コメントはありません。 コメント/議論/標準入出力/ストリームによる実装/11.終了処理?