/Gh(_penter 후크 함수 사용)
모든 메서드나 함수를 시작할 때 _penter 함수가 호출됩니다.
/Gh
설명
_penter 함수는 라이브러리의 일부가 아니며 _penter에 대한 정의는 사용자가 결정합니다.
_penter를 명시적으로 호출하지 않는 경우 프로토타입을 제공하지 않아도 됩니다. 이 함수는 다음과 같은 프로토타입을 갖고 있는 것처럼 나타나야 하며, 시작 시 모든 레지스터의 내용을 푸시하고 종료 시 변경되지 않은 내용을 팝해야 합니다.
void __declspec(naked) _cdecl _penter( void );
이 선언은 64비트 프로젝트에 사용할 수 없습니다.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.
C/C++ 폴더를 클릭합니다.
명령줄 속성 페이지를 클릭합니다.
추가 옵션 상자에 컴파일러 옵션을 입력합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- AdditionalOptions를 참조하십시오.
예제
다음 코드를 /Gh를 사용하여 컴파일하면 _penter는 main 함수를 시작할 때와 x 함수를 시작할 때 각각 한 번씩 두 번 호출됩니다.
// 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
}
}