Как вызвать API-функцию по номеру?
Модератор: Andy
В 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Значит так. Тема эта довольно интересная, но заголовок темы и собственно вопрос подразумевают разные вещи.
Вызвать функцию из DLL по номеру довольно просто. Если известен номер нужной функции конечно. Все конкретные ответы можно узнать если спросить об этом секцию экспорта в DLL (Export Section). Описание формата экзешника я приводить не буду. Если нету - можно найти в интернете. Так вот в Export Section есть указатель на массив адресов (а также и номеров) функций. Поэтому немного извратнувшись можно вызвать функцию зная только ее порядковый номер и DLL которая ее экспортирует.
Вобщем совет. Смотреть формат PE файлов и особенно внимательно секцию экспорта.
Вызвать функцию из DLL по номеру довольно просто. Если известен номер нужной функции конечно. Все конкретные ответы можно узнать если спросить об этом секцию экспорта в DLL (Export Section). Описание формата экзешника я приводить не буду. Если нету - можно найти в интернете. Так вот в Export Section есть указатель на массив адресов (а также и номеров) функций. Поэтому немного извратнувшись можно вызвать функцию зная только ее порядковый номер и DLL которая ее экспортирует.
Вобщем совет. Смотреть формат PE файлов и особенно внимательно секцию экспорта.
*provided AS IS
Может быть, я неправильно выразился. Я хотел узнать вот что:
Обычно все функции импортируются по имени. Но можно также импортировать функцию по номеру. Она также включается в секцию импорта EXE-файла, и загрузчик автоматически ищет её адрес. Конечно, можно вызвать GetProcAddress(hInstDll, MAKEINTRESOURCE(47)), но я хочу вызывать её прямо, как, например, call CreateFile. Так вот, как указать компоновщику, что я хочу импортировать процедуру именно по номеру?
Обычно все функции импортируются по имени. Но можно также импортировать функцию по номеру. Она также включается в секцию импорта EXE-файла, и загрузчик автоматически ищет её адрес. Конечно, можно вызвать GetProcAddress(hInstDll, MAKEINTRESOURCE(47)), но я хочу вызывать её прямо, как, например, call CreateFile. Так вот, как указать компоновщику, что я хочу импортировать процедуру именно по номеру?