1a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/** @file
21f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  EFI image format for PE32, PE32+ and TE. Please note some data structures are
3a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  different for PE32 and PE32+. EFI_IMAGE_NT_HEADERS32 is for PE32 and
4a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS64 is for PE32+.
5a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  This file is coded to the Visual Studio, Microsoft Portable Executable and
7fed549d7be5621eac25f024b54c66ca83ca0bccaHarry Liebel  Common Object File Format Specification, Revision 8.3 - February 6, 2013.
81f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  This file also includes some definitions in PI Specification, Revision 1.0.
9a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
109df063a06aef048c042498e2f542fb693e93493ahhtianCopyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
119df063a06aef048c042498e2f542fb693e93493ahhtianPortions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
129df063a06aef048c042498e2f542fb693e93493ahhtianThis program and the accompanying materials
13af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterare licensed and made available under the terms and conditions of the BSD License
14af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterwhich accompanies this distribution.  The full text of the license may be found at
15af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterhttp://opensource.org/licenses/bsd-license.php.
16a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
17af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
18af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
20a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang**/
21a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#ifndef __PE_IMAGE_H__
231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define __PE_IMAGE_H__
24a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
25427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
26427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// PE32+ Subsystem type for EFI images
27427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
28a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION         10
29a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
30a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER      12
311f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER      13 ///< defined PI Specification, 1.0
32a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
33a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
34427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
35427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// PE32+ Machine type for EFI images
36427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
37a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney#define IMAGE_FILE_MACHINE_I386            0x014c
38a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney#define IMAGE_FILE_MACHINE_IA64            0x0200
39a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney#define IMAGE_FILE_MACHINE_EBC             0x0EBC
40a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney#define IMAGE_FILE_MACHINE_X64             0x8664
41a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney#define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED  0x01c2
42fed549d7be5621eac25f024b54c66ca83ca0bccaHarry Liebel#define IMAGE_FILE_MACHINE_ARM64           0xAA64
43a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
44427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
45427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// EXE file formats
46427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
4713c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_IMAGE_DOS_SIGNATURE     SIGNATURE_16('M', 'Z')
4813c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_IMAGE_OS2_SIGNATURE     SIGNATURE_16('N', 'E')
4913c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_IMAGE_OS2_SIGNATURE_LE  SIGNATURE_16('L', 'E')
509d96b05505cfd5ce5ce09ce813ab84ca3319c3adqhuang#define EFI_IMAGE_NT_SIGNATURE      SIGNATURE_32('P', 'E', '\0', '\0')
51a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
52a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
53a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// PE images can start with an optional DOS header, so if an image is run
541f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// under DOS it can print an error message.
55a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
56a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
57af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_magic;    ///< Magic number.
58af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cblp;     ///< Bytes on last page of file.
59af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cp;       ///< Pages in file.
60af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_crlc;     ///< Relocations.
61af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cparhdr;  ///< Size of header in paragraphs.
62af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_minalloc; ///< Minimum extra paragraphs needed.
63af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_maxalloc; ///< Maximum extra paragraphs needed.
64af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_ss;       ///< Initial (relative) SS value.
65af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_sp;       ///< Initial SP value.
66af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_csum;     ///< Checksum.
67af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_ip;       ///< Initial IP value.
68af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cs;       ///< Initial (relative) CS value.
69af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_lfarlc;   ///< File address of relocation table.
70af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_ovno;     ///< Overlay number.
71af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_res[4];   ///< Reserved words.
72af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_oemid;    ///< OEM identifier (for e_oeminfo).
73af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_oeminfo;  ///< OEM information; e_oemid specific.
74af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_res2[10]; ///< Reserved words.
75af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  e_lfanew;   ///< File address of new exe header.
76a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DOS_HEADER;
77a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
78a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
79af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// COFF File Header (Object and Image).
80a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
81a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
82a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Machine;
83a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfSections;
84a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
85a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToSymbolTable;
86a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfSymbols;
87a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  SizeOfOptionalHeader;
88a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Characteristics;
89a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_FILE_HEADER;
90a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
911f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
92af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_FILE_HEADER.
931f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
94a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_FILE_HEADER        20
95a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
96427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
97427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Characteristics
98427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
991f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_RELOCS_STRIPPED      BIT0     ///< 0x0001  Relocation info stripped from file.
1001f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_EXECUTABLE_IMAGE     BIT1     ///< 0x0002  File is executable  (i.e. no unresolved externel references).
1011f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED   BIT2     ///< 0x0004  Line nunbers stripped from file.
1021f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED  BIT3     ///< 0x0008  Local symbols stripped from file.
1031f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_BYTES_REVERSED_LO    BIT7     ///< 0x0080  Bytes of machine word are reversed.
1041f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_32BIT_MACHINE        BIT8     ///< 0x0100  32 bit word machine.
105af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_FILE_DEBUG_STRIPPED       BIT9     ///< 0x0200  Debugging info stripped from file in .DBG file.
1061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_SYSTEM               BIT12    ///< 0x1000  System File.
1071f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_DLL                  BIT13    ///< 0x2000  File is a DLL.
1081f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_BYTES_REVERSED_HI    BIT15    ///< 0x8000  Bytes of machine word are reversed.
1091f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
110a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
111af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Header Data Directories.
112a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
113a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
114a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
115a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Size;
116a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DATA_DIRECTORY;
117a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
118427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
119427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Directory Entries
120427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
1211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT      0
1221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT      1
1231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE    2
1241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION   3
1251f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY    4
1261f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC   5
1271f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG       6
1281f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT   7
1291f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR   8
1301f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_TLS         9
1311f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
1321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
1331f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16
134a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
135a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
136a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
137a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and
138a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary
139a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// after NT additional fields.
140a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
141a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
142427987f5bc27aef1beffa61b341e41d4740aea54vanjeff
143427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
144af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Optional Header Standard Fields for PE32.
145427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
146a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
1471bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
1481bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  /// Standard fields.
1491bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
150a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Magic;
151a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MajorLinkerVersion;
152a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MinorLinkerVersion;
153a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfCode;
154a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfInitializedData;
155a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfUninitializedData;
156a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    AddressOfEntryPoint;
157a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    BaseOfCode;
158af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32                    BaseOfData;  ///< PE32 contains this additional field, which is absent in PE32+.
1591bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
160427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  /// Optional Header Windows-Specific Fields.
1611bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
162a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    ImageBase;
163a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SectionAlignment;
164a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    FileAlignment;
165a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorOperatingSystemVersion;
166a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorOperatingSystemVersion;
167a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorImageVersion;
168a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorImageVersion;
169a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorSubsystemVersion;
170a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorSubsystemVersion;
171a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    Win32VersionValue;
172a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfImage;
173a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeaders;
174a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    CheckSum;
175a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Subsystem;
176a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    DllCharacteristics;
177a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfStackReserve;
178a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfStackCommit;
179a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeapReserve;
180a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeapCommit;
181a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    LoaderFlags;
182a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    NumberOfRvaAndSizes;
183a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
184a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER32;
185a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
186a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
187a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
188a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and
189a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary
190a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// after NT additional fields.
191a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
192a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
193a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
194427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
195af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Optional Header Standard Fields for PE32+.
196427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
197a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
198427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
199427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  /// Standard fields.
200427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
201a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Magic;
202a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MajorLinkerVersion;
203a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MinorLinkerVersion;
204a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfCode;
205a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfInitializedData;
206a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfUninitializedData;
207a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    AddressOfEntryPoint;
208a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    BaseOfCode;
209427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
210427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  /// Optional Header Windows-Specific Fields.
211427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
212a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    ImageBase;
213a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SectionAlignment;
214a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    FileAlignment;
215a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorOperatingSystemVersion;
216a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorOperatingSystemVersion;
217a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorImageVersion;
218a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorImageVersion;
219a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorSubsystemVersion;
220a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorSubsystemVersion;
221a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    Win32VersionValue;
222a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfImage;
223a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeaders;
224a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    CheckSum;
225a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Subsystem;
226a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    DllCharacteristics;
227a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfStackReserve;
228a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfStackCommit;
229a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfHeapReserve;
230a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfHeapCommit;
231a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    LoaderFlags;
232a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    NumberOfRvaAndSizes;
233a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
234a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER64;
235a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
236a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
237a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
238a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
239cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// EFI_IMAGE_NT_HEADERS32 is for use ONLY by tools.
240a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
241a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
242a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                      Signature;
243a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_FILE_HEADER       FileHeader;
244a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER32 OptionalHeader;
245a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_NT_HEADERS32;
246a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
247a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER sizeof (EFI_IMAGE_NT_HEADERS32)
248a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
249cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff///
250cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// @attention
251cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// EFI_IMAGE_HEADERS64 is for use ONLY by tools.
252cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff///
253a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
254a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                      Signature;
255a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_FILE_HEADER       FileHeader;
256a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER64 OptionalHeader;
257a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_NT_HEADERS64;
258a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
259a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)
260a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
261427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
262427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Other Windows Subsystem Values
263427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
264a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_UNKNOWN     0
265a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_NATIVE      1
266a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI 2
2671f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI 3
268a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_OS2_CUI     5
269a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_POSIX_CUI   7
270a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
2711f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
272cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// Length of ShortName.
2731f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
274a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_SHORT_NAME 8
275a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
276427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
277af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Section Table. This table immediately follows the optional header.
278427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
279a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
280a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8 Name[EFI_IMAGE_SIZEOF_SHORT_NAME];
281a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
282a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  PhysicalAddress;
283a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  VirtualSize;
284a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } Misc;
285a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
286a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfRawData;
287a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToRawData;
288a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToRelocations;
289a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToLinenumbers;
290a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfRelocations;
291a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfLinenumbers;
292a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
293a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_SECTION_HEADER;
294a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
2951f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
296af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_SECTION_HEADER.
2971f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
298a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_SECTION_HEADER       40
2991f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
300427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
301427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Section Flags Values
302427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3031f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_TYPE_NO_PAD                  BIT3   ///< 0x00000008  ///< Reserved.
3041f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_CODE                     BIT5   ///< 0x00000020
3051f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA         BIT6   ///< 0x00000040
3061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA       BIT7   ///< 0x00000080
3071f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3081f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_OTHER                    BIT8   ///< 0x00000100  ///< Reserved.
3091f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_INFO                     BIT9   ///< 0x00000200  ///< Section contains comments or some other type of information.
31014996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_SCN_LNK_REMOVE                   BIT11  ///< 0x00000800  ///< Section contents will not become part of image.
3111f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_COMDAT                   BIT12  ///< 0x00001000
3121f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3131f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_1BYTES                 BIT20  ///< 0x00100000
3141f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_2BYTES                 BIT21  ///< 0x00200000
3151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_4BYTES          (BIT20|BIT21) ///< 0x00300000
3161f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_8BYTES                 BIT22  ///< 0x00400000
3171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_16BYTES         (BIT20|BIT22) ///< 0x00500000
3181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_32BYTES         (BIT21|BIT22) ///< 0x00600000
3191f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_64BYTES   (BIT20|BIT21|BIT22) ///< 0x00700000
3201f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_DISCARDABLE              BIT25  ///< 0x02000000
3221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_NOT_CACHED               BIT26  ///< 0x04000000
3231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_NOT_PAGED                BIT27  ///< 0x08000000
3241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_SHARED                   BIT28  ///< 0x10000000
3251f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_EXECUTE                  BIT29  ///< 0x20000000
3261f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_READ                     BIT30  ///< 0x40000000
3271f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_WRITE                    BIT31  ///< 0x80000000
3281f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3291f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
330af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of a Symbol Table Record.
3311f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
3321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SIZEOF_SYMBOL 18
333a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
334427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
335427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Symbols have a section number of the section in which they are
336427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// defined. Otherwise, section numbers have the following meanings:
337427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3381f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_UNDEFINED (UINT16) 0  ///< Symbol is undefined or is common.
3391f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_ABSOLUTE  (UINT16) -1 ///< Symbol is an absolute value.
3401f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_DEBUG     (UINT16) -2 ///< Symbol is a special debug item.
341a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
342427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
343427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Symbol Type (fundamental) values.
344427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3451f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_NULL   0   ///< no type.
3461f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_VOID   1   ///< no valid type.
3471f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_CHAR   2   ///< type character.
3481f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_SHORT  3   ///< type short integer.
349a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_INT    4
350a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_LONG   5
351a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_FLOAT  6
352a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_DOUBLE 7
353a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_STRUCT 8
354a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_UNION  9
3551f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_ENUM   10  ///< enumeration.
3561f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_MOE    11  ///< member of enumeration.
357a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_BYTE   12
358a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_WORD   13
359a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_UINT   14
360a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_DWORD  15
361a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
362427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
363427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Symbol Type (derived) values.
364427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3651f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_DTYPE_NULL      0 ///< no derived type.
366a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_POINTER   1
367a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_FUNCTION  2
368a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_ARRAY     3
369a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
370427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
371427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Storage classes.
372427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3731f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION   ((UINT8) -1)
374a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_NULL              0
375a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_AUTOMATIC         1
376a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_EXTERNAL          2
377a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_STATIC            3
378a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_REGISTER          4
379a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF      5
380a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_LABEL             6
381a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL   7
382a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT  8
383a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_ARGUMENT          9
384a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_STRUCT_TAG        10
385a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION   11
386a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNION_TAG         12
387a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION   13
388a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC  14
389a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_ENUM_TAG          15
390a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM    16
391a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM    17
392a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_BIT_FIELD         18
393a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_BLOCK             100
394a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_FUNCTION          101
395a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT     102
396a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_FILE              103
397a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_SECTION           104
398a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL     105
399a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
400a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
401a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// type packing constants
402a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
403a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_BTMASK  017
404a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK   060
405a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK1  0300
406a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK2  0360
407a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_BTSHFT  4
408a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TSHIFT  2
409a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
410427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
411427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Communal selection types.
412427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
413a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES    1
414a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_ANY             2
415a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE       3
416a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH     4
417a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE     5
4181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
419427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
420427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// the following values only be referred in PeCoff, not defined in PECOFF.
421427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
422a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
423a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
424a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
425a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
426a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
427a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Relocation format.
428a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
429a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
430a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
431a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SymbolTableIndex;
432a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Type;
433a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_RELOCATION;
434a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4361f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_RELOCATION
4371f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
438a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_RELOCATION 10
439a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
440427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
441427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// I386 relocation types.
442427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
443af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_ABSOLUTE 0x0000  ///< Reference is absolute, no relocation is necessary.
444af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_DIR16    0x0001  ///< Direct 16-bit reference to the symbols virtual address.
445af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_REL16    0x0002  ///< PC-relative 16-bit reference to the symbols virtual address.
446af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_DIR32    0x0006  ///< Direct 32-bit reference to the symbols virtual address.
447af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_DIR32NB  0x0007  ///< Direct 32-bit reference to the symbols virtual address, base not included.
448af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_SEG12    0x0009  ///< Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address.
4491f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_SECTION  0x000A
4501f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_SECREL   0x000B
451af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_REL32    0x0014  ///< PC-relative 32-bit reference to the symbols virtual address.
452a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
453427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
454427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// x64 processor relocation types.
455427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
456ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ABSOLUTE  0x0000
457ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ADDR64    0x0001
458ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ADDR32    0x0002
459ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ADDR32NB  0x0003
460ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32     0x0004
461ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_1   0x0005
462ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_2   0x0006
463ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_3   0x0007
464ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_4   0x0008
465ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_5   0x0009
466ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SECTION   0x000A
467ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SECREL    0x000B
468ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SECREL7   0x000C
469ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_TOKEN     0x000D
470ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SREL32    0x000E
471ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_PAIR      0x000F
472ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SSPAN32   0x0010
473a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
474a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
475a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Based relocation format.
476a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
477a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
478a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
479a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfBlock;
480a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_BASE_RELOCATION;
481a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4821f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
483af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_BASE_RELOCATION.
4841f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
485a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_BASE_RELOCATION  8
486a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
487427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
488427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Based relocation types.
489427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
49014996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_ABSOLUTE        0
49114996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_HIGH            1
49214996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_LOW             2
49314996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_HIGHLOW         3
49414996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_HIGHADJ         4
49514996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR    5
496e0919a58562a55ae6964c51598dc0d76389ee109andrewfish#define EFI_IMAGE_REL_BASED_ARM_MOV32A      5
497e0919a58562a55ae6964c51598dc0d76389ee109andrewfish#define EFI_IMAGE_REL_BASED_ARM_MOV32T      7
49814996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_IA64_IMM64      9
49914996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR16  9
50014996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_DIR64           10
501a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
502a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
503a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Line number format.
504a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
505a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
506a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
5076800ac833dd4f25bf73cc711f89ebc6ec7808599gikidy    UINT32  SymbolTableIndex; ///< Symbol table index of function name if Linenumber is 0.
5086800ac833dd4f25bf73cc711f89ebc6ec7808599gikidy    UINT32  VirtualAddress;   ///< Virtual address of line number.
509a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } Type;
5106800ac833dd4f25bf73cc711f89ebc6ec7808599gikidy  UINT16  Linenumber;         ///< Line number.
511a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_LINENUMBER;
512a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5131f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
514af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_LINENUMBER.
5151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
516a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_LINENUMBER 6
517a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
518427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
519427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Archive format.
520427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
521a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_START_SIZE        8
522a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_START             "!<arch>\n"
523a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_END               "`\n"
524a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_PAD               "\n"
525a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_LINKER_MEMBER     "/               "
526a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER  "//              "
527a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
528427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
529427987f5bc27aef1beffa61b341e41d4740aea54vanjeff/// Archive Member Headers
530427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
531a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
5321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Name[16];     ///< File member name - `/' terminated.
5331f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Date[12];     ///< File member date - decimal.
5341f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 UserID[6];    ///< File member user id - decimal.
5351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 GroupID[6];   ///< File member group id - decimal.
5361f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Mode[8];      ///< File member mode - octal.
5371f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Size[10];     ///< File member size - decimal.
538af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT8 EndHeader[2]; ///< String to end header. (0x60 0x0A).
539a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_ARCHIVE_MEMBER_HEADER;
540a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5411f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
542af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_ARCHIVE_MEMBER_HEADER.
5431f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
544a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
545a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
546a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
547427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
548427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// DLL Support
549427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
5501f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
5511f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
552af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Export Directory Table.
553a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
554a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
555a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
556a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
557a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MajorVersion;
558a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MinorVersion;
559a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Name;
560a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Base;
561a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfFunctions;
562a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfNames;
563a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfFunctions;
564a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfNames;
565a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfNameOrdinals;
566a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_EXPORT_DIRECTORY;
567a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
568a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
569af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Hint/Name Table.
570a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
571a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
572a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Hint;
573a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8   Name[1];
574a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_IMPORT_BY_NAME;
575a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
576427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
577af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Import Address Table RVA (Thunk Table).
578427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
579a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
580a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
581a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32                    Function;
582a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32                    Ordinal;
583a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    EFI_IMAGE_IMPORT_BY_NAME  *AddressOfData;
584a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } u1;
585a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_THUNK_DATA;
586a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
587af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_ORDINAL_FLAG              BIT31    ///< Flag for PE32.
588a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal)  ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0)
589a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ORDINAL(Ordinal)          (Ordinal & 0xffff)
590a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5911f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5921f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Import Directory Table
5931f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
594a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
595a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                Characteristics;
596a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                TimeDateStamp;
597a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                ForwarderChain;
598a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                Name;
599a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_THUNK_DATA  *FirstThunk;
600a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_IMPORT_DESCRIPTOR;
601a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6021f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
603a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
604af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Directory Format.
605a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
606a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
607a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
608a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
609a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MajorVersion;
610a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MinorVersion;
611a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Type;
612a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfData;
613af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  RVA;           ///< The address of the debug data when loaded, relative to the image base.
614af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  FileOffset;    ///< The file pointer to the debug data.
615a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;
616a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
617af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2     ///< The Visual C++ debug information.
6181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
6191f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
620af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Data Structure defined in Microsoft C++.
6211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
62213c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define CODEVIEW_SIGNATURE_NB10  SIGNATURE_32('N', 'B', '1', '0')
623a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
6241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32  Signature;                        ///< "NB10"
625a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown;
626a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown2;
627a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown3;
628a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
629a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // Filename of .PDB goes here
630a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
631a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;
632a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6331f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
634af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Data Structure defined in Microsoft C++.
6351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
63613c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define CODEVIEW_SIGNATURE_RSDS  SIGNATURE_32('R', 'S', 'D', 'S')
637a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
638af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  Signature;                        ///< "RSDS".
639a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown;
640a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown2;
641a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown3;
642a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown4;
643a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown5;
644a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
645a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // Filename of .PDB goes here
646a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
647a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;
648a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
649a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney
650a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney///
651af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Data Structure defined by Apple Mach-O to Coff utility.
652a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney///
653a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney#define CODEVIEW_SIGNATURE_MTOC  SIGNATURE_32('M', 'T', 'O', 'C')
654a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinneytypedef struct {
655af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32    Signature;                       ///< "MTOC".
656a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  GUID      MachOUuid;
657a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  //
658a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  //  Filename of .DLL (Mach-O with debug info) goes here
659a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  //
660a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney} EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY;
661a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney
662a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
663aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource format.
664aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
665aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
666aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  Characteristics;
667aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  TimeDateStamp;
668aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  MajorVersion;
669aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  MinorVersion;
670aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  NumberOfNamedEntries;
671aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  NumberOfIdEntries;
672aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  //
673aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  // Array of EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY entries goes here.
674aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  //
675aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DIRECTORY;
676aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
677aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
678aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource directory entry format.
679aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
680aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
681aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  union {
682aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    struct {
683aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  NameOffset:31;
684aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  NameIsString:1;
685aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    } s;
686aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    UINT32  Id;
687aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  } u1;
688aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  union {
689aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    UINT32  OffsetToData;
690aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    struct {
691aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  OffsetToDirectory:31;
692aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  DataIsDirectory:1;
693aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    } s;
694aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  } u2;
695aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY;
696aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
697aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
698aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource directory entry for string.
699aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
700aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
701aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  Length;
702aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  CHAR16  String[1];
703aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DIRECTORY_STRING;
704aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
705aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
706aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource directory entry for data array.
707aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
708aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
709aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  OffsetToData;
710aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  Size;
711aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  CodePage;
712aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  Reserved;
713aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DATA_ENTRY;
714aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
715aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
716af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Header format for TE images, defined in the PI Specification, 1.0.
717a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
718a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
719af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16                    Signature;            ///< The signature for TE format = "VZ".
720af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16                    Machine;              ///< From the original file header.
721af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT8                     NumberOfSections;     ///< From the original file header.
722af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT8                     Subsystem;            ///< From original optional header.
723af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16                    StrippedSize;         ///< Number of bytes we removed from the header.
724af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32                    AddressOfEntryPoint;  ///< Offset to entry point -- from original optional header.
725af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32                    BaseOfCode;           ///< From original image -- required for ITP debug.
726af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT64                    ImageBase;            ///< From original file header.
727af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[2];     ///< Only base relocation and debug directory.
728a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_TE_IMAGE_HEADER;
729a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
7301f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
73113c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_TE_IMAGE_HEADER_SIGNATURE  SIGNATURE_16('V', 'Z')
732a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
733a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
734a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// Data directory indexes in our TE image header
735a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
736a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC  0
737a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG      1
738a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
739a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
7401bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
741af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Union of PE32, PE32+, and TE headers.
7421bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
743a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef union {
744a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS32   Pe32;
745a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS64   Pe32Plus;
746a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_TE_IMAGE_HEADER      Te;
747a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER_UNION;
748a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
749a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef union {
750a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS32            *Pe32;
751a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS64            *Pe32Plus;
752a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_TE_IMAGE_HEADER               *Te;
753a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER_UNION   *Union;
754a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;
755a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
756a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#endif
757