Добрый день, Yuriy Zhilovets!
Ваше сообщение от 20.04.2007 18:54:
> Это же просто копирование готового файла, а не формирование его с нуля.
> Поэтому о сложности формата это ничего не говорит.
>
Да, формирование "с нуля" длиннее, но ненамного сложнее.
Прилагаю программу формирования spf-stub - того PE-заголовка, который, с
мелкими модификациями, кочует с версии в версию spf3..spf4.
> \ Возврата из подпрограммы не будет - адрес на стеке
> \ возвратов может использоваться для fixups.
>
> Эти самые fixups где-то реально используются?
>
По-моему, нет.
> 2) При формировании образа в ЦК выводится адрес начала: 0x524000
> А с какого адреса реально грузится система при запуске?
> Почему эти адреса различаются?
>
Системы бывают разные... Обычно сама система виртуально расположена "во
второй половине" адресного пространства, т.е. >0x80000000,
запускаемая программа с 0x400000, её dll, стеки и хипы между этими двумя
областями. Младшие адреса тоже резервируются системой
(размер этой области сильно зависит от версии винды). Иногда между ею и
0x400000 система тоже может выделять место под хип и т.п.
Почему различаются 0x400000 и 0x524000? Потому что ЦК компилирует новую
систему после себя. И без relocations записывает.
И соответственно грузится с адреса 0x5... вместо 0x4... - системе по
барабану, лишь бы не занято было.
Исходное число 0x400000 - это пережиток от Win95, там первые 0x400000
чем-то большим заняты. А в WinNT можно и на 0x200000 (например)
загружать, по-моему.
Старые SPF'ы грузились с 0x490000, но по мере самокомпиляции съезжали в
старшие адреса вплоть до полученного тобой адреса.
В Windows CE и в Unix планировка адресного пространства иная.
WinCE и WinNT в этом различаются намного сильнее, чем Win95 и WinNT.