Visual Studio 2017 を使用することをお勧めします

/Gh (_penter フック関数の有効化)

 

公開日: 2016年7月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

すべてのメソッドまたは関数の先頭で _penter 関数を呼び出します。

/Gh  

_penter 関数はライブラリ関数ではなく、_penter の定義はユーザー自身が行います。

_penter 関数のプロトタイプを宣言する必要があるのは、_penter 関数を明示的に呼び出す場合だけです。 この関数は、次に示すプロトタイプがあらかじめ宣言されているものとして記述します。この関数では、呼び出し元から制御が渡された時点ですべてのレジスタの内容をプッシュし、呼び出し元に制御を返す時点でそれをポップして元の状況に戻す必要があります。

void __declspec(naked) _cdecl _penter( void );  

この宣言は、64 ビット プロジェクトには使用できません。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。

  2. [C/C++] フォルダーをクリックします。

  3. [コマンド ライン] プロパティ ページをクリックします。

  4. [追加のオプション]ボックスにコンパイラ オプションを入力します。

このコンパイラ オプションをコードから設定するには

次のコードは、/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  
    }  
}  

In a function!
In a function!

コンパイラ オプション
コンパイラ オプションの設定

表示: