|
(.exe) Segmented (New) .EXE File Header Format (NE) |
Microsoft Windows требует больше данных о файле, нежели содержится в формате .EXE executable file для MS-DOS. Например, Windows нуждается в указании различных сегментов программы как сегментов кода и данных, импортированных функций, и сохранении ресурсов программы (икон, курсоров, меню и др.). Windows должна также поддерживать dynamically linkable library modules содержащие процедуры, доступные другим модулям. Из этих соображений Windows использует expanded .EXE header format называемый New Executable file header. Он используется программами Windows, Windows library modules, и resource-only файлами подобно Windows font resource files.
New Executable file header включает сущетвующий MS-DOS exe file
header.
Фактически начало New Executable это обычный MS-DOS .EXE header. 4 байта
по смещению 3CH указывают на New Executable header.
Offset | Length (bytes) | Contents |
00H | 2 | сигнатура MZ |
3CH | 4 | Offset of New Executable header from beginning of file |
В этом MS-DOS .EXE может быть информация о non-Windows MS-DOS program, которая хранится в .EXE file наряду с Windows program. Эта программа запускается когда программа стартует из MS-DOS command line. Большинство Windows programmers используют стандартную программу, которая пишет "This program requires Microsoft Windows".
Начало New Executable file header содержит данные о расположении и длине разных таблиц. (Смещения от New Executable header.)
Offset | Length (bytes) | Contents |
00H | 2 | сигнатура NE |
02H | 2 | LINK version number : LINK revision number |
04H | 2 | смещение entry table от New Executable header |
06H | 2 | длина entry table |
08H | 4 | 32-bit checksum contents of file, using zero for these 4 bytes |
0CH | 2 | Module flag word (see below) |
0EH | 2 | Segment number of automatic data segment (0 if neither SINGLEDATA nor MULTIPLEDATA flag is set in flag word) |
10H | 2 | Initial size of local heap to be added to automatic data segment (0 if there is no local heap) |
12H | 2 | Initial size of stack to be added to automatic data segment (0 for library modules) |
14H | 2 | Initial value of instruction pointer (IP) register on entry to program |
16H | 2 | Initial segment number for setting code segment (CS) register on entry to program |
18H | 2 | Initial value of stack pointer (SP) register on entry to program (0 if stack segment is automatic data segment; stack should be set above static data area and below local heap in automatic data segment) |
1AH | 2 | Segment number for setting stack segment (SS) register on entry to program (0 for library modules) |
1CH | 2 | Number of entries in segment table |
1EH | 2 | Number of entries in module reference table |
20H | 2 | Number of bytes in nonresident names table |
22H | 2 | Offset of beginning of segment table relative to beginning of New Executable header |
24H | 2 | Offset of beginning of resource table relative to beginning of New Executable header |
26H | 2 | Offset of beginning of resident names table relative to beginning of New Executable header |
28H | 2 | Offset of beginning of module reference table relative to beginning of New Executable header |
2AH | 2 | Offset of beginning of imported names table relative to beginning of New Executable header |
2CH | 2 | Offset of nonresident names table relative to beginning of file |
30H | 2 | Number of movable entry points listed in entry table |
32H | 2 | Alignment shift count (0 is equivalent to 9) |
34H | 12 | Reserved for expansion |
The module flag word at offset 0CH in the New Executable header is defined as shown in Figure K-1.
Figure K-1. The module flag word.
Эта таблица содержит 8-byte record для каждого сегмента кода и данных программы или библиотеки. Каждый сегмент имеет ассоциированный с ним номер. Например, первый имеет номер 1. Эти номера используются для ссылок на сегмент из других секций New Executable file.
Offset | Length (bytes) | Contents |
00H | 2 | Offset of segment relative to beginning of file after shifting value left by alignment shift count |
02H | 2 | Length of segment (0000H for segment of 65536 bytes) |
04H | 2 | Segment flag word (see below) |
06H | 2 | Minimum allocation size for segment; that is, amount of space Windows reserves in memory for segment (0000H for min allocation size of 65536 bytes) |
Figure K-2. The segment flag word.
Ресурсы - это сегменты, содержащие данные, но не входящие в обычные сегменты
данных программы. Они используются для хранения
menu, dialog-box templates, icons, cursors, и текстовых стpок, а также любого типа R/O
data. Всякий ресурс имеет тип и имя, оба могут представляться
числом или ASCII name.
Таблица ресурсов начинается с resource shift count, нужного для
настройки остальных значений в таблице. Вслед за ним находятся одна и более
групп ресурсов, каждая описывает один или несколько
ресурсов.
Offset | Length (bytes) | Contents |
00H | 2 | Resource shift count |
Offset | Length (bytes) | Contents | ||||||||||||||||||
00H | 2 |
тип ресурса, 0 если конец таблицы, если
старший бит установлен, то тип соответствует
предопределенным номерам (без старшего бита):
Если старший бит type сброшен, то type определяется строкой ASCII, находящейся на расстоянии type от таблицы ресурсов: пеpвый байт- длина строки PASCAL-style |
||||||||||||||||||
02H | 2 | Number of resources of this type | ||||||||||||||||||
04H | 4 | Reserved for run-time use | ||||||||||||||||||
08H | 12 | each Resource description |
Offset | Length (bytes) | Contents |
00H | 2 | Offset of resource relative to beginning of file after shifting left by resource shift count |
02H | 2 | Length of resource after shifting left by resource shift count |
04H | 2 | Resource flag word (see below) |
06H | 2 | Resource name If high bit set, represented by a number; otherwise, type is ASCII text string and this value is offset from beginning of resource table, pointing to 1-byte value with number of bytes in string followed by string itself. |
08H | 4 | Reserved for run-time use |
Figure K-3. The resource flag word.
Содержит список строк ASCII. Первая -имя модуля, заданное в module definition file. Другие строки - имена всех exported functions перечисленных в module definition file that were not given explicit ordinal numbers or that were explicitly specified in the file as resident names. (Exported functions with explicit ordinal numbers in the module definition file are listed in the nonresident names table.)
В начале каждой строки идет байт (ее длина), а в конце два байта (слово) ссылаются на элемент entry table, начиная с 1. Слово после module name равно 0.
Offset | Length (bytes) | Contents |
00H | 1 | Number of bytes in string (0 if end of table) |
01H | n | ASCII string, not null-terminated |
n + 1 | 2 | Index into entry table |
Таблица содержит по 2 байта на каждый внешний модуль, используемый программой, 2 байта являются смещением в imported names table.
Imported names table содержит список строк ASCII. Они являются именами
всех других модулей, указываемых (referenced) посредством
imported functions. Строки начинаются байтом длины.
Большинство приложений Windows содержат в imported names table имена
KERNEL, USER, и GDI, но могут также входить имена других
модулей, таких как KEYBOARD и SOUND. (Смещения от начала записи.)
Offset | Length (bytes) | Contents |
00H | 1 | длина имени |
01H | n | ASCII стpока, не кончается \0 |
Стpоки необязательно начинаются в начале imported names table; the names are referenced by offsets specified in the module reference table.
Эта таблица содержит одну запись для каждой точки входа, т.е. всякой public FAR function или procedure. Записи имеют номера начиная с 1. Эти номера используются таблицами резидентных и нерезидентных имен. LINK versions 4.0 and later группирует (bundle) точки входа. Каждая группа снабжается заголовком:
Offset | Length (bytes) | Contents |
00H | 1 | количество точек входа в связке (0 если конец таблицы) |
01H | 1 | Segment number of entry if entry in bundle are in single fixed segment; |
0FFH if entry points in bundle are in movable segments Внимание! если
номер сегмента =0, то это Null Entry, нужно только увеличить
очередной номер точки входа и прочесть заголовок следующей связки
Для связки, содеpжащей entry points in fixed segments, каждая точка входа
тpебует 3 байта:
Offset | Length (bytes) | Contents |
00H | 1 | Entry-point flag byte (see below) |
01H | 2 | Offset of entry point in segment |
Для связки, содеpжащей entry points in movable segments, каждая точка входа тpебует 6 байт:
Offset | Length (bytes) | Contents |
00H | 1 | Entry-point flag byte (see below) |
01H | 2 | Interrupt 3FH instruction: CDH 3FH |
03H | 1 | Segment number of entry point |
04H | 2 | Offset of entry-point segment |
The entry-point flag byte is defined as shown in Figure K-4.
Figure K-4. The entry-point flag.
Эта таблица содержит список строк ASCII.
Первая - описание модуля из module definition file. Остальные
строки являются именами всех exported functions перечисленных
в module definition file, котоpые имеют номера, ассоциированные
с ними. (Exported functions без номеров в module definition file
перечислены в resident names table.)
Каждая строка начинается байтом-длиной строки
и завершается словом (2 байта) referencing a member of the entry table, beginning at 1. За
строкой module description следует 0.
Offset | Length (bytes) | Contents |
00H | 1 | Number of bytes in string (0 if end of table) |
01H | n | ASCII string, not null-terminated |
n + 1 | 2 | Index into entry table |
Вслед за различными таблицами заголовка New Executable расположены сегменты кода и данных программы или библиотечного модуля. Если в слове описания сегмента он помечен как ITERATED, то его организация следующая. (Смещения указаны от начала сегмента.)
Offset | Length (bytes) | Contents |
00H | 2 | Number of iterations of data |
02H | 2 | Number of bytes of data |
04H | n | Data |
Иначе, размер данных сегмента указан в поле length в таблице сегментов.
Если сегмент описан в слове описания сегмента как
содержащий relocation information, то relocation table начинается
непосредственно после данных сегмента. Windows использует relocation table для
разрешения ссылок из сегмента на функции других
сегментов этого модуля и импортированных функций в
других модулях. (Смещения указаны от начала таблицы.)
Offset | Length (bytes) | Contents |
00H | 2 | число элементов relocation длиной 8 байт каждый (см. ниже) |
Offset | Length (bytes) | Contents | ||||||
00H | 1 | Type of address to insert in segment:
|
||||||
01H | 1 | Relocation type:
|
||||||
02H | 2 | Offset of relocation item within segment | ||||||
Следующие 4 байта зависят от relocation type. | ||||||||
Если это внутренняя ссылка на сегмент этого же модуля, то они трактуются, как описано ниже. (Offsets are from the beginning of the relocation item.) | ||||||||
04H | 1 | Segment number for fixed segment; 0FFH for movable segment | ||||||
05H | 1 | 0 | ||||||
06H | 2 | If MOVABLE segment, ordinal number referenced in entry table; if FIXED segment, offset into segment | ||||||
Если relocation type -это imported ordinal в дpугом модуле, то байты означают следующее. (Offsets are from the beginning of the relocation item.) | ||||||||
04H | 2 | Index into module reference table | ||||||
06H | 2 | Function ordinal number | ||||||
Наконец, если relocation type суть imported name of a function in another module, байты означают следующее. (Offsets are from the beginning of the relocation item.) | ||||||||
04H | 2 | Index into module reference table | ||||||
06H | 2 | Offset within imported names table to name of imported function |
Если флаг ADDITIVE в relocation type установлен, то адрес
внешней функции is
added к содержимому of the address in the target segment. Если флаг ADDITIVE
сброшен, то target contains an offset to another target within the same
segment that requires the same relocation address. This defines a chain of
target addresses that get the same address. The chain is terminated with a -1
entry.