pe.h revision 271135
143410Snewton/* $FreeBSD: stable/10/sys/boot/efi/include/amd64/pe.h 263115 2014-03-13 18:17:18Z emaste $ */
243410Snewton/*
343410Snewton    PE32+ header file
443410Snewton */
543410Snewton#ifndef _PE_H
643410Snewton#define _PE_H
743410Snewton
843410Snewton#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ
943410Snewton#define IMAGE_OS2_SIGNATURE                 0x454E      // NE
1043410Snewton#define IMAGE_OS2_SIGNATURE_LE              0x454C      // LE
1143410Snewton#define IMAGE_NT_SIGNATURE                  0x00004550  // PE00
1243410Snewton#define IMAGE_EDOS_SIGNATURE                0x44454550  // PEED
1343410Snewton
1443410Snewton
1543410Snewtontypedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
1643410Snewton    UINT16   e_magic;                     // Magic number
1743410Snewton    UINT16   e_cblp;                      // Bytes on last page of file
1843410Snewton    UINT16   e_cp;                        // Pages in file
1943410Snewton    UINT16   e_crlc;                      // Relocations
2043410Snewton    UINT16   e_cparhdr;                   // Size of header in paragraphs
2143410Snewton    UINT16   e_minalloc;                  // Minimum extra paragraphs needed
2243410Snewton    UINT16   e_maxalloc;                  // Maximum extra paragraphs needed
2343410Snewton    UINT16   e_ss;                        // Initial (relative) SS value
2443410Snewton    UINT16   e_sp;                        // Initial SP value
2543410Snewton    UINT16   e_csum;                      // Checksum
2643410Snewton    UINT16   e_ip;                        // Initial IP value
2743410Snewton    UINT16   e_cs;                        // Initial (relative) CS value
2843410Snewton    UINT16   e_lfarlc;                    // File address of relocation table
2943410Snewton    UINT16   e_ovno;                      // Overlay number
3043410Snewton    UINT16   e_res[4];                    // Reserved words
3143410Snewton    UINT16   e_oemid;                     // OEM identifier (for e_oeminfo)
3249263Snewton    UINT16   e_oeminfo;                   // OEM information; e_oemid specific
3349413Sgreen    UINT16   e_res2[10];                  // Reserved words
3443410Snewton    UINT32   e_lfanew;                    // File address of new exe header
3543410Snewton  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
3643410Snewton
3743410Snewtontypedef struct _IMAGE_OS2_HEADER {      // OS/2 .EXE header
3843410Snewton    UINT16   ne_magic;                    // Magic number
3943410Snewton    UINT8    ne_ver;                      // Version number
4043410Snewton    UINT8    ne_rev;                      // Revision number
4143410Snewton    UINT16   ne_enttab;                   // Offset of Entry Table
4243410Snewton    UINT16   ne_cbenttab;                 // Number of bytes in Entry Table
4343410Snewton    UINT32   ne_crc;                      // Checksum of whole file
4443410Snewton    UINT16   ne_flags;                    // Flag UINT16
4543410Snewton    UINT16   ne_autodata;                 // Automatic data segment number
4643410Snewton    UINT16   ne_heap;                     // Initial heap allocation
4743410Snewton    UINT16   ne_stack;                    // Initial stack allocation
4843410Snewton    UINT32   ne_csip;                     // Initial CS:IP setting
4943410Snewton    UINT32   ne_sssp;                     // Initial SS:SP setting
5043410Snewton    UINT16   ne_cseg;                     // Count of file segments
5143410Snewton    UINT16   ne_cmod;                     // Entries in Module Reference Table
5243410Snewton    UINT16   ne_cbnrestab;                // Size of non-resident name table
5343410Snewton    UINT16   ne_segtab;                   // Offset of Segment Table
5443410Snewton    UINT16   ne_rsrctab;                  // Offset of Resource Table
5543410Snewton    UINT16   ne_restab;                   // Offset of resident name table
5643410Snewton    UINT16   ne_modtab;                   // Offset of Module Reference Table
5743410Snewton    UINT16   ne_imptab;                   // Offset of Imported Names Table
5843410Snewton    UINT32   ne_nrestab;                  // Offset of Non-resident Names Table
5943410Snewton    UINT16   ne_cmovent;                  // Count of movable entries
6043410Snewton    UINT16   ne_align;                    // Segment alignment shift count
6143410Snewton    UINT16   ne_cres;                     // Count of resource segments
6243410Snewton    UINT8    ne_exetyp;                   // Target Operating system
6343410Snewton    UINT8    ne_flagsothers;              // Other .EXE flags
6443410Snewton    UINT16   ne_pretthunks;               // offset to return thunks
6543410Snewton    UINT16   ne_psegrefbytes;             // offset to segment ref. bytes
6643410Snewton    UINT16   ne_swaparea;                 // Minimum code swap area size
6743410Snewton    UINT16   ne_expver;                   // Expected Windows version number
6843410Snewton  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
6943410Snewton
7043410Snewton//
7143410Snewton// File header format.
7243410Snewton//
7343410Snewton
7443410Snewtontypedef struct _IMAGE_FILE_HEADER {
7543410Snewton    UINT16   Machine;
7643410Snewton    UINT16   NumberOfSections;
7743410Snewton    UINT32   TimeDateStamp;
7843410Snewton    UINT32   PointerToSymbolTable;
7943410Snewton    UINT32   NumberOfSymbols;
8043410Snewton    UINT16   SizeOfOptionalHeader;
8143410Snewton    UINT16   Characteristics;
8243410Snewton} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
8343410Snewton
8443410Snewton#define IMAGE_SIZEOF_FILE_HEADER             20
8543410Snewton
8643410Snewton#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
8743410Snewton#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).
8843410Snewton#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
8943410Snewton#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
9043410Snewton#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
9143410Snewton#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
9243410Snewton#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
9343410Snewton#define IMAGE_FILE_SYSTEM                    0x1000  // System File.
9443410Snewton#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
9543410Snewton#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
9643410Snewton
9743410Snewton#define IMAGE_FILE_MACHINE_UNKNOWN           0
9843410Snewton#define IMAGE_FILE_MACHINE_I386              0x14c   // Intel 386.
9943410Snewton#define IMAGE_FILE_MACHINE_R3000             0x162   // MIPS little-endian, 0540 big-endian
10043410Snewton#define IMAGE_FILE_MACHINE_R4000             0x166   // MIPS little-endian
10143410Snewton#define IMAGE_FILE_MACHINE_ALPHA             0x184   // Alpha_AXP
10243410Snewton#define IMAGE_FILE_MACHINE_POWERPC           0x1F0   // IBM PowerPC Little-Endian
10343410Snewton#define IMAGE_FILE_MACHINE_TAHOE             0x7cc   // Intel EM machine
10443410Snewton//
10543410Snewton// Directory format.
10643410Snewton//
10743410Snewton
10843410Snewtontypedef struct _IMAGE_DATA_DIRECTORY {
10947625Sphk    UINT32   VirtualAddress;
11047625Sphk    UINT32   Size;
11147625Sphk} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
11247625Sphk
11347625Sphk#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
11447625Sphk
11547625Sphk//
11647625Sphk// Optional header format.
11747625Sphk//
11847625Sphk
11947625Sphktypedef struct _IMAGE_OPTIONAL_HEADER {
12047625Sphk    //
12147625Sphk    // Standard fields.
12247625Sphk    //
12347625Sphk
12447625Sphk    UINT16    Magic;
12547625Sphk    UINT8     MajorLinkerVersion;
12647625Sphk    UINT8     MinorLinkerVersion;
12747625Sphk    UINT32    SizeOfCode;
12847625Sphk    UINT32    SizeOfInitializedData;
12943410Snewton    UINT32    SizeOfUninitializedData;
13043410Snewton    UINT32    AddressOfEntryPoint;
13143410Snewton    UINT32    BaseOfCode;
13243410Snewton    UINT32    BaseOfData;
13343410Snewton
13443410Snewton    //
13543410Snewton    // NT additional fields.
13643410Snewton    //
13743410Snewton
13843410Snewton    UINT32   ImageBase;
13943410Snewton    UINT32   SectionAlignment;
14043410Snewton    UINT32   FileAlignment;
14143410Snewton    UINT16   MajorOperatingSystemVersion;
14243410Snewton    UINT16   MinorOperatingSystemVersion;
14343410Snewton    UINT16   MajorImageVersion;
14443410Snewton    UINT16   MinorImageVersion;
14543410Snewton    UINT16   MajorSubsystemVersion;
14643410Snewton    UINT16   MinorSubsystemVersion;
14743410Snewton    UINT32   Reserved1;
14843410Snewton    UINT32   SizeOfImage;
14943410Snewton    UINT32   SizeOfHeaders;
15043410Snewton    UINT32   CheckSum;
15143410Snewton    UINT16   Subsystem;
15243410Snewton    UINT16   DllCharacteristics;
15343410Snewton    UINT32   SizeOfStackReserve;
15444208Snewton    UINT32   SizeOfStackCommit;
15544208Snewton    UINT32   SizeOfHeapReserve;
15644208Snewton    UINT32   SizeOfHeapCommit;
15744208Snewton    UINT32   LoaderFlags;
15844208Snewton    UINT32   NumberOfRvaAndSizes;
15949344Snewton    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
16047640Sphk} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
16144208Snewton
16244208Snewtontypedef struct _IMAGE_ROM_OPTIONAL_HEADER {
16349344Snewton    UINT16  Magic;
16449344Snewton    UINT8   MajorLinkerVersion;
16544208Snewton    UINT8   MinorLinkerVersion;
16644208Snewton    UINT32  SizeOfCode;
16744208Snewton    UINT32  SizeOfInitializedData;
16844208Snewton    UINT32  SizeOfUninitializedData;
16944208Snewton    UINT32  AddressOfEntryPoint;
17044208Snewton    UINT32  BaseOfCode;
17144208Snewton    UINT32  BaseOfData;
17244208Snewton    UINT32  BaseOfBss;
17344208Snewton    UINT32  GprMask;
17444208Snewton    UINT32  CprMask[4];
17544208Snewton    UINT32  GpValue;
17644208Snewton} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
17744208Snewton
17844208Snewton#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER      56
17943410Snewton#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER      28
18043410Snewton#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER      224
18143410Snewton
18243410Snewton#define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b
18343410Snewton#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
18443410Snewton
18543410Snewtontypedef struct _IMAGE_NT_HEADERS {
18643410Snewton    UINT32 Signature;
18743410Snewton    IMAGE_FILE_HEADER FileHeader;
18843410Snewton    IMAGE_OPTIONAL_HEADER OptionalHeader;
18943410Snewton} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
19043410Snewton
19143410Snewtontypedef struct _IMAGE_ROM_HEADERS {
19243410Snewton    IMAGE_FILE_HEADER FileHeader;
19343410Snewton    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
19443410Snewton} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
19543410Snewton
19643410Snewton#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        \
19743410Snewton    ((UINT32)ntheader +                                                  \
19843410Snewton     FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 \
19943410Snewton     ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   \
20043410Snewton    ))
20143410Snewton
20243410Snewton
20343410Snewton// Subsystem Values
20443410Snewton
20543410Snewton#define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.
20643410Snewton#define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.
20743410Snewton#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.
20843410Snewton#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.
20943410Snewton#define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.
21043410Snewton#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image run  in the Posix character subsystem.
21143410Snewton
21243410Snewton
21343410Snewton// Directory Entries
21443410Snewton
21543410Snewton#define IMAGE_DIRECTORY_ENTRY_EXPORT         0   // Export Directory
21643410Snewton#define IMAGE_DIRECTORY_ENTRY_IMPORT         1   // Import Directory
21743410Snewton#define IMAGE_DIRECTORY_ENTRY_RESOURCE       2   // Resource Directory
21843410Snewton#define IMAGE_DIRECTORY_ENTRY_EXCEPTION      3   // Exception Directory
21943410Snewton#define IMAGE_DIRECTORY_ENTRY_SECURITY       4   // Security Directory
22043410Snewton#define IMAGE_DIRECTORY_ENTRY_BASERELOC      5   // Base Relocation Table
22143410Snewton#define IMAGE_DIRECTORY_ENTRY_DEBUG          6   // Debug Directory
22243410Snewton#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT      7   // Description String
22343410Snewton#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR      8   // Machine Value (MIPS GP)
22443410Snewton#define IMAGE_DIRECTORY_ENTRY_TLS            9   // TLS Directory
22543410Snewton#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG   10   // Load Configuration Directory
22643410Snewton
22743410Snewton//
22843410Snewton// Section header format.
22943410Snewton//
23043410Snewton
23143410Snewton#define IMAGE_SIZEOF_SHORT_NAME              8
23243410Snewton
23343410Snewtontypedef struct _IMAGE_SECTION_HEADER {
23443410Snewton    UINT8   Name[IMAGE_SIZEOF_SHORT_NAME];
23543410Snewton    union {
23643410Snewton            UINT32   PhysicalAddress;
23743410Snewton            UINT32   VirtualSize;
23843410Snewton    } Misc;
23943410Snewton    UINT32   VirtualAddress;
24043410Snewton    UINT32   SizeOfRawData;
24143410Snewton    UINT32   PointerToRawData;
24243410Snewton    UINT32   PointerToRelocations;
24343410Snewton    UINT32   PointerToLinenumbers;
24443410Snewton    UINT16   NumberOfRelocations;
24543410Snewton    UINT16   NumberOfLinenumbers;
24643410Snewton    UINT32   Characteristics;
24743410Snewton} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
24843410Snewton
24943410Snewton#define IMAGE_SIZEOF_SECTION_HEADER          40
25043410Snewton
25143410Snewton#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
25243410Snewton
25343410Snewton#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
25449413Sgreen#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
25543410Snewton#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
25649413Sgreen
25743410Snewton#define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
25843410Snewton#define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
25943410Snewton#define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
26043410Snewton#define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
26143410Snewton
26243410Snewton#define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
26343410Snewton#define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
26443410Snewton#define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
26543410Snewton#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
26643410Snewton#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
26743410Snewton#define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
26843410Snewton#define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
26943410Snewton
27043410Snewton#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
27143410Snewton#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
27243410Snewton#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
27343410Snewton#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
27443410Snewton#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
27543410Snewton#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
27643410Snewton#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.
27743410Snewton
27843410Snewton//
27943410Snewton// Symbol format.
28043410Snewton//
28143410Snewton
28243410Snewton
28343410Snewton#define IMAGE_SIZEOF_SYMBOL                  18
28443410Snewton
28543410Snewton//
28643410Snewton// Section values.
28743410Snewton//
28843410Snewton// Symbols have a section number of the section in which they are
28943410Snewton// defined. Otherwise, section numbers have the following meanings:
29043410Snewton//
29143410Snewton
29243410Snewton#define IMAGE_SYM_UNDEFINED           (UINT16)0           // Symbol is undefined or is common.
29343410Snewton#define IMAGE_SYM_ABSOLUTE            (UINT16)-1          // Symbol is an absolute value.
29443410Snewton#define IMAGE_SYM_DEBUG               (UINT16)-2          // Symbol is a special debug item.
29543410Snewton
29643410Snewton//
29743410Snewton// Type (fundamental) values.
29843410Snewton//
29943410Snewton
30043410Snewton#define IMAGE_SYM_TYPE_NULL                  0           // no type.
30143410Snewton#define IMAGE_SYM_TYPE_VOID                  1           //
30243410Snewton#define IMAGE_SYM_TYPE_CHAR                  2           // type character.
30343410Snewton#define IMAGE_SYM_TYPE_SHORT                 3           // type short integer.
30443410Snewton#define IMAGE_SYM_TYPE_INT                   4           //
30543410Snewton#define IMAGE_SYM_TYPE_LONG                  5           //
30643410Snewton#define IMAGE_SYM_TYPE_FLOAT                 6           //
30743410Snewton#define IMAGE_SYM_TYPE_DOUBLE                7           //
30843410Snewton#define IMAGE_SYM_TYPE_STRUCT                8           //
30943410Snewton#define IMAGE_SYM_TYPE_UNION                 9           //
31043410Snewton#define IMAGE_SYM_TYPE_ENUM                  10          // enumeration.
31143410Snewton#define IMAGE_SYM_TYPE_MOE                   11          // member of enumeration.
31243410Snewton#define IMAGE_SYM_TYPE_BYTE                  12          //
31343410Snewton#define IMAGE_SYM_TYPE_WORD                  13          //
31443410Snewton#define IMAGE_SYM_TYPE_UINT                  14          //
31543410Snewton#define IMAGE_SYM_TYPE_DWORD                 15          //
31643410Snewton
31743410Snewton//
31843410Snewton// Type (derived) values.
31943410Snewton//
32043410Snewton
32143410Snewton#define IMAGE_SYM_DTYPE_NULL                 0           // no derived type.
32243410Snewton#define IMAGE_SYM_DTYPE_POINTER              1           // pointer.
32343410Snewton#define IMAGE_SYM_DTYPE_FUNCTION             2           // function.
32443410Snewton#define IMAGE_SYM_DTYPE_ARRAY                3           // array.
32543410Snewton
32643410Snewton//
32743410Snewton// Storage classes.
32843410Snewton//
32943410Snewton
33043410Snewton#define IMAGE_SYM_CLASS_END_OF_FUNCTION      (BYTE )-1
33143410Snewton#define IMAGE_SYM_CLASS_NULL                 0
33243410Snewton#define IMAGE_SYM_CLASS_AUTOMATIC            1
33343410Snewton#define IMAGE_SYM_CLASS_EXTERNAL             2
33443410Snewton#define IMAGE_SYM_CLASS_STATIC               3
33543410Snewton#define IMAGE_SYM_CLASS_REGISTER             4
33643410Snewton#define IMAGE_SYM_CLASS_EXTERNAL_DEF         5
33743410Snewton#define IMAGE_SYM_CLASS_LABEL                6
33843410Snewton#define IMAGE_SYM_CLASS_UNDEFINED_LABEL      7
33943410Snewton#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT     8
34043410Snewton#define IMAGE_SYM_CLASS_ARGUMENT             9
34143410Snewton#define IMAGE_SYM_CLASS_STRUCT_TAG           10
34243410Snewton#define IMAGE_SYM_CLASS_MEMBER_OF_UNION      11
34349413Sgreen#define IMAGE_SYM_CLASS_UNION_TAG            12
34443410Snewton#define IMAGE_SYM_CLASS_TYPE_DEFINITION      13
34543410Snewton#define IMAGE_SYM_CLASS_UNDEFINED_STATIC     14
34643410Snewton#define IMAGE_SYM_CLASS_ENUM_TAG             15
34743410Snewton#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM       16
34843410Snewton#define IMAGE_SYM_CLASS_REGISTER_PARAM       17
34943410Snewton#define IMAGE_SYM_CLASS_BIT_FIELD            18
35043410Snewton#define IMAGE_SYM_CLASS_BLOCK                100
35143410Snewton#define IMAGE_SYM_CLASS_FUNCTION             101
35243410Snewton#define IMAGE_SYM_CLASS_END_OF_STRUCT        102
35343410Snewton#define IMAGE_SYM_CLASS_FILE                 103
35443410Snewton// new
35543410Snewton#define IMAGE_SYM_CLASS_SECTION              104
35643410Snewton#define IMAGE_SYM_CLASS_WEAK_EXTERNAL        105
35743410Snewton
35843410Snewton// type packing constants
35943410Snewton
36043410Snewton#define N_BTMASK                            017
36143410Snewton#define N_TMASK                             060
36243410Snewton#define N_TMASK1                            0300
36343410Snewton#define N_TMASK2                            0360
36443410Snewton#define N_BTSHFT                            4
36543410Snewton#define N_TSHIFT                            2
36643410Snewton
36743410Snewton// MACROS
36843410Snewton
36943410Snewton//
37043410Snewton// Communal selection types.
37143410Snewton//
37243410Snewton
37343410Snewton#define IMAGE_COMDAT_SELECT_NODUPLICATES   1
37443410Snewton#define IMAGE_COMDAT_SELECT_ANY            2
37543410Snewton#define IMAGE_COMDAT_SELECT_SAME_SIZE      3
37643410Snewton#define IMAGE_COMDAT_SELECT_EXACT_MATCH    4
37743410Snewton#define IMAGE_COMDAT_SELECT_ASSOCIATIVE    5
37843410Snewton
37943410Snewton#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
38043410Snewton#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY   2
38143410Snewton#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS     3
38243410Snewton
38343410Snewton
384//
385// Relocation format.
386//
387
388typedef struct _IMAGE_RELOCATION {
389    UINT32   VirtualAddress;
390    UINT32   SymbolTableIndex;
391    UINT16    Type;
392} IMAGE_RELOCATION;
393
394#define IMAGE_SIZEOF_RELOCATION              10
395
396//
397// I386 relocation types.
398//
399
400#define IMAGE_REL_I386_ABSOLUTE              0           // Reference is absolute, no relocation is necessary
401#define IMAGE_REL_I386_DIR16                 01          // Direct 16-bit reference to the symbols virtual address
402#define IMAGE_REL_I386_REL16                 02          // PC-relative 16-bit reference to the symbols virtual address
403#define IMAGE_REL_I386_DIR32                 06          // Direct 32-bit reference to the symbols virtual address
404#define IMAGE_REL_I386_DIR32NB               07          // Direct 32-bit reference to the symbols virtual address, base not included
405#define IMAGE_REL_I386_SEG12                 011         // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
406#define IMAGE_REL_I386_SECTION               012
407#define IMAGE_REL_I386_SECREL                013
408#define IMAGE_REL_I386_REL32                 024         // PC-relative 32-bit reference to the symbols virtual address
409
410//
411// MIPS relocation types.
412//
413
414#define IMAGE_REL_MIPS_ABSOLUTE              0           // Reference is absolute, no relocation is necessary
415#define IMAGE_REL_MIPS_REFHALF               01
416#define IMAGE_REL_MIPS_REFWORD               02
417#define IMAGE_REL_MIPS_JMPADDR               03
418#define IMAGE_REL_MIPS_REFHI                 04
419#define IMAGE_REL_MIPS_REFLO                 05
420#define IMAGE_REL_MIPS_GPREL                 06
421#define IMAGE_REL_MIPS_LITERAL               07
422#define IMAGE_REL_MIPS_SECTION               012
423#define IMAGE_REL_MIPS_SECREL                013
424#define IMAGE_REL_MIPS_REFWORDNB             042
425#define IMAGE_REL_MIPS_PAIR                  045
426
427//
428// Alpha Relocation types.
429//
430
431#define IMAGE_REL_ALPHA_ABSOLUTE             0x0
432#define IMAGE_REL_ALPHA_REFLONG              0x1
433#define IMAGE_REL_ALPHA_REFQUAD              0x2
434#define IMAGE_REL_ALPHA_GPREL32              0x3
435#define IMAGE_REL_ALPHA_LITERAL              0x4
436#define IMAGE_REL_ALPHA_LITUSE               0x5
437#define IMAGE_REL_ALPHA_GPDISP               0x6
438#define IMAGE_REL_ALPHA_BRADDR               0x7
439#define IMAGE_REL_ALPHA_HINT                 0x8
440#define IMAGE_REL_ALPHA_INLINE_REFLONG       0x9
441#define IMAGE_REL_ALPHA_REFHI                0xA
442#define IMAGE_REL_ALPHA_REFLO                0xB
443#define IMAGE_REL_ALPHA_PAIR                 0xC
444#define IMAGE_REL_ALPHA_MATCH                0xD
445#define IMAGE_REL_ALPHA_SECTION              0xE
446#define IMAGE_REL_ALPHA_SECREL               0xF
447#define IMAGE_REL_ALPHA_REFLONGNB            0x10
448
449//
450// IBM PowerPC relocation types.
451//
452
453#define IMAGE_REL_PPC_ABSOLUTE 0x0000  // NOP
454#define IMAGE_REL_PPC_ADDR64   0x0001  // 64-bit address
455#define IMAGE_REL_PPC_ADDR32   0x0002  // 32-bit address
456#define IMAGE_REL_PPC_ADDR24   0x0003  // 26-bit address, shifted left 2 (branch absolute)
457#define IMAGE_REL_PPC_ADDR16   0x0004  // 16-bit address
458#define IMAGE_REL_PPC_ADDR14   0x0005  // 16-bit address, shifted left 2 (load doubleword)
459#define IMAGE_REL_PPC_REL24    0x0006  // 26-bit PC-relative offset, shifted left 2 (branch relative)
460#define IMAGE_REL_PPC_REL14    0x0007  // 16-bit PC-relative offset, shifted left 2 (br cond relative)
461#define IMAGE_REL_PPC_TOCREL16 0x0008  // 16-bit offset from TOC base
462#define IMAGE_REL_PPC_TOCREL14 0x0009  // 16-bit offset from TOC base, shifted left 2 (load doubleword)
463
464#define IMAGE_REL_PPC_ADDR32NB 0x000A  // 32-bit addr w/o image base
465#define IMAGE_REL_PPC_SECREL   0x000B  // va of containing section (as in an image sectionhdr)
466#define IMAGE_REL_PPC_SECTION  0x000C  // sectionheader number
467#define IMAGE_REL_PPC_IFGLUE   0x000D  // substitute TOC restore instruction iff symbol is glue code
468#define IMAGE_REL_PPC_IMGLUE   0x000E  // symbol is glue code; virtual address is TOC restore instruction
469
470#define IMAGE_REL_PPC_TYPEMASK 0x00FF  // mask to isolate above values in IMAGE_RELOCATION.Type
471
472// Flag bits in IMAGE_RELOCATION.TYPE
473
474#define IMAGE_REL_PPC_NEG      0x0100  // subtract reloc value rather than adding it
475#define IMAGE_REL_PPC_BRTAKEN  0x0200  // fix branch prediction bit to predict branch taken
476#define IMAGE_REL_PPC_BRNTAKEN 0x0400  // fix branch prediction bit to predict branch not taken
477#define IMAGE_REL_PPC_TOCDEFN  0x0800  // toc slot defined in file (or, data in toc)
478
479//
480// Based relocation format.
481//
482
483typedef struct _IMAGE_BASE_RELOCATION {
484    UINT32   VirtualAddress;
485    UINT32   SizeOfBlock;
486//  UINT16    TypeOffset[1];
487} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
488
489#define IMAGE_SIZEOF_BASE_RELOCATION         8
490
491//
492// Based relocation types.
493//
494
495#define IMAGE_REL_BASED_ABSOLUTE              0
496#define IMAGE_REL_BASED_HIGH                  1
497#define IMAGE_REL_BASED_LOW                   2
498#define IMAGE_REL_BASED_HIGHLOW               3
499#define IMAGE_REL_BASED_HIGHADJ               4
500#define IMAGE_REL_BASED_MIPS_JMPADDR          5
501#define IMAGE_REL_BASED_IA64_IMM64            9
502#define IMAGE_REL_BASED_DIR64                 10
503
504//
505// Line number format.
506//
507
508typedef struct _IMAGE_LINENUMBER {
509    union {
510        UINT32   SymbolTableIndex;               // Symbol table index of function name if Linenumber is 0.
511        UINT32   VirtualAddress;                 // Virtual address of line number.
512    } Type;
513    UINT16    Linenumber;                         // Line number.
514} IMAGE_LINENUMBER;
515
516#define IMAGE_SIZEOF_LINENUMBER              6
517
518//
519// Archive format.
520//
521
522#define IMAGE_ARCHIVE_START_SIZE             8
523#define IMAGE_ARCHIVE_START                  "!<arch>\n"
524#define IMAGE_ARCHIVE_END                    "`\n"
525#define IMAGE_ARCHIVE_PAD                    "\n"
526#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
527#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
528
529typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
530    UINT8     Name[16];                          // File member name - `/' terminated.
531    UINT8     Date[12];                          // File member date - decimal.
532    UINT8     UserID[6];                         // File member user id - decimal.
533    UINT8     GroupID[6];                        // File member group id - decimal.
534    UINT8     Mode[8];                           // File member mode - octal.
535    UINT8     Size[10];                          // File member size - decimal.
536    UINT8     EndHeader[2];                      // String to end header.
537} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
538
539#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60
540
541//
542// DLL support.
543//
544
545//
546// Export Format
547//
548
549typedef struct _IMAGE_EXPORT_DIRECTORY {
550    UINT32   Characteristics;
551    UINT32   TimeDateStamp;
552    UINT16   MajorVersion;
553    UINT16   MinorVersion;
554    UINT32   Name;
555    UINT32   Base;
556    UINT32   NumberOfFunctions;
557    UINT32   NumberOfNames;
558    UINT32   *AddressOfFunctions;
559    UINT32   *AddressOfNames;
560    UINT32   *AddressOfNameOrdinals;
561} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
562
563//
564// Import Format
565//
566
567typedef struct _IMAGE_IMPORT_BY_NAME {
568    UINT16    Hint;
569    UINT8     Name[1];
570} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
571
572typedef struct _IMAGE_THUNK_DATA {
573    union {
574        UINT32 Function;
575        UINT32 Ordinal;
576        PIMAGE_IMPORT_BY_NAME AddressOfData;
577    } u1;
578} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;
579
580#define IMAGE_ORDINAL_FLAG 0x80000000
581#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
582#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
583
584typedef struct _IMAGE_IMPORT_DESCRIPTOR {
585    UINT32   Characteristics;
586    UINT32   TimeDateStamp;
587    UINT32   ForwarderChain;
588    UINT32   Name;
589    PIMAGE_THUNK_DATA FirstThunk;
590} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
591
592#endif
593