Up ] Docs Home ]

(.exe) Segmented (New) .EXE File Header Format (NE)

Back ] Next ]

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.

The Old Executable Header

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".

The New Executable Header

Начало 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.

The segment table

Эта таблица содержит 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 если конец таблицы, если старший бит установлен, то тип соответствует предопределенным номерам (без старшего бита):
1 Cursor
2 Bitmap
3 Icon
4 Menu template
5 Dialog-box template
6 String table
7 Font directory
8 Font
9 Keyboard-accelerator table

Если старший бит 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.

The resident names table

Содержит список строк 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

The module reference table

Таблица содержит по 2 байта на каждый внешний модуль, используемый программой, 2 байта являются смещением в imported names table.

The 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.

The entry 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.

The nonresident names table

Эта таблица содержит список строк 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

The code and data segment

Вслед за различными таблицами заголовка 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:
1 Offset only
2 Segment only
3 Segment and offset
01H 1 Relocation type:
0 Internal reference
1 Imported ordinal
2 Imported name
If bit 2 set, relocation type is additive (see below)
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.