/Gh(启用 _penter 挂钩函数)
引起在每个方法或函数的开头调用 _penter
函数。
语法
/Gh
备注
_penter
函数不属于任何库。 由你提供 _penter
的定义。
除非计划显式调用 _penter
,否则无需提供原型。 该函数必须在进入时推送所有寄存器的内容,并在退出时弹出未更改的内容。 必须看起来像是具有以下原型:
void __declspec(naked) __cdecl _penter( void );
此声明不适用于 64 位项目。
在 Visual Studio 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“命令行”属性页。
在“附加选项”框中输入编译器选项。
以编程方式设置此编译器选项
- 请参阅 AdditionalOptions。
示例
以下代码在使用 /Gh 编译时显示 _penter
如何被调用两次;一次是在输入函数 main
时,一次是在输入函数 x
时。 该示例由两个单独进行编译的源文件组成。
源文件 local_penter.cpp
:
// local_penter.cpp
// compile with: cl /EHsc /c local_penter.cpp
// processor: x86
#include <stdio.h>
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
}
}
源文件 Gh_compiler_option.cpp
:
// Gh_compiler_option.cpp
// compile with: cl /EHsc /Gh Gh_compiler_option.cpp local_penter.obj
// processor: x86
#include <stdio.h>
void x() {}
int main() {
x();
}
运行时,本地 _penter
函数在输入到 main
和 x
时被调用:
In a function!
In a function!