2013-05-11 5 views
1

Хорошо, это странно. Это первый раз, когда я видел такую ​​строку кода. В основном это вызывает точку входа в приложение, как только вы указали смещение (адрес) из PE-заголовка программы.Void pointer void type cast function call?

Как вы можете сказать - я играл в последнее время с написанием своего собственного загрузчика 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 до точки к функции (начиная с этого адреса), который имеет недействительные параметры и возвращает недействительным. После нажатия на него вызывается указатель на функцию.

EDIT: Просто перечитайте вопрос .... заменить 0x4484502 с EntryPoint делает то же самое ... переменная EntryPoint отливают как указатель на функцию, которая имеет недействительные Params и возвращает недействительным. Затем указатель использовал функцию вызова.

+0

О, я вижу. Спасибо, что объяснили. Я был смущен, потому что раньше я не видел пустоты (*). Google не был находчивым - он просто дал мне указатели void (voidSTAR). –

+0

Рад, что это помогло :) В общем случае указатель функции объявлен как 'return-type (* ptr_name) (.. parameters);' Например, 'int (* f) (int, short)' является указателем , 'f', к функции, которая возвращает int и принимает два параметра: int и short. – Jimbo

0

обозначения

(some_type)something 

это C-стиль литья. Он равен последовательности C++-кастингов, но без dynamic_cast, так что это опасно - это позволяет отбрасывать указатель на частную базу на указатель на производный класс не только в функции производного класса.

здесь мы имеем

(void(*)(void))0x4484502 

это означает, что 0x4484502 отливают в указатель на функцию, которая принимает недействительным и возвращает недействительным.

обозначение func_ptr()

означает вызвать функцию, на которую указывает func_ptr.


вы всегда можете проверить такие странные заявления на cdecl

 Смежные вопросы

  • Нет связанных вопросов^_^