177943Sdfr/* $FreeBSD: releng/10.3/sys/boot/efi/include/ia64/pe.h 163898 2006-11-02 02:42:48Z marcel $ */
277943Sdfr/*
377943Sdfr    PE32+ header file
477943Sdfr */
577943Sdfr#ifndef _PE_H
677943Sdfr#define _PE_H
777943Sdfr
877943Sdfr#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ
977943Sdfr#define IMAGE_OS2_SIGNATURE                 0x454E      // NE
1077943Sdfr#define IMAGE_OS2_SIGNATURE_LE              0x454C      // LE
1177943Sdfr#define IMAGE_NT_SIGNATURE                  0x00004550  // PE00
1277943Sdfr#define IMAGE_EDOS_SIGNATURE                0x44454550  // PEED
1377943Sdfr
1477943Sdfr/*****************************************************************************
1577943Sdfr * The following stuff comes from winnt.h from the ia64sdk, plus the Plabel for
1677943Sdfr * loading EM executables.
1777943Sdfr *****************************************************************************/
1877943Sdfr//
1977943Sdfr// Intel IA64 specific
2077943Sdfr//
2177943Sdfr
2277943Sdfr#define IMAGE_REL_BASED_IA64_IMM64            9
2377943Sdfr#define IMAGE_REL_BASED_IA64_DIR64            10
2477943Sdfr
2577943Sdfrstruct Plabel {
2677943Sdfr    UINT64  EntryPoint;
2777943Sdfr    UINT64  NewGP;
2877943Sdfr};
2977943Sdfr
3077943Sdfrtypedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
3177943Sdfr    UINT16   e_magic;                     // Magic number
3277943Sdfr    UINT16   e_cblp;                      // Bytes on last page of file
3377943Sdfr    UINT16   e_cp;                        // Pages in file
3477943Sdfr    UINT16   e_crlc;                      // Relocations
3577943Sdfr    UINT16   e_cparhdr;                   // Size of header in paragraphs
3677943Sdfr    UINT16   e_minalloc;                  // Minimum extra paragraphs needed
3777943Sdfr    UINT16   e_maxalloc;                  // Maximum extra paragraphs needed
3877943Sdfr    UINT16   e_ss;                        // Initial (relative) SS value
3977943Sdfr    UINT16   e_sp;                        // Initial SP value
4077943Sdfr    UINT16   e_csum;                      // Checksum
4177943Sdfr    UINT16   e_ip;                        // Initial IP value
4277943Sdfr    UINT16   e_cs;                        // Initial (relative) CS value
4377943Sdfr    UINT16   e_lfarlc;                    // File address of relocation table
4477943Sdfr    UINT16   e_ovno;                      // Overlay number
4577943Sdfr    UINT16   e_res[4];                    // Reserved words
4677943Sdfr    UINT16   e_oemid;                     // OEM identifier (for e_oeminfo)
4777943Sdfr    UINT16   e_oeminfo;                   // OEM information; e_oemid specific
4877943Sdfr    UINT16   e_res2[10];                  // Reserved words
4977943Sdfr    UINT32   e_lfanew;                    // File address of new exe header
5077943Sdfr  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
5177943Sdfr
5277943Sdfrtypedef struct _IMAGE_OS2_HEADER {      // OS/2 .EXE header
5377943Sdfr    UINT16   ne_magic;                    // Magic number
5477943Sdfr    UINT8    ne_ver;                      // Version number
5577943Sdfr    UINT8    ne_rev;                      // Revision number
5677943Sdfr    UINT16   ne_enttab;                   // Offset of Entry Table
5777943Sdfr    UINT16   ne_cbenttab;                 // Number of bytes in Entry Table
5877943Sdfr    UINT32   ne_crc;                      // Checksum of whole file
5977943Sdfr    UINT16   ne_flags;                    // Flag UINT16
6077943Sdfr    UINT16   ne_autodata;                 // Automatic data segment number
6177943Sdfr    UINT16   ne_heap;                     // Initial heap allocation
6277943Sdfr    UINT16   ne_stack;                    // Initial stack allocation
6377943Sdfr    UINT32   ne_csip;                     // Initial CS:IP setting
6477943Sdfr    UINT32   ne_sssp;                     // Initial SS:SP setting
6577943Sdfr    UINT16   ne_cseg;                     // Count of file segments
6677943Sdfr    UINT16   ne_cmod;                     // Entries in Module Reference Table
6777943Sdfr    UINT16   ne_cbnrestab;                // Size of non-resident name table
6877943Sdfr    UINT16   ne_segtab;                   // Offset of Segment Table
6977943Sdfr    UINT16   ne_rsrctab;                  // Offset of Resource Table
7077943Sdfr    UINT16   ne_restab;                   // Offset of resident name table
7177943Sdfr    UINT16   ne_modtab;                   // Offset of Module Reference Table
7277943Sdfr    UINT16   ne_imptab;                   // Offset of Imported Names Table
7377943Sdfr    UINT32   ne_nrestab;                  // Offset of Non-resident Names Table
7477943Sdfr    UINT16   ne_cmovent;                  // Count of movable entries
7577943Sdfr    UINT16   ne_align;                    // Segment alignment shift count
7677943Sdfr    UINT16   ne_cres;                     // Count of resource segments
7777943Sdfr    UINT8    ne_exetyp;                   // Target Operating system
7877943Sdfr    UINT8    ne_flagsothers;              // Other .EXE flags
7977943Sdfr    UINT16   ne_pretthunks;               // offset to return thunks
8077943Sdfr    UINT16   ne_psegrefbytes;             // offset to segment ref. bytes
8177943Sdfr    UINT16   ne_swaparea;                 // Minimum code swap area size
8277943Sdfr    UINT16   ne_expver;                   // Expected Windows version number
8377943Sdfr  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
8477943Sdfr
8577943Sdfr//
8677943Sdfr// File header format.
8777943Sdfr//
8877943Sdfr
8977943Sdfrtypedef struct _IMAGE_FILE_HEADER {
9077943Sdfr    UINT16   Machine;
9177943Sdfr    UINT16   NumberOfSections;
9277943Sdfr    UINT32   TimeDateStamp;
9377943Sdfr    UINT32   PointerToSymbolTable;
9477943Sdfr    UINT32   NumberOfSymbols;
9577943Sdfr    UINT16   SizeOfOptionalHeader;
9677943Sdfr    UINT16   Characteristics;
9777943Sdfr} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
9877943Sdfr
9977943Sdfr#define IMAGE_SIZEOF_FILE_HEADER             20
10077943Sdfr
10177943Sdfr#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
10277943Sdfr#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).
10377943Sdfr#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
10477943Sdfr#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
10577943Sdfr#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
10677943Sdfr#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
10777943Sdfr#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
10877943Sdfr#define IMAGE_FILE_SYSTEM                    0x1000  // System File.
10977943Sdfr#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
11077943Sdfr#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
11177943Sdfr
11277943Sdfr#define IMAGE_FILE_MACHINE_UNKNOWN           0
11377943Sdfr#define IMAGE_FILE_MACHINE_I386              0x14c   // Intel 386.
11477943Sdfr#define IMAGE_FILE_MACHINE_R3000             0x162   // MIPS little-endian, 0540 big-endian
11577943Sdfr#define IMAGE_FILE_MACHINE_R4000             0x166   // MIPS little-endian
11677943Sdfr#define IMAGE_FILE_MACHINE_ALPHA             0x184   // Alpha_AXP
11777943Sdfr#define IMAGE_FILE_MACHINE_POWERPC           0x1F0   // IBM PowerPC Little-Endian
11877943Sdfr#define IMAGE_FILE_MACHINE_TAHOE             0x7cc   // Intel EM machine
11977943Sdfr//
12077943Sdfr// Directory format.
12177943Sdfr//
12277943Sdfr
12377943Sdfrtypedef struct _IMAGE_DATA_DIRECTORY {
12477943Sdfr    UINT32   VirtualAddress;
12577943Sdfr    UINT32   Size;
12677943Sdfr} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
12777943Sdfr
12877943Sdfr#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
12977943Sdfr
13077943Sdfr
13177943Sdfrtypedef struct _IMAGE_ROM_OPTIONAL_HEADER {
13277943Sdfr    UINT16  Magic;
13377943Sdfr    UINT8   MajorLinkerVersion;
13477943Sdfr    UINT8   MinorLinkerVersion;
13577943Sdfr    UINT32  SizeOfCode;
13677943Sdfr    UINT32  SizeOfInitializedData;
13777943Sdfr    UINT32  SizeOfUninitializedData;
13877943Sdfr    UINT32  AddressOfEntryPoint;
13977943Sdfr    UINT32  BaseOfCode;
14077943Sdfr    UINT32  BaseOfData;
14177943Sdfr    UINT32  BaseOfBss;
14277943Sdfr    UINT32  GprMask;
14377943Sdfr    UINT32  CprMask[4];
14477943Sdfr    UINT32  GpValue;
14577943Sdfr} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
14677943Sdfr
14777943Sdfrtypedef struct _IMAGE_OPTIONAL_HEADER {
14877943Sdfr    UINT16      Magic;
14977943Sdfr    UINT8       MajorLinkerVersion;
15077943Sdfr    UINT8       MinorLinkerVersion;
15177943Sdfr    UINT32      SizeOfCode;
15277943Sdfr    UINT32      SizeOfInitializedData;
15377943Sdfr    UINT32      SizeOfUninitializedData;
15477943Sdfr    UINT32      AddressOfEntryPoint;
15577943Sdfr    UINT32      BaseOfCode;
15677943Sdfr    // UINT32       BaseOfData;
15777943Sdfr    UINT64      ImageBase;
15877943Sdfr    UINT32      SectionAlignment;
15977943Sdfr    UINT32      FileAlignment;
16077943Sdfr    UINT16      MajorOperatingSystemVersion;
16177943Sdfr    UINT16      MinorOperatingSystemVersion;
16277943Sdfr    UINT16      MajorImageVersion;
16377943Sdfr    UINT16      MinorImageVersion;
16477943Sdfr    UINT16      MajorSubsystemVersion;
16577943Sdfr    UINT16      MinorSubsystemVersion;
16677943Sdfr    UINT32      Win32VersionValue;
16777943Sdfr    UINT32      SizeOfImage;
16877943Sdfr    UINT32      SizeOfHeaders;
16977943Sdfr    UINT32      CheckSum;
17077943Sdfr    UINT16      Subsystem;
17177943Sdfr    UINT16      DllCharacteristics;
17277943Sdfr    UINT64      SizeOfStackReserve;
17377943Sdfr    UINT64      SizeOfStackCommit;
17477943Sdfr    UINT64      SizeOfHeapReserve;
17577943Sdfr    UINT64      SizeOfHeapCommit;
17677943Sdfr    UINT32      LoaderFlags;
17777943Sdfr    UINT32      NumberOfRvaAndSizes;
17877943Sdfr    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
17977943Sdfr} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
18077943Sdfr
18177943Sdfr
18277943Sdfr#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER      56
18377943Sdfr#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER      28
18477943Sdfr#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER      224
18577943Sdfr#define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER    244
18677943Sdfr
18777943Sdfr#define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b
18877943Sdfr#define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
18977943Sdfr#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
19077943Sdfr
19177943Sdfrtypedef struct _IMAGE_NT_HEADERS {
19277943Sdfr    UINT32 Signature;
19377943Sdfr    IMAGE_FILE_HEADER FileHeader;
19477943Sdfr    IMAGE_OPTIONAL_HEADER OptionalHeader;
19577943Sdfr} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
19677943Sdfr
19777943Sdfrtypedef struct _IMAGE_ROM_HEADERS {
19877943Sdfr    IMAGE_FILE_HEADER FileHeader;
19977943Sdfr    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
20077943Sdfr} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
20177943Sdfr
20277943Sdfr#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        \
20377943Sdfr    ((UINT32)ntheader +                                                  \
20477943Sdfr     FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 \
20577943Sdfr     ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   \
20677943Sdfr    ))
20777943Sdfr
20877943Sdfr
20977943Sdfr// Subsystem Values
21077943Sdfr
21177943Sdfr#define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.
21277943Sdfr#define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.
21377943Sdfr#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.
21477943Sdfr#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.
21577943Sdfr#define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.
21677943Sdfr#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image run  in the Posix character subsystem.
21777943Sdfr
21877943Sdfr
21977943Sdfr// Directory Entries
22077943Sdfr
22177943Sdfr#define IMAGE_DIRECTORY_ENTRY_EXPORT         0   // Export Directory
22277943Sdfr#define IMAGE_DIRECTORY_ENTRY_IMPORT         1   // Import Directory
22377943Sdfr#define IMAGE_DIRECTORY_ENTRY_RESOURCE       2   // Resource Directory
22477943Sdfr#define IMAGE_DIRECTORY_ENTRY_EXCEPTION      3   // Exception Directory
22577943Sdfr#define IMAGE_DIRECTORY_ENTRY_SECURITY       4   // Security Directory
22677943Sdfr#define IMAGE_DIRECTORY_ENTRY_BASERELOC      5   // Base Relocation Table
22777943Sdfr#define IMAGE_DIRECTORY_ENTRY_DEBUG          6   // Debug Directory
22877943Sdfr#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT      7   // Description String
22977943Sdfr#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR      8   // Machine Value (MIPS GP)
23077943Sdfr#define IMAGE_DIRECTORY_ENTRY_TLS            9   // TLS Directory
23177943Sdfr#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG   10   // Load Configuration Directory
23277943Sdfr
23377943Sdfr//
23477943Sdfr// Section header format.
23577943Sdfr//
23677943Sdfr
23777943Sdfr#define IMAGE_SIZEOF_SHORT_NAME              8
23877943Sdfr
23977943Sdfrtypedef struct _IMAGE_SECTION_HEADER {
24077943Sdfr    UINT8   Name[IMAGE_SIZEOF_SHORT_NAME];
24177943Sdfr    union {
24277943Sdfr            UINT32   PhysicalAddress;
24377943Sdfr            UINT32   VirtualSize;
24477943Sdfr    } Misc;
24577943Sdfr    UINT32   VirtualAddress;
24677943Sdfr    UINT32   SizeOfRawData;
24777943Sdfr    UINT32   PointerToRawData;
24877943Sdfr    UINT32   PointerToRelocations;
24977943Sdfr    UINT32   PointerToLinenumbers;
25077943Sdfr    UINT16   NumberOfRelocations;
25177943Sdfr    UINT16   NumberOfLinenumbers;
25277943Sdfr    UINT32   Characteristics;
25377943Sdfr} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
25477943Sdfr
25577943Sdfr#define IMAGE_SIZEOF_SECTION_HEADER          40
25677943Sdfr
25777943Sdfr#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
25877943Sdfr
25977943Sdfr#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
26077943Sdfr#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
26177943Sdfr#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
26277943Sdfr
26377943Sdfr#define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
26477943Sdfr#define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
26577943Sdfr#define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
26677943Sdfr#define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
26777943Sdfr
26877943Sdfr#define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
26977943Sdfr#define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
27077943Sdfr#define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
27177943Sdfr#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
27277943Sdfr#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
27377943Sdfr#define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
27477943Sdfr#define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
27577943Sdfr
27677943Sdfr#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
27777943Sdfr#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
27877943Sdfr#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
27977943Sdfr#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
28077943Sdfr#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
28177943Sdfr#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
28277943Sdfr#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.
28377943Sdfr
28477943Sdfr//
28577943Sdfr// Symbol format.
28677943Sdfr//
28777943Sdfr
28877943Sdfr
28977943Sdfr#define IMAGE_SIZEOF_SYMBOL                  18
29077943Sdfr
29177943Sdfr//
29277943Sdfr// Section values.
29377943Sdfr//
29477943Sdfr// Symbols have a section number of the section in which they are
29577943Sdfr// defined. Otherwise, section numbers have the following meanings:
29677943Sdfr//
29777943Sdfr
29877943Sdfr#define IMAGE_SYM_UNDEFINED           (UINT16)0           // Symbol is undefined or is common.
29977943Sdfr#define IMAGE_SYM_ABSOLUTE            (UINT16)-1          // Symbol is an absolute value.
30077943Sdfr#define IMAGE_SYM_DEBUG               (UINT16)-2          // Symbol is a special debug item.
30177943Sdfr
30277943Sdfr//
30377943Sdfr// Type (fundamental) values.
30477943Sdfr//
30577943Sdfr
30677943Sdfr#define IMAGE_SYM_TYPE_NULL                  0           // no type.
30777943Sdfr#define IMAGE_SYM_TYPE_VOID                  1           //
30877943Sdfr#define IMAGE_SYM_TYPE_CHAR                  2           // type character.
30977943Sdfr#define IMAGE_SYM_TYPE_SHORT                 3           // type short integer.
31077943Sdfr#define IMAGE_SYM_TYPE_INT                   4           //
31177943Sdfr#define IMAGE_SYM_TYPE_LONG                  5           //
31277943Sdfr#define IMAGE_SYM_TYPE_FLOAT                 6           //
31377943Sdfr#define IMAGE_SYM_TYPE_DOUBLE                7           //
31477943Sdfr#define IMAGE_SYM_TYPE_STRUCT                8           //
31577943Sdfr#define IMAGE_SYM_TYPE_UNION                 9           //
31677943Sdfr#define IMAGE_SYM_TYPE_ENUM                  10          // enumeration.
31777943Sdfr#define IMAGE_SYM_TYPE_MOE                   11          // member of enumeration.
31877943Sdfr#define IMAGE_SYM_TYPE_BYTE                  12          //
31977943Sdfr#define IMAGE_SYM_TYPE_WORD                  13          //
32077943Sdfr#define IMAGE_SYM_TYPE_UINT                  14          //
32177943Sdfr#define IMAGE_SYM_TYPE_DWORD                 15          //
32277943Sdfr
32377943Sdfr//
32477943Sdfr// Type (derived) values.
32577943Sdfr//
32677943Sdfr
32777943Sdfr#define IMAGE_SYM_DTYPE_NULL                 0           // no derived type.
32877943Sdfr#define IMAGE_SYM_DTYPE_POINTER              1           // pointer.
32977943Sdfr#define IMAGE_SYM_DTYPE_FUNCTION             2           // function.
33077943Sdfr#define IMAGE_SYM_DTYPE_ARRAY                3           // array.
33177943Sdfr
33277943Sdfr//
33377943Sdfr// Storage classes.
33477943Sdfr//
33577943Sdfr
33677943Sdfr#define IMAGE_SYM_CLASS_END_OF_FUNCTION      (BYTE )-1
33777943Sdfr#define IMAGE_SYM_CLASS_NULL                 0
33877943Sdfr#define IMAGE_SYM_CLASS_AUTOMATIC            1
33977943Sdfr#define IMAGE_SYM_CLASS_EXTERNAL             2
34077943Sdfr#define IMAGE_SYM_CLASS_STATIC               3
34177943Sdfr#define IMAGE_SYM_CLASS_REGISTER             4
34277943Sdfr#define IMAGE_SYM_CLASS_EXTERNAL_DEF         5
34377943Sdfr#define IMAGE_SYM_CLASS_LABEL                6
34477943Sdfr#define IMAGE_SYM_CLASS_UNDEFINED_LABEL      7
34577943Sdfr#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT     8
34677943Sdfr#define IMAGE_SYM_CLASS_ARGUMENT             9
34777943Sdfr#define IMAGE_SYM_CLASS_STRUCT_TAG           10
34877943Sdfr#define IMAGE_SYM_CLASS_MEMBER_OF_UNION      11
34977943Sdfr#define IMAGE_SYM_CLASS_UNION_TAG            12
35077943Sdfr#define IMAGE_SYM_CLASS_TYPE_DEFINITION      13
35177943Sdfr#define IMAGE_SYM_CLASS_UNDEFINED_STATIC     14
35277943Sdfr#define IMAGE_SYM_CLASS_ENUM_TAG             15
35377943Sdfr#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM       16
35477943Sdfr#define IMAGE_SYM_CLASS_REGISTER_PARAM       17
35577943Sdfr#define IMAGE_SYM_CLASS_BIT_FIELD            18
35677943Sdfr#define IMAGE_SYM_CLASS_BLOCK                100
35777943Sdfr#define IMAGE_SYM_CLASS_FUNCTION             101
35877943Sdfr#define IMAGE_SYM_CLASS_END_OF_STRUCT        102
35977943Sdfr#define IMAGE_SYM_CLASS_FILE                 103
36077943Sdfr// new
36177943Sdfr#define IMAGE_SYM_CLASS_SECTION              104
36277943Sdfr#define IMAGE_SYM_CLASS_WEAK_EXTERNAL        105
36377943Sdfr
36477943Sdfr// type packing constants
36577943Sdfr
36677943Sdfr#define N_BTMASK                            017
36777943Sdfr#define N_TMASK                             060
36877943Sdfr#define N_TMASK1                            0300
36977943Sdfr#define N_TMASK2                            0360
37077943Sdfr#define N_BTSHFT                            4
37177943Sdfr#define N_TSHIFT                            2
37277943Sdfr
37377943Sdfr// MACROS
37477943Sdfr
37577943Sdfr//
37677943Sdfr// Communal selection types.
37777943Sdfr//
37877943Sdfr
37977943Sdfr#define IMAGE_COMDAT_SELECT_NODUPLICATES   1
38077943Sdfr#define IMAGE_COMDAT_SELECT_ANY            2
38177943Sdfr#define IMAGE_COMDAT_SELECT_SAME_SIZE      3
38277943Sdfr#define IMAGE_COMDAT_SELECT_EXACT_MATCH    4
38377943Sdfr#define IMAGE_COMDAT_SELECT_ASSOCIATIVE    5
38477943Sdfr
38577943Sdfr#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
38677943Sdfr#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY   2
38777943Sdfr#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS     3
38877943Sdfr
38977943Sdfr
39077943Sdfr//
39177943Sdfr// Relocation format.
39277943Sdfr//
39377943Sdfr
39477943Sdfrtypedef struct _IMAGE_RELOCATION {
39577943Sdfr    UINT32   VirtualAddress;
39677943Sdfr    UINT32   SymbolTableIndex;
39777943Sdfr    UINT16   Type;
39877943Sdfr} IMAGE_RELOCATION;
39977943Sdfr
40077943Sdfr#define IMAGE_SIZEOF_RELOCATION              10
40177943Sdfr
40277943Sdfr//
40377943Sdfr// I386 relocation types.
40477943Sdfr//
40577943Sdfr
40677943Sdfr#define IMAGE_REL_I386_ABSOLUTE              0           // Reference is absolute, no relocation is necessary
40777943Sdfr#define IMAGE_REL_I386_DIR16                 01          // Direct 16-bit reference to the symbols virtual address
40877943Sdfr#define IMAGE_REL_I386_REL16                 02          // PC-relative 16-bit reference to the symbols virtual address
40977943Sdfr#define IMAGE_REL_I386_DIR32                 06          // Direct 32-bit reference to the symbols virtual address
41077943Sdfr#define IMAGE_REL_I386_DIR32NB               07          // Direct 32-bit reference to the symbols virtual address, base not included
41177943Sdfr#define IMAGE_REL_I386_SEG12                 011         // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
41277943Sdfr#define IMAGE_REL_I386_SECTION               012
41377943Sdfr#define IMAGE_REL_I386_SECREL                013
41477943Sdfr#define IMAGE_REL_I386_REL32                 024         // PC-relative 32-bit reference to the symbols virtual address
41577943Sdfr
41677943Sdfr//
41777943Sdfr// MIPS relocation types.
41877943Sdfr//
41977943Sdfr
42077943Sdfr#define IMAGE_REL_MIPS_ABSOLUTE              0           // Reference is absolute, no relocation is necessary
42177943Sdfr#define IMAGE_REL_MIPS_REFHALF               01
42277943Sdfr#define IMAGE_REL_MIPS_REFWORD               02
42377943Sdfr#define IMAGE_REL_MIPS_JMPADDR               03
42477943Sdfr#define IMAGE_REL_MIPS_REFHI                 04
42577943Sdfr#define IMAGE_REL_MIPS_REFLO                 05
42677943Sdfr#define IMAGE_REL_MIPS_GPREL                 06
42777943Sdfr#define IMAGE_REL_MIPS_LITERAL               07
42877943Sdfr#define IMAGE_REL_MIPS_SECTION               012
42977943Sdfr#define IMAGE_REL_MIPS_SECREL                013
43077943Sdfr#define IMAGE_REL_MIPS_REFWORDNB             042
43177943Sdfr#define IMAGE_REL_MIPS_PAIR                  045
43277943Sdfr
43377943Sdfr//
43477943Sdfr// Alpha Relocation types.
43577943Sdfr//
43677943Sdfr
43777943Sdfr#define IMAGE_REL_ALPHA_ABSOLUTE             0x0
43877943Sdfr#define IMAGE_REL_ALPHA_REFLONG              0x1
43977943Sdfr#define IMAGE_REL_ALPHA_REFQUAD              0x2
44077943Sdfr#define IMAGE_REL_ALPHA_GPREL32              0x3
44177943Sdfr#define IMAGE_REL_ALPHA_LITERAL              0x4
44277943Sdfr#define IMAGE_REL_ALPHA_LITUSE               0x5
44377943Sdfr#define IMAGE_REL_ALPHA_GPDISP               0x6
44477943Sdfr#define IMAGE_REL_ALPHA_BRADDR               0x7
44577943Sdfr#define IMAGE_REL_ALPHA_HINT                 0x8
44677943Sdfr#define IMAGE_REL_ALPHA_INLINE_REFLONG       0x9
44777943Sdfr#define IMAGE_REL_ALPHA_REFHI                0xA
44877943Sdfr#define IMAGE_REL_ALPHA_REFLO                0xB
44977943Sdfr#define IMAGE_REL_ALPHA_PAIR                 0xC
45077943Sdfr#define IMAGE_REL_ALPHA_MATCH                0xD
45177943Sdfr#define IMAGE_REL_ALPHA_SECTION              0xE
45277943Sdfr#define IMAGE_REL_ALPHA_SECREL               0xF
45377943Sdfr#define IMAGE_REL_ALPHA_REFLONGNB            0x10
45477943Sdfr
45577943Sdfr//
45677943Sdfr// IBM PowerPC relocation types.
45777943Sdfr//
45877943Sdfr
45977943Sdfr#define IMAGE_REL_PPC_ABSOLUTE 0x0000  // NOP
46077943Sdfr#define IMAGE_REL_PPC_ADDR64   0x0001  // 64-bit address
46177943Sdfr#define IMAGE_REL_PPC_ADDR32   0x0002  // 32-bit address
46277943Sdfr#define IMAGE_REL_PPC_ADDR24   0x0003  // 26-bit address, shifted left 2 (branch absolute)
46377943Sdfr#define IMAGE_REL_PPC_ADDR16   0x0004  // 16-bit address
46477943Sdfr#define IMAGE_REL_PPC_ADDR14   0x0005  // 16-bit address, shifted left 2 (load doubleword)
46577943Sdfr#define IMAGE_REL_PPC_REL24    0x0006  // 26-bit PC-relative offset, shifted left 2 (branch relative)
46677943Sdfr#define IMAGE_REL_PPC_REL14    0x0007  // 16-bit PC-relative offset, shifted left 2 (br cond relative)
46777943Sdfr#define IMAGE_REL_PPC_TOCREL16 0x0008  // 16-bit offset from TOC base
46877943Sdfr#define IMAGE_REL_PPC_TOCREL14 0x0009  // 16-bit offset from TOC base, shifted left 2 (load doubleword)
46977943Sdfr
47077943Sdfr#define IMAGE_REL_PPC_ADDR32NB 0x000A  // 32-bit addr w/o image base
47177943Sdfr#define IMAGE_REL_PPC_SECREL   0x000B  // va of containing section (as in an image sectionhdr)
47277943Sdfr#define IMAGE_REL_PPC_SECTION  0x000C  // sectionheader number
47377943Sdfr#define IMAGE_REL_PPC_IFGLUE   0x000D  // substitute TOC restore instruction iff symbol is glue code
47477943Sdfr#define IMAGE_REL_PPC_IMGLUE   0x000E  // symbol is glue code; virtual address is TOC restore instruction
47577943Sdfr
47677943Sdfr#define IMAGE_REL_PPC_TYPEMASK 0x00FF  // mask to isolate above values in IMAGE_RELOCATION.Type
47777943Sdfr
47877943Sdfr// Flag bits in IMAGE_RELOCATION.TYPE
47977943Sdfr
48077943Sdfr#define IMAGE_REL_PPC_NEG      0x0100  // subtract reloc value rather than adding it
48177943Sdfr#define IMAGE_REL_PPC_BRTAKEN  0x0200  // fix branch prediction bit to predict branch taken
48277943Sdfr#define IMAGE_REL_PPC_BRNTAKEN 0x0400  // fix branch prediction bit to predict branch not taken
48377943Sdfr#define IMAGE_REL_PPC_TOCDEFN  0x0800  // toc slot defined in file (or, data in toc)
48477943Sdfr
48577943Sdfr//
48677943Sdfr// Based relocation format.
48777943Sdfr//
48877943Sdfr
48977943Sdfrtypedef struct _IMAGE_BASE_RELOCATION {
49077943Sdfr    UINT32   VirtualAddress;
49177943Sdfr    UINT32   SizeOfBlock;
49277943Sdfr//  UINT16    TypeOffset[1];
49377943Sdfr} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
49477943Sdfr
49577943Sdfr#define IMAGE_SIZEOF_BASE_RELOCATION         8
49677943Sdfr
49777943Sdfr//
49877943Sdfr// Based relocation types.
49977943Sdfr//
50077943Sdfr
50177943Sdfr#define IMAGE_REL_BASED_ABSOLUTE              0
50277943Sdfr#define IMAGE_REL_BASED_HIGH                  1
50377943Sdfr#define IMAGE_REL_BASED_LOW                   2
50477943Sdfr#define IMAGE_REL_BASED_HIGHLOW               3
50577943Sdfr#define IMAGE_REL_BASED_HIGHADJ               4
50677943Sdfr#define IMAGE_REL_BASED_MIPS_JMPADDR          5
50777943Sdfr#define IMAGE_REL_BASED_IA64_IMM64            9
50877943Sdfr#define IMAGE_REL_BASED_DIR64                 10
50977943Sdfr
51077943Sdfr//
51177943Sdfr// Line number format.
51277943Sdfr//
51377943Sdfr
51477943Sdfrtypedef struct _IMAGE_LINENUMBER {
51577943Sdfr    union {
51677943Sdfr        UINT32   SymbolTableIndex;               // Symbol table index of function name if Linenumber is 0.
51777943Sdfr        UINT32   VirtualAddress;                 // Virtual address of line number.
51877943Sdfr    } Type;
51977943Sdfr    UINT16    Linenumber;                         // Line number.
52077943Sdfr} IMAGE_LINENUMBER;
52177943Sdfr
52277943Sdfr#define IMAGE_SIZEOF_LINENUMBER              6
52377943Sdfr
52477943Sdfr//
52577943Sdfr// Archive format.
52677943Sdfr//
52777943Sdfr
52877943Sdfr#define IMAGE_ARCHIVE_START_SIZE             8
52977943Sdfr#define IMAGE_ARCHIVE_START                  "!<arch>\n"
53077943Sdfr#define IMAGE_ARCHIVE_END                    "`\n"
53177943Sdfr#define IMAGE_ARCHIVE_PAD                    "\n"
53277943Sdfr#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
53377943Sdfr#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
53477943Sdfr
53577943Sdfrtypedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
53677943Sdfr    UINT8     Name[16];                          // File member name - `/' terminated.
53777943Sdfr    UINT8     Date[12];                          // File member date - decimal.
53877943Sdfr    UINT8     UserID[6];                         // File member user id - decimal.
53977943Sdfr    UINT8     GroupID[6];                        // File member group id - decimal.
54077943Sdfr    UINT8     Mode[8];                           // File member mode - octal.
54177943Sdfr    UINT8     Size[10];                          // File member size - decimal.
54277943Sdfr    UINT8     EndHeader[2];                      // String to end header.
54377943Sdfr} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
54477943Sdfr
54577943Sdfr#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60
54677943Sdfr
54777943Sdfr//
54877943Sdfr// DLL support.
54977943Sdfr//
55077943Sdfr
55177943Sdfr//
55277943Sdfr// Export Format
55377943Sdfr//
55477943Sdfr
55577943Sdfrtypedef struct _IMAGE_EXPORT_DIRECTORY {
55677943Sdfr    UINT32   Characteristics;
55777943Sdfr    UINT32   TimeDateStamp;
55877943Sdfr    UINT16   MajorVersion;
55977943Sdfr    UINT16   MinorVersion;
56077943Sdfr    UINT32   Name;
56177943Sdfr    UINT32   Base;
56277943Sdfr    UINT32   NumberOfFunctions;
56377943Sdfr    UINT32   NumberOfNames;
56477943Sdfr    UINT32   AddressOfFunctions;
56577943Sdfr    UINT32   AddressOfNames;
56677943Sdfr    UINT32   AddressOfNameOrdinals;
56777943Sdfr} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
56877943Sdfr
56977943Sdfr//
57077943Sdfr// Import Format
57177943Sdfr//
57277943Sdfr
57377943Sdfrtypedef struct _IMAGE_IMPORT_BY_NAME {
57477943Sdfr    UINT16    Hint;
57577943Sdfr    UINT8     Name[1];
57677943Sdfr} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
57777943Sdfr
57877943Sdfrtypedef struct _IMAGE_THUNK_DATA {
57977943Sdfr    union {
58077943Sdfr        UINT32 Function;
58177943Sdfr        UINT32 Ordinal;
58277943Sdfr        PIMAGE_IMPORT_BY_NAME AddressOfData;
58377943Sdfr    } u1;
58477943Sdfr} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;
58577943Sdfr
58677943Sdfr#define IMAGE_ORDINAL_FLAG 0x80000000
58777943Sdfr#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
58877943Sdfr#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
58977943Sdfr
59077943Sdfrtypedef struct _IMAGE_IMPORT_DESCRIPTOR {
59177943Sdfr    UINT32   Characteristics;
59277943Sdfr    UINT32   TimeDateStamp;
59377943Sdfr    UINT32   ForwarderChain;
59477943Sdfr    UINT32   Name;
59577943Sdfr    PIMAGE_THUNK_DATA FirstThunk;
59677943Sdfr} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
59777943Sdfr
598163898Smarcel#define IMAGE_DEBUG_TYPE_CODEVIEW   2
599163898Smarcel
600163898Smarceltypedef struct {
601163898Smarcel  UINT32    Characteristics;
602163898Smarcel  UINT32    TimeDateStamp;
603163898Smarcel  UINT16    MajorVersion;
604163898Smarcel  UINT16    MinorVersion;
605163898Smarcel  UINT32    Type;
606163898Smarcel  UINT32    SizeOfData;
607163898Smarcel  UINT32    RVA;
608163898Smarcel  UINT32    FileOffset;
609163898Smarcel} IMAGE_DEBUG_DIRECTORY_ENTRY;
610163898Smarcel
611163898Smarcel#define CODEVIEW_SIGNATURE_NB10  0x3031424E // "NB10"
612163898Smarcel
613163898Smarceltypedef struct {
614163898Smarcel  UINT32    Signature; // "NB10"
615163898Smarcel  UINT32    Unknown;
616163898Smarcel  UINT32    Unknown2;
617163898Smarcel  UINT32    Unknown3;
618163898Smarcel  //
619163898Smarcel  // Filename of .PDB goes here
620163898Smarcel  //
621163898Smarcel} EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;
622163898Smarcel
623163898Smarcel#define CODEVIEW_SIGNATURE_RSDS  0x53445352 // "RSDS"
624163898Smarcel
625163898Smarceltypedef struct {
626163898Smarcel  UINT32    Signature; // "RSDS"
627163898Smarcel  UINT32    Unknown;
628163898Smarcel  UINT32    Unknown2;
629163898Smarcel  UINT32    Unknown3;
630163898Smarcel  UINT32    Unknown4;
631163898Smarcel  UINT32    Unknown5;
632163898Smarcel  //
633163898Smarcel  // Filename of .PDB goes here
634163898Smarcel  //
635163898Smarcel} EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;
636163898Smarcel
63777943Sdfr#endif
638