Как вызвать API-функцию по номеру?

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
droopy
Сообщения: 10
Зарегистрирован: 19 сен 2004, 03:55
Контактная информация:

В Windows довольно часто вызывают системные процедуры по номерам (call KERNEL32_47). Адрес берётся не через LoadLibrary, а сразу связываестя при загрузке. Как заставить masm32 сделать такое? Может, нужен def-файл?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Как это "связывается при загрузке"?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Значит так. Тема эта довольно интересная, но заголовок темы и собственно вопрос подразумевают разные вещи.
Вызвать функцию из DLL по номеру довольно просто. Если известен номер нужной функции конечно. Все конкретные ответы можно узнать если спросить об этом секцию экспорта в DLL (Export Section). Описание формата экзешника я приводить не буду. Если нету - можно найти в интернете. Так вот в Export Section есть указатель на массив адресов (а также и номеров) функций. Поэтому немного извратнувшись можно вызвать функцию зная только ее порядковый номер и DLL которая ее экспортирует.

Вобщем совет. Смотреть формат PE файлов и особенно внимательно секцию экспорта.
*provided AS IS
droopy
Сообщения: 10
Зарегистрирован: 19 сен 2004, 03:55
Контактная информация:

Может быть, я неправильно выразился. Я хотел узнать вот что:
Обычно все функции импортируются по имени. Но можно также импортировать функцию по номеру. Она также включается в секцию импорта EXE-файла, и загрузчик автоматически ищет её адрес. Конечно, можно вызвать GetProcAddress(hInstDll, MAKEINTRESOURCE(47)), но я хочу вызывать её прямо, как, например, call CreateFile. Так вот, как указать компоновщику, что я хочу импортировать процедуру именно по номеру?
Ответить