WinAPI функционирует в новом .exe - PullRequest
0 голосов
/ 01 ноября 2010

Я недавно искал создание нового родного языка.Я понимаю (очень) основы формата PE, и я взял ассемблер с довольно добрым интерфейсом с веб-сайтов, который я успешно использовал для реализации некоторых простых функций.Но я столкнулся с проблемой при использовании функций из библиотеки.Единственный способ, которым я ранее вызывал библиотечные функции из динамически скомпилированной функции, - это передать указатель функции вручную, чего я не могу сделать, если создаю PE-файлы и выполняю их в своем собственном процессе.Сейчас я не планирую использовать CRT, но мне потребуется доступ к Win API для реализации моих собственных стандартных библиотек.Как мне сгенерировать ссылку на функцию WinAPI, чтобы загрузчик PE исправил ее?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Вам нужно написать таблицу импорта. В основном это список имен функций, которые вы хотите использовать в своем приложении. На это указывает PE-заголовок. Загрузчик загружает файлы DLL в пространство памяти процесса, находит запрошенную функцию в их таблице экспорта и оставляет адрес для нее в таблице импорта. Вы тогда обычно разыменовываете это и jmp там.

Ознакомьтесь с Руководством по сборке Izelion для получения полной информации и примеров.

0 голосов
/ 01 ноября 2010

Как насчет начать с излучения C вместо сборки?Тогда писать напрямую в ASM - это просто оптимизация.

Я не шучу: большинство компиляторов вырабатывают какой-то промежуточный код до прохождения финального нативного кода.

Я понимаю, что выпытаясь уйти от всей разделенной нулями Rigmarole, но вам все равно это понадобится для функций WinAPI.

Перечитывая ваш вопрос: вы понимаете, что вы можете получить адреса функций WinAPI, вызвав LoadLibrary(), затем вызывая GetProcAddress (), а затем настраивая вызов ... правильно?

Если вы хотите посмотреть, как загрузить это из чистой сборки: старые SDK имели пример кода ASM, возможно, новыйте все еще делают.Если они этого не сделают, DDK будет.

...