/Gh (_penter フック関数の有効化)
すべてのメソッドまたは関数の先頭で _penter 関数を呼び出します。
/Gh
解説
_penter 関数はライブラリ関数ではなく、_penter の定義はユーザー自身が行います。
_penter 関数のプロトタイプを宣言する必要があるのは、_penter 関数を明示的に呼び出す場合だけです。この関数は、次に示すプロトタイプがあらかじめ宣言されているものとして記述します。この関数では、呼び出し元から制御が渡された時点ですべてのレジスタの内容をプッシュし、呼び出し元に制御を返す時点でそれをポップして元の状況に戻す必要があります。
void __declspec(naked) _cdecl _penter( void );
この宣言は、64 ビット プロジェクトには使用できません。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダーをクリックします。
[コマンド ライン] プロパティ ページをクリックします。
[追加のオプション]ボックスにコンパイラ オプションを入力します。
このコンパイラ オプションをコードから設定するには
- AdditionalOptions を参照してください。
使用例
次のコードは、/Gh を使ってコンパイルしたときに、_penter がどのようにして 2 回呼び出されるかを示しています。つまり、main 関数に入ったときと、x 関数に入ったときに 1 回ずつ呼び出されます。
// Gh_compiler_option.cpp
// compile with: /Gh
// processor: x86
#include <stdio.h>
void x() {}
int main() {
x();
}
extern "C" void __declspec(naked) _cdecl _penter( void ) {
_asm {
push eax
push ebx
push ecx
push edx
push ebp
push edi
push esi
}
printf_s("\nIn a function!");
_asm {
pop esi
pop edi
pop ebp
pop edx
pop ecx
pop ebx
pop eax
ret
}
}