LINEAR-EXECUTABLE File Header Layout

   An virtual device drivers or some other applications for Microsoft
 Windows or IBM OS/2 operating system which uses 32-bits segments
 for 80386+ contains a combination of code and data or combination of
 code,data, and resources. The `LINEAR-EXECUTABLE` file such as a NEW-STYLE
 EXE file also contains two headers: an ^Tp236 {MS-DOS header} and a `LINEAR` EXE header.
  The ^Tp236 {MS-DOS (old-style) executable-file header} contains four distinct parts:
 a collection of header information,a reserved section, a pointer to a
 `LINEAR` exe header, and a stub program. The following illustrations shows
 the MS-DOS executable-file header:

                                    `Beginning of file`

                              ╔════════════════════════════════════╗
   Offset:             00h    ║          MS-DOS Header Info        ║
                              ╟────────────────────────────────────╢
                       20h    ║              Reserved              ║
                              ╟────────────────────────────────────╢
                       3Ch    ║           LE header offset         ║
                              ╟────────────────────────────────────╢
                       40h    ║                                    ║
                              ║          MS-DOS stub program       ║
                              ║                                    ║
                              ╟────────────────────────────────────╢
     Beginning of `LE` header ║                                    ║
                              ║      .                             ║
                              ║      .                             ║
                              ║      .                             ║
                              ║                                    ║

     If word value at offset 18h is 40h or greater, the dword value at 3Ch
 is an offset to a `LE` header

     MS-DOS uses stub program to display a message if Windows or OS/2 has
 not been loaded when the user attempts to run a program.

     The `LINEAR` executable-file header contains information that the
 loader requires for segmented executable files. This information includes
 the linker version number, data specified by linker, data specified by
 resource compiler, tables of segment data, tables of resource data, and
 so on. The following illustrations shows the LE file header:

                              ║                                    ║
                              ║   .                                ║
                              ║   .                                ║
                              ║   .                                ║
                              ╟────────────────────────────────────╢
                              ║                                    ║
         End of MS-DOS header ║         MS-DOS stub program        ║
                              ║                                    ║
                              ╟────────────────────────────────────╢
   Beginning of `LE` header   ║         Information block          ║
                              ╟────────────────────────────────────╢
                              ║           Object table             ║
                              ╟────────────────────────────────────╢
                              ║       Object page map table        ║
                              ╟────────────────────────────────────╢
                              ║    Object iterate data map table   ║
                              ╟────────────────────────────────────╢
                              ║          Resource table            ║
                              ╟────────────────────────────────────╢
                              ║       Resident-names table         ║
                              ╟────────────────────────────────────╢
                              ║           Entry  table             ║
                              ╟────────────────────────────────────╢
                              ║      Module directives table       ║
                              ╟────────────────────────────────────╢
                              ║          Fixup page table          ║
                              ╟────────────────────────────────────╢
                              ║         Fixup record table         ║
                              ╟────────────────────────────────────╢
                              ║     Imported modules name table    ║
                              ╟────────────────────────────────────╢
                              ║   Imported procedures name table   ║
                              ╟────────────────────────────────────╢
                              ║       Per-page checksum table      ║
                              ╟────────────────────────────────────╢
    Code and data segments    ║                                    ║
                              ║    Code or Data Segment 1          ║
                              ║                                    ║
                              ╟────────────────────────────────────╢
                              ║                                    ║
                              ║    Code or Data Segment 2          ║
                              ║                                    ║
                              ╟────────────────────────────────────╢
                              ║                                    ║
                              ║      .                             ║
                              ║      .                             ║
                              ║      .                             ║
                              ║                                    ║
                              ║                                    ║
                              ║                                    ║
                              ║    Code or Data Segment n          ║
                              ║                                    ║
                              ╟────────────────────────────────────╢
                              ║                                    ║
                              ║        Non-resident table          ║
                              ║                                    ║
                              ╚════════════════════════════════════╝

                               `End of file`

──────────────────────────────────────────────────────────────────────────────
See also :           MS-DOS old-style ^Tp236 {EXE File Header}
|============================================================================

                     ▌`LE Header Information Block Layout`
                     ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     The `information block` in the LE header contains the linker
 version number, length of various tables that further describe the executable
 file, the offsets from the beginning of the header to the beginnig of these
 tables, the heap and stack sizes, and so on. The following list summarizes
 the contents of the header `information block` ( the locations are relative
 to the beginning of the block):

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───────┐
 +0      2  │4Ch 45H│ Specifies the signature word 'LE'
            ├───┼───┘
 +2      1  │   │     Byte order:(00h = little-endian, nonzero = big-endian)
            ├───┤
 +3      1  │   │     Word order:(00h = little-endian, nonzero = big-endian)
            ├───┼───┬───┬───┐
 +4      4  │Exe format lev │ Executable format level
            ├───┼───┼───┴───┘
 +8      2  │CPU typ│ CPU type:
            └───┴───┘   01h - Intel 80286 or upwardly compatible
                        02h - Intel 80386 or upwardly compatible
                        03h - Intel 80486 or upwardly compatible
                        04h - Intel 80586 or upwardly compatible
                        20h - Intel i860 (N10) or compatible
                        21h - Intel "N11" or compatible
                        40h - MIPS Mark I ( R2000, R3000) or compatible
                        41h - MIPS Mark II ( R6000 ) or compatible
                        42h - MIPS Mark III ( R4000 ) or compatible
            ┌───────┐
 +0Ah    2  │OS Type│ Target operating system:
            └───┴───┘   01h - OS/2
                        02h - Windows
                        03h - DOS 4.x
                        04h - Windows 386
            ┌───┬───┬───┬───┐
 +0Ch    4  │Module version │ Module version.
            ├───┼───┼───┬───┤
 +10h    4  │Module Type Flg│ Module type flags
            ├───┼───┼───┼───┤
 +14h    4  │ Memory Pages  │ Number of memory pages
            ├───┼───┼───┼───┤
 +18h    4  │Init CS object │ Initial object CS number
            ├───┼───┼───┼───┤
 +1Ch    4  │ Init Offset   │ Initial EIP
            ├───┼───┼───┼───┤
 +20h    4  │Init SS object │ Initial object SS number
            ├───┼───┼───┼───┤
 +24h    4  │ Init ESP Offs │ Initial ESP
            ├───┼───┼───┼───┤
 +28h    4  │Mem Page size  │ Memory page size
            ├───┼───┼───┼───┤
 +2Ch    4  │ Last page Byts│ Bytes on last page
            ├───┼───┼───┼───┤
 +30h    4  │ Fixup size    │ Fixup section size
            ├───┼───┼───┼───┤
 +34h    4  │ Fixup checksum│ Fixup section checksum
            ├───┼───┼───┼───┤
 +38h    4  │Loader sect siz│ Loader section size
            ├───┼───┼───┼───┤
 +3Ch    4  │Loader checksum│ Loader section checksum
            ├───┼───┼───┼───┤
 +40h    4  │Object table of│ Offset of object table
            ├───┼───┼───┼───┤
 +44h    4  │Obj table entr │ Object table entries
            ├───┼───┼───┼───┤
 +48h    4  │Obj page map   │ Object page map offset
            ├───┼───┼───┼───┤
 +4Ch    4  │Obj iter dat mp│ Object iterate data map offset
            ├───┼───┼───┼───┤
 +50h    4  │Resource offset│ Resource table offset
            ├───┼───┼───┼───┤
 +54h    4  │Resource entr  │ Resource  table entries
            ├───┼───┼───┼───┤
 +58h    4  │Resident name  │ Resident names table offset
            ├───┼───┼───┼───┤
 +5Ch    4  │Entry table ofs│ Entry table offset
            ├───┼───┼───┼───┤
 +60h    4  │Module direct  │ Module directives table offset
            ├───┼───┼───┼───┤
 +64h    4  │Module dir entr│ Module directives entries
            ├───┼───┼───┼───┤
 +68h    4  │Fixup page tabl│ Fixup page table offset
            ├───┼───┼───┼───┤
 +6Ch    4  │Fixup rec table│ Fixup record table offset
            ├───┼───┼───┼───┤
 +70h    4  │Imported module│ Imported modules name table offset
            ├───┼───┼───┼───┤
 +74h    4  │Imported mod cn│ Imported modules count
            ├───┼───┼───┼───┤
 +78h    4  │Imported proc  │ Imported procedure name table offset
            ├───┼───┼───┼───┤
 +7Ch    4  │Per-page checks│ Per-page checksum table offset
            ├───┼───┼───┼───┤
 +80h    4  │Data pages offs│ Data pages offset from top of file
            ├───┼───┼───┼───┤
 +84h    4  │Preload page cn│ Preload page count
            ├───┼───┼───┼───┤
 +88h    4  │Non-resid table│ Non-resident names table offset from top of file
            ├───┼───┼───┼───┤
 +8Ch    4  │Non-resid size │ Non-resident names table length
            ├───┼───┼───┼───┤
 +90h    4  │Non-res checksm│ Non-resident names table checksum
            ├───┼───┼───┼───┤
 +94h    4  │Auto data obj  │ Automatic data object
            ├───┼───┼───┼───┤
 +98h    4  │Debug info offs│ Debug information offset
            ├───┼───┼───┼───┤
 +9Ch    4  │Debug inf size │ Debug information length
            ├───┼───┼───┼───┤
 +A0h    4  │Preload pg numb│ Preload instance pages number
            ├───┼───┼───┼───┤
 +A4h    4  │Demand pg numb │ Demand instance pages number
            ├───┼───┼───┼───┤
 +A8h    4  │Extra head aloc│ Extra heap allocation
            ├───┼───┼───┼───┤
 +ACh    4  │  Unknown  │   │  ???
            └───┴───┴───┴───┘

──────────────────────────────────────────────────────────────────────────────
See also : NE Header Information Block Layout
|============================================================================

                 ▌`LE Header Information Block Flags Layout`
                 ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀


 3 3 2 2  2 2 2 2     2 2 2 2  1 1 1 1
 1 0 9 8  7 6 5 4     3 2 1 0  9 8 7 6
 ■ ■ ■ ■  ■ ■ ■ ■     ■ ■ ■ ■  ■ ■ ■ ■
 └─┴─┴─┴──┴─┴─┴─┴─────┴─┴─┴─┴──┴─┴─┴─┴───  Reserved

 1 1 1 1  1 1
 5 4 3 2  1 0 9 8     7 6 5 4  3 2 1 0
 ■ ■ ■ ■  ■ ■ ■ ■     ■ ■ ■ ■  ■ ■ ■ ■
 │   │      │ │ │         │ │    │
 │   │      └─┼─┘         │ │    └─────2─ Initialization ( Only for DLL ):
 │   │        │           │ │              0: Global
 │   │        │           │ │              1: Per-Process
 │   │        │           │ │
 │   │        │           │ └──────────4─ 1:No internal fixup in exe image
 │   │        │           └────────────5─ 1:No external fixup in exe image
 │   │        └───────────────────8,9,10─   0 - Unknown
 │   │                                      1 - Incompatible with PM windowing
 │   │                                      2 -   Compatible with PM windowing
 │   │                                      3 - Uses PM windowing API
 │   │
 │   └────────────────────────────────13─ 1: Module not loadable
 └────────────────────────────────────15─ 1: Module is DLL rather then program
──────────────────────────────────────────────────────────────────────────────
See also : NE Header Information Block Flags Layout
|============================================================================

                     ▌`LE Header Object Table Layout`
                     ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

   The object table contains information that describes each segment in an
 executable file. This information includes segment length, segment type,
 and segment-relocation data. The following list summarizes the values found
 in in the segment table ( the locations are relative to the beginning of
 each entry):

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┬───┬───┬───┐
+0h      4  │ Virt segm size│ Virtual segment size in bytes
            ├───┼───┼───┼───┤
+4h      4  │Reloc base addr│ Relocation base address
            ├───┼───┼───┼───┤
+8h      4  │ Object flags  │ Object flags
            ├───┼───┼───┼───┤
+Ch      4  │ Page map index│ Page map index
            ├───┼───┼───┼───┤
+10h     4  │ Page map entr │ Page map entries
            ├───┼───┼───┼───┤
+14h     4  │    Unknown    │ ???
            └───┴───┴───┴───┘


──────────────────────────────────────────────────────────────────────────────
See also :
|============================================================================

                     ▌`LE Header Object Flags Layout`
                     ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀


 3 3 2 2  2 2 2 2     2 2 2 2  1 1 1 1
 1 0 9 8  7 6 5 4     3 2 1 0  9 8 7 6
 ■ ■ ■ ■  ■ ■ ■ ■     ■ ■ ■ ■  ■ ■ ■ ■
 └─┴─┴─┴──┴─┴─┴─┴─────┴─┴─┴─┴──┴─┴─┴─┴───  Reserved

 1 1 1 1  1 1
 5 4 3 2  1 0 9 8     7 6 5 4  3 2 1 0
 ■ ■ ■ ■  ■ ■ ■ ■     ■ ■ ■ ■  ■ ■ ■ ■
 │ │ │ │    │ └┬┘     │ │ │ │  │ │ │ └─0─  1: Readable
 │ │ │ │    │  │      │ │ │ │  │ │ └───1─  1: Writable
 │ │ │ │    │  │      │ │ │ │  │ └─────2─  1: Executable
 │ │ │ │    │  │      │ │ │ │  └───────3─  1: Resource
 │ │ │ │    │  │      │ │ │ └──────────4─  1: Discardable
 │ │ │ │    │  │      │ │ └────────────5─  1: Shared
 │ │ │ │    │  │      │ └──────────────6─  1: Preloaded
 │ │ │ │    │  │      └────────────────7─  1: Invalid
 │ │ │ │    │  └────────────────────8,9──  Type: 00 - Normal
 │ │ │ │    │                                    01 - Zero-filled
 │ │ │ │    │                                    10 - Resident
 │ │ │ │    │                                    11 - Resident/contiguous
 │ │ │ │    └─────────────────────────10─  "RESIDENT/LONG_LOCABLE"
 │ │ │ │
 │ │ │ └──────────────────────────────12─  "16:16_ALIAS"
 │ │ └────────────────────────────────13─  1: "BIG" (USE32)
 │ └──────────────────────────────────14─  1: Conforming
 └────────────────────────────────────15─  "Object_i/o_privilage_level"

──────────────────────────────────────────────────────────────────────────────
See also :
|============================================================================

                     ▌`LE Header Resident-Name Table Layout`
                     ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     The `resident-name` table contains strings that identify exported functions
 in the exe file. As the name implies, these strings are resident in system
 memory and never discarded. The `resident-name` strings are case-sensitive and
 are not null-terminated. The following list summarizes the values found
 in in the `resident-name` table ( the locations are relative to the beginning
 of each entry):

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┐
+0h      1  │Siz│     Specifies the length of a string.If there are no more
            └───┘       strings in the table, this value is zero.
            ┌── ──── ──── ───── ─── ──┐
+1h      N  │  String                 │ Specifies the `resident-name` text.
            ├───┬───┬─────────────────┘
+N+01h   2  │Index  │ Specifies an ordinal number, that identifies the string.
            └───┴───┘ This number is an index into the entry table.

     The first string in the resident-name table is the module name.

──────────────────────────────────────────────────────────────────────────────
See also : LE Header Information Block Layout
|============================================================================

                      ▌`LE Header Entry-Table Layout`
                      ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     The `entry table` contains bundles of entry points from exe file ( the
 linker generates each bundle). The numbering system for these ordinal values
 is 1-based -- that is, the ordinal value corresponding to the first entry
 point is 1.

     The linker generates the densest possible bundles under the restriction
 that it cannot reorder the entry points. This restriction is necessary
 because other exe files may refer to entry points within a given bundle by
their ordinar values.

     The `entry-table` data is organized by bundle, each of which begins with
 a 2-byte header. The first byte of the header specifies the number of entries
 in the bungle ( a value of 00h designates the end of the table). The second
 byte specifies flags. The third and forth byte specified object number.

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

            ┌───┐
+0h      1  │Siz│     Number of entries in this bungle
            ├───┤
+1h      1  │Ind│     Bungle flags :
            └───┘     7 6 5 4   3 2 1 0
                      ■ ■ ■ ■   ■ ■ ■ ■
                                    │ └0─  1:Valid entry,   0:Zero entry
                                    └──1─  1:32-bits entry, 0:16-bits entry
            ┌───┬───┐
+2h      2  │Index  │ Object index
            └───┴───┘
            ┌───────────────────┐
+4h 3 or 5  │  Entry 1          │
            ├───────────────────┤
+?? 3 or 5  │  Entry 2          │
            ├─── ── ─── ────────┤
+?? 3 or 5  │  Entry N          │
            └───────────────────┘

     Each entry consists of 3 or 5 bytes and has the following
 form:

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┐
+0h      1  │Flg│ Specifies a byte value.This value can be a combination of
            └───┘  the following bits:
                   7 6 5 4  3 2 1 0
                   ■ ■ ■ ■  ■ ■ ■ ■
                   └─┴─┴─┼──┘   │ └─  1: Entry is exported
                         │      └───  1: The segment uses a global (shared)
                         │               data segment.
                         │
                         └──────────  If Code segment these bits specify the
                                         number of words that compose the
                                         stack.At the time of the ring
                                         transitions, these words must be
                                         copied from one ring to the other.
            ┌───┬───┐
+1   2 or 4 │Offset │ Specifies the segment offset. ( Word or Dword depending
            └───┴───┘ on bit 1 bungle flags
──────────────────────────────────────────────────────────────────────────────
See also : LE Header Information Block Layout
|============================================================================

                   ▌`LE Header Fixup Record  Table Layout`
                   ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     Code and data segments follow the LE header. Some of code segments may
 contain calls to function in other segments and may,therefore, require
 relocation data to resolve those references.This relocation data is stored
 in a fixup record table.A relocation item is a collection of bytes
 specifying the following information:

 ■ Address type ( Segment only,offset only,segment and offset)

 ■ Relocation type (internal reference, imported ordinal, imported name)

 ■ Segment number or ordinal identifier ( for internal references)

 ■ Reference-table index or function ordinal number ( for imported ordinal)

 ■ Reference-table index or name-table offset ( for imported names )


   Each relocation item consist of:

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┐
+0h     1   │ATp│  Specify relocation addres type:
            └───┘
                   7 6 5 4   3 2 1 0
                   ■ ■ ■ ■   ■ ■ ■ ■
                       │ │   └──┬──┘
                       │ │      └─────  Reloc Address Type:
                       │ │               0 - Low byte at the specified offset
                       │ │               2 - 16-bits selector
                       │ │               3 - 32-bits far pointer
                       │ │               5 - 16-bits Offset
                       │ │               6 - 48-bits far pointer
                       │ │               7 - 32-bits Offset
                       │ │               8 - 32-bits Offset Relatively EIP
                       │ │
                       │ └────────────  1: Fixup to 16:16 alias 
                       │
                       └──────────────  0: Not List  e
                                        1: List of source offset follows 
                                           fixup record

            ┌───┐
+1h     1   │Rtp│  Specify relocation type:
            └───┘
                   7 6 5 4   3 2 1 0
                   ■ ■ ■ ■   ■ ■ ■ ■
                   │ │ │ │     │ └┬┘
                   │ │ │ │     │  └───  Relocation Type:
                   │ │ │ │     │         00 - Internal reference
                   │ │ │ │     │         01 - Imported ordinal
                   │ │ │ │     │         10 - Imported Name
                   │ │ │ │     │         11 - OSFIXUP ???
                   │ │ │ │     │
                   │ │ │ │     └──────  1: Additive FIXUP
                   │ │ │ │
                   │ │ │ └────────────  1: Target Offset is 32-bits
                   │ │ │                0: Target Offset is 16-bits
                   │ │ │
                   │ │ └──────────────  0 - 16-Bits Additive Flags
                   │ │                  1 - 32-Bits Additive Flags
                   │ │
                   │ └────────────────  1 - 16-bit Object/Module ordinal
                   │                    0 -  8-bit Object/Module ordinal
                   │
                   │
                   └──────────────────  1 -  8-bit Import Ordinal       
                                        0 -  Bit 4 Toggles Between 16 and 
                                             32 ordinal






╔═ If Bit 5 of relocation addres type equal 0 ════════════════════════════════╗
║                                                                             ║
║            ┌───┬───┐                                                        ║
║+2h      2  │RelOffs│Specify the offset of the relocation item whithin       ║
║            └───┴───┘ current page ( See fixup page table )                  ║
║                                                                             ║
║---For internal reference ------                                             ║
║            ┌───┐                                                            ║
║+4h      1  │Ind│    Specify Target segment number.                          ║
║            └───┘                                                            ║
║                                                                             ║
║---For imported ordinal------------------------                              ║
║            ┌───┐                                                            ║
║+4h      1  │Ind│ Imported module-name index.See imported modules name table ║
║            ├───┼ ─ ┐                                                        ║
║+5h   1 or 2│Ordinal│ Ordinal value Depending on Bit 7 of Relocation type    ║
║            └───┴───┘                                                        ║
║            ┌ ──┬ ──┬─ ─┬─ ─┐                                                ║
║+6(7)  2 (4)│ Abs Add Value │ This field present if Bit 2 of Relocation      ║
║            └ ──┴─ ─┴─ ─┴─ ─┘  Type Set to 1. Its size 2 or 4 bytes depending║
║                               on Bit 4 of Relocation Type.                  ║
║            ┌ ─ ┬ ─ ┐                                                        ║
║+n        2 │Extra  │ Present if bit 4 Relocation Type Set to 1              ║
║            └─ ─┴ ──┘                                                        ║
║                                                                             ║
║---For imported name---------------------------                              ║
║                                                                             ║
║            ┌───┐                                                            ║
║+4h      1  │Ind│ Imported module-name index.See imported modules name table ║
║            ├───┼───┐                                                        ║
║+6h      2  │Offset │ Offset of name in imported procedure names table.      ║
║            └───┴───┘                                                        ║
║            ┌ ──┬ ──┬─ ─┬─ ─┐                                                ║
║+8     2 (4)│ Abs Add Value │ This field present if Bit 2 of Relocation      ║
║            └ ──┴─ ─┴─ ─┴─ ─┘  Type Set to 1. Its size 2 or 4 bytes depending║
║                               on Bit 4 of Relocation Type.                  ║
║                                                                             ║
║            ┌ ─ ┬ ─ ┐                                                        ║
║+n        2 │Extra  │ Present if bit 4 Relocation Type Set to 1              ║
║            └─ ─┴ ──┘                                                        ║
║                                                                             ║
╚═════════════════════════════════════════════════════════════════════════════╝
╔═ If Bit 5 of relocation addres type equal 1 ════════════════════════════════╗
║                                                                             ║
║            ┌───┐                                                            ║
║+2h      1  │Cnt│  Offset Counter                                            ║
║            └───┘                                                            ║
║                                                                             ║
║---For internal reference ------                                             ║
║            ┌───┐                                                            ║
║+4h      1  │Ind│    Specify Target segment number.                          ║
║            └───┘                                                            ║
║            ┌───┬───┐                                                        ║
║+5h    2*N  │RelOffs│Specify the offset of the relocation item whithin       ║
║            ├───┼───┤ current page ( See fixup page table )                  ║
║            │   │   │                                                        ║
║            ├───┼───┤                                                        ║
║               ...                                                           ║
║            ├───┼───┤                                                        ║
║            │   N   │                                                        ║
║            └───┴───┘                                                        ║
║                                                                             ║
║---For imported ordinal------------------------                              ║
║            ┌───┐                                                            ║
║+4h      1  │Ind│ Imported module-name index.See imported modules name table ║
║            ├───┼ ─ ┐                                                        ║
║+5h   1 or 2│Ordinal│ Ordinal value Depending on Bit 7 of Relocation type    ║
║            └───┴───┘                                                        ║
║            ┌ ──┬ ──┬─ ─┬─ ─┐                                                ║
║+6(7)  2 (4)│ Abs Add Value │ This field present if Bit 2 of Relocation      ║
║            └ ──┴─ ─┴─ ─┴─ ─┘  Type Set to 1. Its size 2 or 4 bytes depending║
║                               on Bit 4 of Relocation Type.                  ║
║            ┌ ─ ┬ ─ ┐                                                        ║
║+n        2 │Extra  │ Present if bit 4 Relocation Type Set to 1              ║
║            └─ ─┴ ──┘                                                        ║
║            ┌───┬───┐                                                        ║
║+n+2   2*N  │RelOffs│Specify the offset of the relocation item whithin       ║
║            ├───┼───┤ current page ( See fixup page table )                  ║
║            │   │   │                                                        ║
║            ├───┼───┤                                                        ║
║               ...                                                           ║
║            ├───┼───┤                                                        ║
║            │   N   │                                                        ║
║            └───┴───┘                                                        ║
║                                                                             ║
║---For imported name---------------------------                              ║
║                                                                             ║
║            ┌───┐                                                            ║
║+4h      1  │Ind│ Imported module-name index.See imported modules name table ║
║            ├───┼───┐                                                        ║
║+6h      2  │Offset │ Offset of name in imported procedure names table.      ║
║            └───┴───┘                                                        ║
║            ┌ ──┬ ──┬─ ─┬─ ─┐                                                ║
║+8     2 (4)│ Abs Add Value │ This field present if Bit 2 of Relocation      ║
║            └ ──┴─ ─┴─ ─┴─ ─┘  Type Set to 1. Its size 2 or 4 bytes depending║
║                               on Bit 4 of Relocation Type.                  ║
║                                                                             ║
║            ┌ ─ ┬ ─ ┐                                                        ║
║+n        2 │Extra  │ Present if bit 4 Relocation Type Set to 1              ║
║            └─ ─┴ ──┘                                                        ║
║            ┌───┬───┐                                                        ║
║+n+2   2*N  │RelOffs│Specify the offset of the relocation item whithin       ║
║            ├───┼───┤ current page ( See fixup page table )                  ║
║            │   │   │                                                        ║
║            ├───┼───┤                                                        ║
║               ...                                                           ║
║            ├───┼───┤                                                        ║
║            │   N   │                                                        ║
║            └───┴───┘                                                        ║
║                                                                             ║
╚═════════════════════════════════════════════════════════════════════════════╝
See also : LE Header Information Block Layout
|============================================================================

                   ▌`LE Header Fixup Page  Table Layout`
                   ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

      In the LE header fixup records table  are array of fixup records and
 offset into fixup records are relative to the current page. Fixup page table
 serves to identify fixup records into code and data segments offset.
      Fixup page table is array of dwords. Number of dwords is number of
 pages plus 1.Each dword contains offset into Fixup Record Table
 of first fixup in the current page. Last dword contains size of
 fixup record table in bytes.I.e. substraction contains dword+1 with current
 dword is fixup table size for current page.
    For example: Number of page is 4.
       ┌────────────────────┐
    1  │         0          │  Offset of fixup for 1 page
       ├────────────────────┤
    2  │         5          │  Offset of fixup for 2 page
       ├────────────────────┤
    3  │         5          │  Offset of fixup for 3 page
       ├────────────────────┤
    4  │        0Ch         │  Offset of fixup for 4 page
       ├────────────────────┤
    5  │        13h         │  Size of fixup record table.
       └────────────────────┘

  First page have fixup records at offset 0, its size is 5-0 = 5 bytes.
  Second page hasn't fixup,because its size is 5-5=0 bytes.
  Third page have fixup records at offset 5, its size is 0C-5 = 7 bytes.
  Forth page have fixup records at offset 0Ch, its size is 13h-0Ch = 7 bytes.

──────────────────────────────────────────────────────────────────────────────
See also : LE Header Information Block Layout
|============================================================================

                 ▌`LE Header Imported-modules Name Table Layout`
                 ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     The `imported-modules name` table contains the names of modules that
 the exe file imports. Each entry contains two parts: a single byte that
 specifies the length of the string and the string itself. The strings in
 this table are not null-terminated.

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┐
+0h      1  │Siz│     Specifies the length of a string
            ├───┴─── ──── ───── ─── ──┐
+1h      N  │  String                 │ Specifies the string text.
            └─────────────────────────┘

  The first byte in `imported-modules name` table is zero. First name begins
 from offset +1.


──────────────────────────────────────────────────────────────────────────────
See also : NE Header Information Block Layout
|============================================================================

              ▌`LE Header Imported-procedures Name Table Layout`
              ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     The `imported-procedures name` table contains the names of procedures that
 the exe file imports. Each entry contains two parts: a single byte that
 specifies the length of the string and the string itself. The strings in
 this table are not null-terminated.

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┐
+0h      1  │Siz│     Specifies the length of a string
            ├───┴─── ──── ───── ─── ──┐
+1h      N  │  String                 │ Specifies the string text.
            └─────────────────────────┘





──────────────────────────────────────────────────────────────────────────────
See also : NE Header Information Block Layout
|============================================================================

                    ▌`LE Header Nonresident-Name Table Layout`
                    ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     The `nonresident-name` table contains strings that identify exported
 functions in the exe file. As the name implies, these strings are not always
 resident in system memory and discardable. The `nonresident-name` strings are
 case-sensitive and are not null-terminated. The following list summarizes the
 values found in in the `nonresident-name` table ( the locations are relative
 to the beginning of each entry):

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┐
+0h      1  │Siz│     Specifies the length of a string.If there are no more
            └───┘       strings in the table, this value is zero.
            ┌── ──── ──── ───── ─── ──┐
+1h      N  │  String                 │ Specifies the `nonresident-name` text.
            ├───┬───┬─────────────────┘
+N+01h   2  │Index  │ Specifies an ordinal number, that identifies the string.
            └───┴───┘ This number is an index into the entry table.

     The first name that appearsin the `nonresident-name` table is the module
 description string ( which was specified in the module-definition file).


──────────────────────────────────────────────────────────────────────────────
See also : LE Header Information Block Layout
|============================================================================

                    ▌`LE Header Object Page Map Table`
                    ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

     The `object page map` table contains location of each page into
 exe file.This table consists of Dwords. Each dword correspond to one
 page in exe file. Number of page is set in  LE Header Information Block
 at offset +14h.

Offset Size Contents
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
            ┌───┬───┐
+0h      2  │HighPag│ High page Number
            ├───┬───┘
+2       1  │Low│     Low page Number
            ├───┤
+4       1  │FLG│      Page FLAGS:
            └───┘   7 6 5 4  3 2 1 0
                    ■ ■ ■ ■  ■ ■ ■ ■
                    └┬┘          └┬┘
                     │            └─────  11 - Last page in file
                     │
                     └──────────────────  Page Type: 00 - Legal
                                                     01 - Iterated
                                                     10 - Invalid
                                                     11 - Zero filled
  To compute page offset into file necessary:
  (HighPageNumber+LowPageNumber-1)*PageSize+FirstPageOffset

──────────────────────────────────────────────────────────────────────────────
See also : LE Header Information Block Layout