2013-05-11 4 views
1

좋습니다. 이상합니다. 그런 코드 줄을 본 것은 처음입니다. 기본적으로 프로그램의 PE 헤더에서 오프셋 (주소)을 지정하면 응용 프로그램의 진입 점이 호출됩니다.void 포인터 void 형 캐스트 ​​함수 호출?

내가 알듯이 - 최근에 내 자신의 PE 로더를 작성하여 연주했습니다. 나는 아직 초보자이며 구조를 이해하려고 시도하고있다. 그러나 그 함수 호출은 정확히 무엇을 의미 하는가?

((void (*) (void)) EntryPoint)();

//where 0x4484502 is gotten from: 

PIMAGE_NT_HEADERS nt_header; 
DWORD EntryPoint = nt_header->OptionalHeader.ImageBase + nt_header->OptionalHeader.AddressOfEntryPoint; 

((void(*)(void))0x4484502)(); 

답변

2

라인

((void(*)(void))0x4484502)(); 

무효 파라미터를 가지며, 공극 반환하는 함수 (즉, 주소에서 시작)에 점 정수 0x4484502 캐스트. 캐스트되면 함수 포인터가 호출됩니다.

편집 : 그냥 .... 질문을 다시 읽어 EntryPoint와 0x4484502이 ... 변수 EntryPoint 무효 PARAMS을 가지고 있으며, 무효 반환하는 함수에 대한 포인터로 캐스팅 정확히 같은 일을 대체합니다. 포인터는 함수 호출에 사용됩니다.

+0

오에 같은 이상한 선언을 확인하실 수 있습니다, 난을 참조하십시오. 설명해 주셔서 감사합니다. 나는 전에 공허 (*)를 본 적이 없기 때문에 혼란 스러웠습니다. Google은 아무 것도 쓸모가 없었습니다. 방금 void 포인터 (voidSTAR)를주었습니다. –

+0

는 일반 함수 포인터 :) 도움 다행이 로 선언'복귀 형 (* ptr_name)을 (.. 파라메터), 예를 들어 ' 'INT (* F) (INT 짧은)'포인터는 ,'f'를 int를 리턴하고 int와 short라는 두 개의 매개 변수를 받아들이는 함수에 보낸다. – Jimbo

0

표기

(some_type)something 

는 C 스타일 캐스트입니다. 이는 C++ 캐스트의 시퀀스와 동일하지만 dynamic_cast이 없으므로 위험합니다. 파생 클래스 함수뿐만 아니라 파생 클래스에 대한 포인터까지 private 기반 포인터를 캐스팅 할 수 있습니다.

여기에서 우리는 0x4484502 무효 소요 무효 반환하는 함수에 포인터로 캐스트하는 것을 의미

(void(*)(void))0x4484502 

있습니다.

표기 func_ptr()

함수가 func_ptr 가리키는 호출 수단.


당신은 항상 cdecl