22 |
|
|
23 |
// VS2005でビルドされたバイナリが Windows95 でも起動できるようにするために、 |
// VS2005でビルドされたバイナリが Windows95 でも起動できるようにするために、 |
24 |
// IsDebuggerPresent()のシンボル定義を追加する。 |
// IsDebuggerPresent()のシンボル定義を追加する。 |
25 |
// さらにWindows Sockets2.0のインストールも必要。 |
// |
26 |
EXTERN_C BOOL WINAPI _imp__IsDebuggerPresent(void) |
// cf.http://jet2.u-abel.net/program/tips/forceimp.htm |
27 |
|
// 装飾された名前のアドレスを作るための仮定義 |
28 |
|
// (これだけでインポートを横取りしている) |
29 |
|
EXTERN_C int WINAPI _imp__IsDebuggerPresent() |
30 |
|
{ return PtrToInt((void*) &_imp__IsDebuggerPresent); } |
31 |
|
// 実際に横取り処理を行う関数 |
32 |
|
EXTERN_C BOOL WINAPI Cover_IsDebuggerPresent() |
33 |
|
{ return FALSE; } |
34 |
|
// 関数が実際に呼び出されたときに備えて |
35 |
|
// 横取り処理関数を呼び出させるための下準備 |
36 |
|
EXTERN_C void __stdcall DoCover_IsDebuggerPresent() |
37 |
{ |
{ |
38 |
return FALSE; |
DWORD dw; |
39 |
|
DWORD_PTR FAR* lpdw; |
40 |
|
// 横取り関数を設定するアドレスを取得 |
41 |
|
lpdw = (DWORD_PTR FAR*) &_imp__IsDebuggerPresent; |
42 |
|
// このアドレスを書き込めるように設定 |
43 |
|
// (同じプログラム内なので障害なく行える) |
44 |
|
VirtualProtect(lpdw, sizeof(DWORD_PTR), PAGE_READWRITE, &dw); |
45 |
|
// 横取り関数を設定 |
46 |
|
*lpdw = (DWORD_PTR)(FARPROC) Cover_IsDebuggerPresent; |
47 |
|
// 読み書きの状態を元に戻す |
48 |
|
VirtualProtect(lpdw, sizeof(DWORD_PTR), dw, NULL); |
49 |
} |
} |
50 |
|
// アプリケーションが初期化される前に下準備を呼び出す |
51 |
|
// ※ かなり早くに初期化したいときは、このコードを |
52 |
|
// ファイルの末尾に書いて「#pragma init_seg(lib)」を、 |
53 |
|
// この変数宣言の手前に書きます。 |
54 |
|
// 初期化を急ぐ必要が無い場合は WinMain 内から |
55 |
|
// DoCover_IsDebuggerPresent を呼び出して構いません。 |
56 |
|
EXTERN_C int s_DoCover_IsDebuggerPresent |
57 |
|
= (int) (DoCover_IsDebuggerPresent(), 0); |
58 |
|
|
59 |
int PASCAL WinMain(HINSTANCE hInstance, |
int PASCAL WinMain(HINSTANCE hInstance, |
60 |
HINSTANCE hPrevInstance, |
HINSTANCE hPrevInstance, |