00h |
DWord |
Signature Bytes |
Сигнатурка
того, что этот файл собственно говоря является PE - должна быть 4550h,
иначе - 'PE',0h,0h; два последних байта под что-то-там Микрософт
зарезервировала (и проверяет их равенству на 0!). |
04h |
Word |
CPU Type |
это
поле указывает на предпочтительный ;-) тип процессора, на котором
желательно запускать данную программу, вы редко увидите что-либо
отличное от 14Ch -> i386 |
06h |
Word |
Num of Objects |
это поле указывает на число реальных входов в Object Table |
08h |
DWord |
Time/Date Stamp |
используется для хранения даты и времени создания/модификации линкером |
0Ch |
DWord |
Pointer to COFF table |
дополнительный
указатель определяющий местонахождение отладочной COFF таблицы в
файлах, отладочную информацию лучше всего искать по другому |
10h |
DWord |
COFF table size |
кол-во символов в COFF таблице |
14h |
Word |
NT Header Size |
размер
заголовка PE файла начиная с поля Magic, название взято у программы
Hiew, таким образом, общий размер заголовка PE файла составляет NT
Header Size + 18h |
16h |
Word |
Flags |
указывает на предназначение программы, конкретное значение флагов см.ниже |
18h |
Word |
Magic |
поле указывает на основное предназначение программы. абсолютно всем наплевать в него |
1Ah |
Byte |
Link Major |
старший номер версии использовавшегося при создании линкера |
1Bh |
Byte |
Link Minor |
младший номер версии использовавшегося при создании линкера (эти 2 поля загрузчик пока игнорирует) |
1Ch |
DWord |
Size of Code |
размер
именно программного кода в файле, KERNEL использует это значение для
фактического отведения памяти под загружаемую программу, установка
этого значения слишком маленьким приведет к выдаче идиотского сообщения
о нехватке памяти, хотя ее может быть валом |
20h |
DWord |
Size of Init Data |
размер
секции инициализированных данных, очевидно не используется в
Windows'95, но используется в NT, назначение аналогично приведенному
выше |
24h |
DWord |
Size of UnInit Data |
размер
секции неинициализированных данных, сложно сказать, как эти 3 поля
корреспондируют между собой, но лучше с ними по честному ;-) явно
видно, что формат разрабатывали одни, а реализовывали его другие.
Рекомендую изучить регионы памяти и VirtualXXX функции |
28h |
DWord |
Entry point RVA |
адрес,
относительно Image Base по которому передается управление при запуске
программы или адрес инициализации/завершения библиотеки |
2Ch |
DWord |
Base of Code |
RVA
секции, которая содержит программный код (как будто бы она одна
единственная ;-) ) судя по всему никем не используется (но установлено
верно) |
30h |
DWord |
Base of Data |
RVA
секции содержащей якобы данные, в реальных экзешниках указывает и на
.data и на .bss и еще бог знает куда, вряд ли кем-нибудь используется |
34h |
DWord |
Image Base |
виртуальный
начальный адрес загрузки программы (ее первого байта). Должен быть на
границе 64 Кб (связано с системой памяти Windows'95) |
38h |
DWord |
Object align |
выравнивание
программных секций, должен быть степенью 2 между 512 и 256М
включительно, так же связано с системой памяти. При использовании
других значений программа не загрузится. |
3Ch |
DWord |
File align |
фактор
используемый для выравнивания секций в программном файле. В байтовом
значении указывает на границу на которую секции дополняются 0 при
размещении в файле. Большое значение приводит к нерациональному
использованию дискового пространства, маленькое увеличивает
компактность, но и снижает скорость загрузки. Должен быть степенью 2 в
диапазоне от 512 до 64К включительно. Прочие значения вызовут ошибку
загрузки файла. Я так думаю, что размер файла штука более важная. |
40h |
Word |
OS Major |
старший
номер версии операционки необходимый для запуска программы. (нулевое
значение не позволяет запустить программу, остальные игнорируются
проверялось на OSR2) |
42h |
Word |
OS Minor |
младший номер версии операц. |
44h |
Word |
USER Major |
пользовательский номер версии, задается пользователем при линковке программы и им же и используется |
46h |
Word |
USER Minor |
аналогично, младший номер |
48h |
Word |
SubSys Major |
старший номер версии подсистемы, черт его знает как он использается, по моему всяких версий уже через край |
4Ah |
Word |
SubSys Minor |
аналогично, младший номер |
4Ch |
DWord |
Reserved |
судя по всему так оно и есть |
50h |
DWord |
Image Size |
виртуальный размер в байтах всего загружаемого образа, вместе с заголовками, кратен Object align |
54h |
DWord |
Header Size |
общий размер всех заголовков: DOS Stub + PE Header + Object Table |
58h |
DWord |
File CheckSum |
контрольная
сумма всего файла, опять же как и в DOS'е ее никто не контролирует, а
линкер ее ставит в 0 при линковке Предполагалось ее рассчитывать как
инверсию суммы всех байтов файла. |
5Ch |
Word |
SubSystem |
операционная подсистема необходимая для запуска данного файла (GUI, консоль...) |
5Eh |
Word |
DLL Flags |
указывает на специальные потребности при загрузке, начиная с NT 3.5 устарел и не используется |
60h |
DWord |
Stack Reserve Size |
память
требуемая для стека приложения, память резервируется, но выделяется
только Stack Commit Size байтов, следующая страница является охранной.
Когда приложение достигает этой страницы, то страница становится
доступной, а следующая страница - охранной, и так до достижения нижней
границы, после чего Windows'95 убивает программу с воплями об
исключении у нее в стеке |
64h |
DWord |
Stack Commit Size |
объем памяти отводимой в стеке немедленно после загрузки |
68h |
DWord |
Heap Reserve Size |
максимальный возможный размер локального хипа |
6Ch |
DWord |
Heap Comit Size |
отводимый при загрузке хип |
70h |
DWord |
Loader Flags |
? начиная с NT 3.5 объявлено неиспользуемым, назначение неясно, но в целом связано с поддержкой отладки |
74h |
DWord |
Num of RVA and Sizes |
указывает
размер массива VA/Size который следует ниже, данная фича
зарезервирована под будущие расширения формата. В данный момент его
значение всегда равно 10h |
78h |
DWord |
Export Table RVA |
RVA адрес таблицы экспорта |
7Ch |
DWord |
Export Data Size |
размер таблицы экспорта |
80h |
DWord |
Import Table RVA |
RVA адрес таблицы импорта |
84h |
DWord |
Import Data Size |
размер таблицы импорта |
88h |
DWord |
Resource Table RVA |
RVA адрес таблицы ресурсов |
8Ch |
DWord |
Resource Data Size |
размер таблицы ресурсов |
90h |
DWord |
Exception Table RVA |
RVA адрес таблицы исключений |
94h |
DWord |
Exception Data Size |
размер таблицы исключений |
98h |
DWord |
Security Table RVA |
? адрес таблицы безопасности |
9Ch |
DWord |
Security Data Size |
? размер таблицы безопасности |
A0h |
DWord |
Fix Up's Table RVA |
RVA адрес таблицы настроек |
A4h |
DWord |
Fix Up's Data Size |
размер таблицы настроек |
A8h |
DWord |
Debug Table RVA |
RVA адрес таблицы отладочной инфы |
ACh |
DWord |
Debug Data Size |
размер таблицы отладочной инфы |
B0h |
DWord |
Image Description RVA |
RVA адрес строки описани модуля |
B4h |
DWord |
Description Data Size |
размер строки описания модуля |
B8h |
DWord |
Machine Specific RVA |
? адрес таблицы значений специфичных для микропроцессора |
BCh |
DWord |
Machnine Data Size |
? размер таблицы значений специфичных для микропроцессора |
C0h |
DWord |
TLS RVA |
указатель на локальную область данных цепочек |
C4h |
DWord |
TLS Data Size |
размер области данных цепочек |
C8h |
DWord |
Load Config RVA |
? |
CCh |
DWord |
Load Config Data Size |
? |
D0h |
08h |
Reserved |
? |
D8h |
DWord |
IAT RVA |
?
мною это поле обнаружено только в мультимедийных файлах системы
Windows'95, это SNDREC32, CDPLAYER, MPLAYER. оно указывает на таблицу
адресов импорта в файле (помимо структуры импорта) писал эти программы
один человек и чего он хотел...
используется в NT, в Windows'95 судя по всему нет |
DCh |
DWord |
IAT Data Size |
? размер описанного поля |
E0h |
08h |
Reserved |
? |
E8h |
08h |
Reserved |
? |
F0h |
08h |
Reserved |
? |