Вызов функции приведения пустого указателя пустого типа?

Хорошо, это странно. Впервые вижу такую ​​строчку кода. По сути, это вызывает точку входа в приложение после того, как вы указали смещение (адрес) от заголовка PE программы.

Как вы понимаете, в последнее время я играюсь с написанием собственного 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)();

person Andy Carter    schedule 11.05.2013    source источник


Ответы (2)


Линия

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

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

РЕДАКТИРОВАТЬ: Просто перечитайте вопрос.... замена 0x4484502 на EntryPoint делает то же самое... переменная EntryPoint приводится как указатель на функцию, которая имеет параметры void и возвращает void. Затем указатель используется для вызова функции.

person Jimbo    schedule 11.05.2013
comment
Ага, понятно. Спасибо за объяснение. Я был сбит с толку, потому что никогда раньше не видел void(*). Google тоже не был находчивым — он просто дал мне недействительные указатели (voidSTAR). - person Andy Carter; 11.05.2013
comment
Рад, что это помогло :) В общем случае указатель на функцию объявляется как return-type (*ptr_name)(..parameters); Например, int (*f)(int, short) — это указатель, f, на функцию, которая возвращает int и принимает два параметра, int и short. - person Jimbo; 12.05.2013

обозначение

(some_type)something

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

здесь у нас есть

(void(*)(void))0x4484502

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

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

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


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

person 4pie0    schedule 07.07.2013