PeImage.h revision e0919a58562a55ae6964c51598dc0d76389ee109
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
7a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  Common Object File Format Specification, Revision 8.0 - May 16, 2006.
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
42a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
43427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
44427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// EXE file formats
45427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
4613c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_IMAGE_DOS_SIGNATURE     SIGNATURE_16('M', 'Z')
4713c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_IMAGE_OS2_SIGNATURE     SIGNATURE_16('N', 'E')
4813c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_IMAGE_OS2_SIGNATURE_LE  SIGNATURE_16('L', 'E')
499d96b05505cfd5ce5ce09ce813ab84ca3319c3adqhuang#define EFI_IMAGE_NT_SIGNATURE      SIGNATURE_32('P', 'E', '\0', '\0')
50a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
51a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
52a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// PE images can start with an optional DOS header, so if an image is run
531f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// under DOS it can print an error message.
54a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
55a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
56af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_magic;    ///< Magic number.
57af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cblp;     ///< Bytes on last page of file.
58af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cp;       ///< Pages in file.
59af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_crlc;     ///< Relocations.
60af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cparhdr;  ///< Size of header in paragraphs.
61af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_minalloc; ///< Minimum extra paragraphs needed.
62af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_maxalloc; ///< Maximum extra paragraphs needed.
63af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_ss;       ///< Initial (relative) SS value.
64af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_sp;       ///< Initial SP value.
65af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_csum;     ///< Checksum.
66af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_ip;       ///< Initial IP value.
67af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_cs;       ///< Initial (relative) CS value.
68af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_lfarlc;   ///< File address of relocation table.
69af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_ovno;     ///< Overlay number.
70af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_res[4];   ///< Reserved words.
71af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_oemid;    ///< OEM identifier (for e_oeminfo).
72af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_oeminfo;  ///< OEM information; e_oemid specific.
73af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16  e_res2[10]; ///< Reserved words.
74af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  e_lfanew;   ///< File address of new exe header.
75a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DOS_HEADER;
76a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
77a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
78af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// COFF File Header (Object and Image).
79a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
80a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
81a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Machine;
82a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfSections;
83a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
84a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToSymbolTable;
85a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfSymbols;
86a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  SizeOfOptionalHeader;
87a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Characteristics;
88a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_FILE_HEADER;
89a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
901f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
91af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_FILE_HEADER.
921f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
93a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_FILE_HEADER        20
94a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
95427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
96427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Characteristics
97427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
981f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_RELOCS_STRIPPED      BIT0     ///< 0x0001  Relocation info stripped from file.
991f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_EXECUTABLE_IMAGE     BIT1     ///< 0x0002  File is executable  (i.e. no unresolved externel references).
1001f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED   BIT2     ///< 0x0004  Line nunbers stripped from file.
1011f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED  BIT3     ///< 0x0008  Local symbols stripped from file.
1021f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_BYTES_REVERSED_LO    BIT7     ///< 0x0080  Bytes of machine word are reversed.
1031f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_32BIT_MACHINE        BIT8     ///< 0x0100  32 bit word machine.
104af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_FILE_DEBUG_STRIPPED       BIT9     ///< 0x0200  Debugging info stripped from file in .DBG file.
1051f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_SYSTEM               BIT12    ///< 0x1000  System File.
1061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_DLL                  BIT13    ///< 0x2000  File is a DLL.
1071f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_BYTES_REVERSED_HI    BIT15    ///< 0x8000  Bytes of machine word are reversed.
1081f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
109a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
110af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Header Data Directories.
111a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
112a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
113a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
114a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Size;
115a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DATA_DIRECTORY;
116a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
117427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
118427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Directory Entries
119427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
1201f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT      0
1211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT      1
1221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE    2
1231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION   3
1241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY    4
1251f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC   5
1261f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG       6
1271f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT   7
1281f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR   8
1291f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_TLS         9
1301f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
1311f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
1321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16
133a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
134a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
135a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
136a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and
137a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary
138a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// after NT additional fields.
139a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
140a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
141427987f5bc27aef1beffa61b341e41d4740aea54vanjeff
142427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
143af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Optional Header Standard Fields for PE32.
144427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
145a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
1461bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
1471bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  /// Standard fields.
1481bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
149a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Magic;
150a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MajorLinkerVersion;
151a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MinorLinkerVersion;
152a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfCode;
153a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfInitializedData;
154a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfUninitializedData;
155a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    AddressOfEntryPoint;
156a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    BaseOfCode;
157af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32                    BaseOfData;  ///< PE32 contains this additional field, which is absent in PE32+.
1581bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
159427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  /// Optional Header Windows-Specific Fields.
1601bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
161a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    ImageBase;
162a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SectionAlignment;
163a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    FileAlignment;
164a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorOperatingSystemVersion;
165a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorOperatingSystemVersion;
166a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorImageVersion;
167a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorImageVersion;
168a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorSubsystemVersion;
169a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorSubsystemVersion;
170a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    Win32VersionValue;
171a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfImage;
172a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeaders;
173a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    CheckSum;
174a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Subsystem;
175a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    DllCharacteristics;
176a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfStackReserve;
177a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfStackCommit;
178a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeapReserve;
179a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeapCommit;
180a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    LoaderFlags;
181a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    NumberOfRvaAndSizes;
182a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
183a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER32;
184a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
185a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
186a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
187a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and
188a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary
189a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// after NT additional fields.
190a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
191a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
192a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
193427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
194af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Optional Header Standard Fields for PE32+.
195427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
196a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
197427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
198427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  /// Standard fields.
199427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
200a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Magic;
201a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MajorLinkerVersion;
202a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MinorLinkerVersion;
203a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfCode;
204a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfInitializedData;
205a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfUninitializedData;
206a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    AddressOfEntryPoint;
207a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    BaseOfCode;
208427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
209427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  /// Optional Header Windows-Specific Fields.
210427987f5bc27aef1beffa61b341e41d4740aea54vanjeff  ///
211a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    ImageBase;
212a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SectionAlignment;
213a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    FileAlignment;
214a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorOperatingSystemVersion;
215a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorOperatingSystemVersion;
216a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorImageVersion;
217a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorImageVersion;
218a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorSubsystemVersion;
219a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorSubsystemVersion;
220a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    Win32VersionValue;
221a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfImage;
222a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeaders;
223a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    CheckSum;
224a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Subsystem;
225a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    DllCharacteristics;
226a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfStackReserve;
227a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfStackCommit;
228a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfHeapReserve;
229a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfHeapCommit;
230a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    LoaderFlags;
231a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    NumberOfRvaAndSizes;
232a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
233a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER64;
234a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
235a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
236a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
237a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
238cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// EFI_IMAGE_NT_HEADERS32 is for use ONLY by tools.
239a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
240a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
241a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                      Signature;
242a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_FILE_HEADER       FileHeader;
243a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER32 OptionalHeader;
244a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_NT_HEADERS32;
245a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
246a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER sizeof (EFI_IMAGE_NT_HEADERS32)
247a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
248cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff///
249cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// @attention
250cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// EFI_IMAGE_HEADERS64 is for use ONLY by tools.
251cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff///
252a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
253a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                      Signature;
254a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_FILE_HEADER       FileHeader;
255a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER64 OptionalHeader;
256a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_NT_HEADERS64;
257a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
258a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)
259a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
260427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
261427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Other Windows Subsystem Values
262427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
263a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_UNKNOWN     0
264a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_NATIVE      1
265a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI 2
2661f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI 3
267a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_OS2_CUI     5
268a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_POSIX_CUI   7
269a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
2701f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
271cc078d72a67b78fb7481e6a9055dceeed68149cfvanjeff/// Length of ShortName.
2721f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
273a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_SHORT_NAME 8
274a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
275427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
276af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Section Table. This table immediately follows the optional header.
277427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
278a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
279a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8 Name[EFI_IMAGE_SIZEOF_SHORT_NAME];
280a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
281a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  PhysicalAddress;
282a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  VirtualSize;
283a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } Misc;
284a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
285a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfRawData;
286a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToRawData;
287a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToRelocations;
288a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToLinenumbers;
289a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfRelocations;
290a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfLinenumbers;
291a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
292a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_SECTION_HEADER;
293a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
2941f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
295af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_SECTION_HEADER.
2961f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
297a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_SECTION_HEADER       40
2981f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
299427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
300427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Section Flags Values
301427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3021f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_TYPE_NO_PAD                  BIT3   ///< 0x00000008  ///< Reserved.
3031f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_CODE                     BIT5   ///< 0x00000020
3041f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA         BIT6   ///< 0x00000040
3051f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA       BIT7   ///< 0x00000080
3061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3071f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_OTHER                    BIT8   ///< 0x00000100  ///< Reserved.
3081f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_INFO                     BIT9   ///< 0x00000200  ///< Section contains comments or some other type of information.
30914996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_SCN_LNK_REMOVE                   BIT11  ///< 0x00000800  ///< Section contents will not become part of image.
3101f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_COMDAT                   BIT12  ///< 0x00001000
3111f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3121f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_1BYTES                 BIT20  ///< 0x00100000
3131f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_2BYTES                 BIT21  ///< 0x00200000
3141f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_4BYTES          (BIT20|BIT21) ///< 0x00300000
3151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_8BYTES                 BIT22  ///< 0x00400000
3161f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_16BYTES         (BIT20|BIT22) ///< 0x00500000
3171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_32BYTES         (BIT21|BIT22) ///< 0x00600000
3181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_64BYTES   (BIT20|BIT21|BIT22) ///< 0x00700000
3191f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3201f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_DISCARDABLE              BIT25  ///< 0x02000000
3211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_NOT_CACHED               BIT26  ///< 0x04000000
3221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_NOT_PAGED                BIT27  ///< 0x08000000
3231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_SHARED                   BIT28  ///< 0x10000000
3241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_EXECUTE                  BIT29  ///< 0x20000000
3251f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_READ                     BIT30  ///< 0x40000000
3261f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_WRITE                    BIT31  ///< 0x80000000
3271f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3281f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
329af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of a Symbol Table Record.
3301f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
3311f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SIZEOF_SYMBOL 18
332a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
333427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
334427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Symbols have a section number of the section in which they are
335427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// defined. Otherwise, section numbers have the following meanings:
336427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3371f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_UNDEFINED (UINT16) 0  ///< Symbol is undefined or is common.
3381f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_ABSOLUTE  (UINT16) -1 ///< Symbol is an absolute value.
3391f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_DEBUG     (UINT16) -2 ///< Symbol is a special debug item.
340a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
341427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
342427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Symbol Type (fundamental) values.
343427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3441f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_NULL   0   ///< no type.
3451f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_VOID   1   ///< no valid type.
3461f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_CHAR   2   ///< type character.
3471f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_SHORT  3   ///< type short integer.
348a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_INT    4
349a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_LONG   5
350a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_FLOAT  6
351a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_DOUBLE 7
352a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_STRUCT 8
353a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_UNION  9
3541f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_ENUM   10  ///< enumeration.
3551f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_MOE    11  ///< member of enumeration.
356a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_BYTE   12
357a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_WORD   13
358a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_UINT   14
359a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_DWORD  15
360a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
361427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
362427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Symbol Type (derived) values.
363427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3641f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_DTYPE_NULL      0 ///< no derived type.
365a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_POINTER   1
366a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_FUNCTION  2
367a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_ARRAY     3
368a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
369427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
370427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Storage classes.
371427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
3721f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION   ((UINT8) -1)
373a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_NULL              0
374a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_AUTOMATIC         1
375a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_EXTERNAL          2
376a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_STATIC            3
377a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_REGISTER          4
378a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF      5
379a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_LABEL             6
380a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL   7
381a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT  8
382a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_ARGUMENT          9
383a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_STRUCT_TAG        10
384a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION   11
385a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNION_TAG         12
386a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION   13
387a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC  14
388a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_ENUM_TAG          15
389a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM    16
390a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM    17
391a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_BIT_FIELD         18
392a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_BLOCK             100
393a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_FUNCTION          101
394a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT     102
395a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_FILE              103
396a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_SECTION           104
397a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL     105
398a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
399a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
400a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// type packing constants
401a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
402a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_BTMASK  017
403a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK   060
404a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK1  0300
405a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK2  0360
406a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_BTSHFT  4
407a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TSHIFT  2
408a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
409427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
410427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Communal selection types.
411427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
412a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES    1
413a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_ANY             2
414a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE       3
415a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH     4
416a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE     5
4171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
418427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
419427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// the following values only be referred in PeCoff, not defined in PECOFF.
420427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
421a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
422a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
423a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
424a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
425a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
426a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Relocation format.
427a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
428a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
429a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
430a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SymbolTableIndex;
431a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Type;
432a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_RELOCATION;
433a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4341f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_RELOCATION
4361f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
437a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_RELOCATION 10
438a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
439427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
440427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// I386 relocation types.
441427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
442af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_ABSOLUTE 0x0000  ///< Reference is absolute, no relocation is necessary.
443af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_DIR16    0x0001  ///< Direct 16-bit reference to the symbols virtual address.
444af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_REL16    0x0002  ///< PC-relative 16-bit reference to the symbols virtual address.
445af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_DIR32    0x0006  ///< Direct 32-bit reference to the symbols virtual address.
446af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_DIR32NB  0x0007  ///< Direct 32-bit reference to the symbols virtual address, base not included.
447af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_SEG12    0x0009  ///< Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address.
4481f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_SECTION  0x000A
4491f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_SECREL   0x000B
450af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_REL_I386_REL32    0x0014  ///< PC-relative 32-bit reference to the symbols virtual address.
451a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
452427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
453427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// x64 processor relocation types.
454427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
455ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ABSOLUTE  0x0000
456ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ADDR64    0x0001
457ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ADDR32    0x0002
458ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_ADDR32NB  0x0003
459ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32     0x0004
460ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_1   0x0005
461ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_2   0x0006
462ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_3   0x0007
463ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_4   0x0008
464ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_REL32_5   0x0009
465ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SECTION   0x000A
466ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SECREL    0x000B
467ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SECREL7   0x000C
468ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_TOKEN     0x000D
469ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SREL32    0x000E
470ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_PAIR      0x000F
471ee6c452c81f135a53f918761f02333ee57d7776dqhuang#define IMAGE_REL_AMD64_SSPAN32   0x0010
472a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
473a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
474a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Based relocation format.
475a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
476a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
477a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
478a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfBlock;
479a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_BASE_RELOCATION;
480a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4811f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
482af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_BASE_RELOCATION.
4831f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
484a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_BASE_RELOCATION  8
485a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
486427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
487427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Based relocation types.
488427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
48914996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_ABSOLUTE        0
49014996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_HIGH            1
49114996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_LOW             2
49214996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_HIGHLOW         3
49314996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_HIGHADJ         4
49414996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR    5
495e0919a58562a55ae6964c51598dc0d76389ee109andrewfish#define EFI_IMAGE_REL_BASED_ARM_MOV32A      5
496e0919a58562a55ae6964c51598dc0d76389ee109andrewfish#define EFI_IMAGE_REL_BASED_ARM_MOV32T      7
49714996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_IA64_IMM64      9
49814996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR16  9
49914996c966991de1127fc2d6af8a08df47167b4ablgao#define EFI_IMAGE_REL_BASED_DIR64           10
500a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
501a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
502a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Line number format.
503a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
504a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
505a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
5066800ac833dd4f25bf73cc711f89ebc6ec7808599gikidy    UINT32  SymbolTableIndex; ///< Symbol table index of function name if Linenumber is 0.
5076800ac833dd4f25bf73cc711f89ebc6ec7808599gikidy    UINT32  VirtualAddress;   ///< Virtual address of line number.
508a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } Type;
5096800ac833dd4f25bf73cc711f89ebc6ec7808599gikidy  UINT16  Linenumber;         ///< Line number.
510a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_LINENUMBER;
511a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5121f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
513af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_LINENUMBER.
5141f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
515a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_LINENUMBER 6
516a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
517427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
518427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// Archive format.
519427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
520a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_START_SIZE        8
521a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_START             "!<arch>\n"
522a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_END               "`\n"
523a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_PAD               "\n"
524a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_LINKER_MEMBER     "/               "
525a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER  "//              "
526a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
527427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
528427987f5bc27aef1beffa61b341e41d4740aea54vanjeff/// Archive Member Headers
529427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
530a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
5311f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Name[16];     ///< File member name - `/' terminated.
5321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Date[12];     ///< File member date - decimal.
5331f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 UserID[6];    ///< File member user id - decimal.
5341f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 GroupID[6];   ///< File member group id - decimal.
5351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Mode[8];      ///< File member mode - octal.
5361f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Size[10];     ///< File member size - decimal.
537af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT8 EndHeader[2]; ///< String to end header. (0x60 0x0A).
538a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_ARCHIVE_MEMBER_HEADER;
539a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5401f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
541af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Size of EFI_IMAGE_ARCHIVE_MEMBER_HEADER.
5421f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
543a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
544a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
545a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
546427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
547427987f5bc27aef1beffa61b341e41d4740aea54vanjeff// DLL Support
548427987f5bc27aef1beffa61b341e41d4740aea54vanjeff//
5491f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
5501f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
551af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Export Directory Table.
552a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
553a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
554a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
555a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
556a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MajorVersion;
557a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MinorVersion;
558a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Name;
559a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Base;
560a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfFunctions;
561a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfNames;
562a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfFunctions;
563a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfNames;
564a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfNameOrdinals;
565a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_EXPORT_DIRECTORY;
566a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
567a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
568af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Hint/Name Table.
569a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
570a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
571a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Hint;
572a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8   Name[1];
573a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_IMPORT_BY_NAME;
574a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
575427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
576af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Import Address Table RVA (Thunk Table).
577427987f5bc27aef1beffa61b341e41d4740aea54vanjeff///
578a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
579a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
580a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32                    Function;
581a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32                    Ordinal;
582a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    EFI_IMAGE_IMPORT_BY_NAME  *AddressOfData;
583a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } u1;
584a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_THUNK_DATA;
585a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
586af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_ORDINAL_FLAG              BIT31    ///< Flag for PE32.
587a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal)  ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0)
588a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ORDINAL(Ordinal)          (Ordinal & 0xffff)
589a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5901f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5911f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Import Directory Table
5921f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
593a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
594a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                Characteristics;
595a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                TimeDateStamp;
596a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                ForwarderChain;
597a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                Name;
598a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_THUNK_DATA  *FirstThunk;
599a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_IMPORT_DESCRIPTOR;
600a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6011f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
602a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
603af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Directory Format.
604a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
605a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
606a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
607a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
608a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MajorVersion;
609a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MinorVersion;
610a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Type;
611a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfData;
612af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  RVA;           ///< The address of the debug data when loaded, relative to the image base.
613af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  FileOffset;    ///< The file pointer to the debug data.
614a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;
615a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
616af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2     ///< The Visual C++ debug information.
6171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
6181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
619af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Data Structure defined in Microsoft C++.
6201f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
62113c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define CODEVIEW_SIGNATURE_NB10  SIGNATURE_32('N', 'B', '1', '0')
622a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
6231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32  Signature;                        ///< "NB10"
624a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown;
625a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown2;
626a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown3;
627a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
628a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // Filename of .PDB goes here
629a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
630a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;
631a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
633af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Data Structure defined in Microsoft C++.
6341f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
63513c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define CODEVIEW_SIGNATURE_RSDS  SIGNATURE_32('R', 'S', 'D', 'S')
636a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
637af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32  Signature;                        ///< "RSDS".
638a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown;
639a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown2;
640a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown3;
641a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown4;
642a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown5;
643a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
644a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // Filename of .PDB goes here
645a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
646a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;
647a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
648a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney
649a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney///
650af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Debug Data Structure defined by Apple Mach-O to Coff utility.
651a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney///
652a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney#define CODEVIEW_SIGNATURE_MTOC  SIGNATURE_32('M', 'T', 'O', 'C')
653a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinneytypedef struct {
654af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32    Signature;                       ///< "MTOC".
655a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  GUID      MachOUuid;
656a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  //
657a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  //  Filename of .DLL (Mach-O with debug info) goes here
658a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney  //
659a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney} EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY;
660a35dd88a9ee26e0da296b3b998658a63a2c2d21cmdkinney
661a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
662aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource format.
663aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
664aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
665aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  Characteristics;
666aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  TimeDateStamp;
667aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  MajorVersion;
668aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  MinorVersion;
669aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  NumberOfNamedEntries;
670aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  NumberOfIdEntries;
671aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  //
672aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  // Array of EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY entries goes here.
673aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  //
674aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DIRECTORY;
675aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
676aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
677aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource directory entry format.
678aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
679aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
680aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  union {
681aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    struct {
682aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  NameOffset:31;
683aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  NameIsString:1;
684aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    } s;
685aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    UINT32  Id;
686aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  } u1;
687aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  union {
688aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    UINT32  OffsetToData;
689aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    struct {
690aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  OffsetToDirectory:31;
691aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang      UINT32  DataIsDirectory:1;
692aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang    } s;
693aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  } u2;
694aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY;
695aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
696aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
697aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource directory entry for string.
698aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
699aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
700aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT16  Length;
701aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  CHAR16  String[1];
702aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DIRECTORY_STRING;
703aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
704aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
705aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang/// Resource directory entry for data array.
706aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
707aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuangtypedef struct {
708aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  OffsetToData;
709aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  Size;
710aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  CodePage;
711aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang  UINT32  Reserved;
712aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang} EFI_IMAGE_RESOURCE_DATA_ENTRY;
713aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang
714aeb90c4a15e90a85121e47b541baeaeff1e150a4qhuang///
715af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Header format for TE images, defined in the PI Specification, 1.0.
716a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
717a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
718af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16                    Signature;            ///< The signature for TE format = "VZ".
719af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16                    Machine;              ///< From the original file header.
720af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT8                     NumberOfSections;     ///< From the original file header.
721af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT8                     Subsystem;            ///< From original optional header.
722af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT16                    StrippedSize;         ///< Number of bytes we removed from the header.
723af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32                    AddressOfEntryPoint;  ///< Offset to entry point -- from original optional header.
724af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT32                    BaseOfCode;           ///< From original image -- required for ITP debug.
725af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  UINT64                    ImageBase;            ///< From original file header.
726af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[2];     ///< Only base relocation and debug directory.
727a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_TE_IMAGE_HEADER;
728a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
7291f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
73013c310654c058ae70f8e95b9a47f03fc9d42c7davanjeff#define EFI_TE_IMAGE_HEADER_SIGNATURE  SIGNATURE_16('V', 'Z')
731a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
732a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
733a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// Data directory indexes in our TE image header
734a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
735a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC  0
736a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG      1
737a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
738a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
7391bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
740af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Union of PE32, PE32+, and TE headers.
7411bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
742a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef union {
743a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS32   Pe32;
744a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS64   Pe32Plus;
745a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_TE_IMAGE_HEADER      Te;
746a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER_UNION;
747a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
748a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef union {
749a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS32            *Pe32;
750a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS64            *Pe32Plus;
751a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_TE_IMAGE_HEADER               *Te;
752a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER_UNION   *Union;
753a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;
754a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
755a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#endif
756