Страница 1 из 1
Как вызвать API-функцию по номеру?
Добавлено: 23 сен 2004, 00:37
droopy
В Windows довольно часто вызывают системные процедуры по номерам (call KERNEL32_47). Адрес берётся не через LoadLibrary, а сразу связываестя при загрузке. Как заставить masm32 сделать такое? Может, нужен def-файл?
Добавлено: 23 сен 2004, 14:15
Romeo
Как это "связывается при загрузке"?
Добавлено: 23 сен 2004, 15:03
Andy
Значит так. Тема эта довольно интересная, но заголовок темы и собственно вопрос подразумевают разные вещи.
Вызвать функцию из DLL по номеру довольно просто. Если известен номер нужной функции конечно. Все конкретные ответы можно узнать если спросить об этом секцию экспорта в DLL (Export Section). Описание формата экзешника я приводить не буду. Если нету - можно найти в интернете. Так вот в Export Section есть указатель на массив адресов (а также и номеров) функций. Поэтому немного извратнувшись можно вызвать функцию зная только ее порядковый номер и DLL которая ее экспортирует.
Вобщем совет. Смотреть формат PE файлов и особенно внимательно секцию экспорта.
Добавлено: 24 сен 2004, 01:20
droopy
Может быть, я неправильно выразился. Я хотел узнать вот что:
Обычно все функции импортируются по имени. Но можно также импортировать функцию по номеру. Она также включается в секцию импорта EXE-файла, и загрузчик автоматически ищет её адрес. Конечно, можно вызвать GetProcAddress(hInstDll, MAKEINTRESOURCE(47)), но я хочу вызывать её прямо, как, например, call CreateFile. Так вот, как указать компоновщику, что я хочу импортировать процедуру именно по номеру?