PeImage.h revision 1f76500ee9ed238000c96ca02df6d1cadf6b433f
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
101f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  Copyright (c) 2006 - 2008, Intel Corporation
11a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  All rights reserved. This program and the accompanying materials
12a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  are licensed and made available under the terms and conditions of the BSD License
13a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  which accompanies this distribution.  The full text of the license may be found at
14a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  http://opensource.org/licenses/bsd-license.php
15a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
16a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
19a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang**/
20a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#ifndef __PE_IMAGE_H__
221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define __PE_IMAGE_H__
23a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
251f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// PE32+ Subsystem type for EFI images
261f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
27a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION         10
28a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
29a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER      12
30a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_EFI_EFI_ROM             13
31a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER      13 ///< defined PI Specification, 1.0
33a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
34a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
361f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// PE32+ Machine type for EFI images
371f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
38a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_FILE_MACHINE_I386     0x014c
39a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_FILE_MACHINE_IA64     0x0200
40a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_FILE_MACHINE_EBC      0x0EBC
41a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_FILE_MACHINE_X64      0x8664
42a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
43a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// Support old names for backward compatible
44a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
45a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_IA32      IMAGE_FILE_MACHINE_I386
46a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_IA64      IMAGE_FILE_MACHINE_IA64
47a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_IPF       IMAGE_FILE_MACHINE_IA64
48a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_EBC       IMAGE_FILE_MACHINE_EBC
49a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_X64       IMAGE_FILE_MACHINE_X64
50a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
511f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
521f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// EXE file formats
531f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
541f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DOS_SIGNATURE     0x5A4D      ///< MZ
551f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_OS2_SIGNATURE     0x454E      ///< NE
561f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_OS2_SIGNATURE_LE  0x454C      ///< LE
571f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_NT_SIGNATURE      0x00004550  ///< PE00
58a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
59a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
60a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// PE images can start with an optional DOS header, so if an image is run
611f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// under DOS it can print an error message.
62a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
63a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
641f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_magic;    ///< Magic number
651f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_cblp;     ///< Bytes on last page of file
661f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_cp;       ///< Pages in file
671f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_crlc;     ///< Relocations
681f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_cparhdr;  ///< Size of header in paragraphs
691f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_minalloc; ///< Minimum extra paragraphs needed
701f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_maxalloc; ///< Maximum extra paragraphs needed
711f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_ss;       ///< Initial (relative) SS value
721f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_sp;       ///< Initial SP value
731f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_csum;     ///< Checksum
741f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_ip;       ///< Initial IP value
751f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_cs;       ///< Initial (relative) CS value
761f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_lfarlc;   ///< File address of relocation table
771f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_ovno;     ///< Overlay number
781f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_res[4];   ///< Reserved words
791f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_oemid;    ///< OEM identifier (for e_oeminfo)
801f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_oeminfo;  ///< OEM information; e_oemid specific
811f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16  e_res2[10]; ///< Reserved words
821f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32  e_lfanew;   ///< File address of new exe header
83a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DOS_HEADER;
84a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
85a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
861f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// COFF File Header (Object and Image)
87a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
88a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
89a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Machine;
90a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfSections;
91a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
92a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToSymbolTable;
93a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfSymbols;
94a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  SizeOfOptionalHeader;
95a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Characteristics;
96a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_FILE_HEADER;
97a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
981f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
991f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_FILE_HEADER
1001f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
101a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_FILE_HEADER        20
102a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
1031f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
1041f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Characteristics
1051f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
1061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_RELOCS_STRIPPED      BIT0     ///< 0x0001  Relocation info stripped from file.
1071f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_EXECUTABLE_IMAGE     BIT1     ///< 0x0002  File is executable  (i.e. no unresolved externel references).
1081f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED   BIT2     ///< 0x0004  Line nunbers stripped from file.
1091f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED  BIT3     ///< 0x0008  Local symbols stripped from file.
1101f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_BYTES_REVERSED_LO    BIT7     ///< 0x0080  Bytes of machine word are reversed.
1111f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_32BIT_MACHINE        BIT8     ///< 0x0100  32 bit word machine.
1121f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_DEBUG_STRIPPED       BIT9     ///< 0x0200  Debugging info stripped from file in .DBG file
1131f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_SYSTEM               BIT12    ///< 0x1000  System File.
1141f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_DLL                  BIT13    ///< 0x2000  File is a DLL.
1151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_BYTES_REVERSED_HI    BIT15    ///< 0x8000  Bytes of machine word are reversed.
1161f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
1171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
1181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Other Machine Types
1191f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
1201f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_MACHINE_UNKNOWN      0       ///< Any machine type
1211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_MACHINE_I386         0x14c   ///< Intel 386.
1221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_MACHINE_R3000        0x162   ///< MIPS* little-endian, 0540 big-endian
1231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_MACHINE_R4000        0x166   ///< MIPS* little-endian
1241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_FILE_MACHINE_POWERPC      0x1F0   ///< IBM* PowerPC Little-Endian
125a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
126a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// * Other names and brands may be claimed as the property of others.
127a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
128a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
129a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
1301f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Header Data Directories
131a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
132a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
133a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
134a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Size;
135a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DATA_DIRECTORY;
136a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
137a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ROM_OPTIONAL_HDR_MAGIC      0x107
138a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
1391f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
1401f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Directory Entries
1411f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
1421f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT      0
1431f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT      1
1441f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE    2
1451f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION   3
1461f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY    4
1471f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC   5
1481f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG       6
1491f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT   7
1501f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR   8
1511f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_TLS         9
1521f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
1531f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
1541f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16
155a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
156a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
157a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
158a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and
159a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary
160a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// after NT additional fields.
161a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
162a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
163a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
164a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
1651bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
1661bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  /// Standard fields.
1671bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
168a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Magic;
169a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MajorLinkerVersion;
170a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MinorLinkerVersion;
171a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfCode;
172a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfInitializedData;
173a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfUninitializedData;
174a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    AddressOfEntryPoint;
175a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    BaseOfCode;
1761f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32                    BaseOfData;  ///< PE32 contains this additional field, which is absent in PE32+
1771bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
1781bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  /// NT additional fields.
1791bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu  ///
180a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    ImageBase;
181a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SectionAlignment;
182a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    FileAlignment;
183a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorOperatingSystemVersion;
184a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorOperatingSystemVersion;
185a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorImageVersion;
186a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorImageVersion;
187a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorSubsystemVersion;
188a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorSubsystemVersion;
189a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    Win32VersionValue;
190a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfImage;
191a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeaders;
192a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    CheckSum;
193a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Subsystem;
194a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    DllCharacteristics;
195a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfStackReserve;
196a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfStackCommit;
197a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeapReserve;
198a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeapCommit;
199a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    LoaderFlags;
200a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    NumberOfRvaAndSizes;
201a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
202a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER32;
203a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
204a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
205a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
206a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and
207a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary
208a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// after NT additional fields.
209a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
210a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
211a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
212a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
213a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
214a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // Standard fields.
215a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
216a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Magic;
217a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MajorLinkerVersion;
218a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8                     MinorLinkerVersion;
219a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfCode;
220a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfInitializedData;
221a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfUninitializedData;
222a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    AddressOfEntryPoint;
223a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    BaseOfCode;
224a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
225a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // NT additional fields.
226a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
227a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    ImageBase;
228a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SectionAlignment;
229a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    FileAlignment;
230a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorOperatingSystemVersion;
231a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorOperatingSystemVersion;
232a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorImageVersion;
233a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorImageVersion;
234a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MajorSubsystemVersion;
235a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    MinorSubsystemVersion;
236a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    Win32VersionValue;
237a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfImage;
238a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    SizeOfHeaders;
239a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    CheckSum;
240a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    Subsystem;
241a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16                    DllCharacteristics;
242a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfStackReserve;
243a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfStackCommit;
244a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfHeapReserve;
245a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT64                    SizeOfHeapCommit;
246a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    LoaderFlags;
247a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                    NumberOfRvaAndSizes;
248a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
249a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER64;
250a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
251a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
252a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
253a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// @attention
254a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY
255a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// by tools.  All proper EFI code MUST use EFI_IMAGE_NT_HEADERS ONLY!!!
256a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
257a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
258a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                      Signature;
259a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_FILE_HEADER       FileHeader;
260a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER32 OptionalHeader;
261a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_NT_HEADERS32;
262a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
263a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER sizeof (EFI_IMAGE_NT_HEADERS32)
264a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
265a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
266a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                      Signature;
267a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_FILE_HEADER       FileHeader;
268a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER64 OptionalHeader;
269a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_NT_HEADERS64;
270a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
271a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)
272a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
273a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
2741f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
2751f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Processor specific definition of EFI_IMAGE_OPTIONAL_HEADER so the
2761f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// type name EFI_IMAGE_OPTIONAL_HEADER is appropriate to the build.  Same for
2771f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// EFI_IMAGE_NT_HEADERS.  These definitions MUST be used by ALL EFI code.
2781f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
279a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#if   defined (MDE_CPU_IA32)
280a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
281a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
282a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  (((Machine) == EFI_IMAGE_MACHINE_IA32) || ((Machine) == EFI_IMAGE_MACHINE_EBC))
283a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
284a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_X64)
285a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
286a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef EFI_IMAGE_NT_HEADERS32    EFI_IMAGE_NT_HEADERS;
287a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
288a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#elif defined (MDE_CPU_IPF)
289a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
290a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
291a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  (((Machine) == EFI_IMAGE_MACHINE_IPF) || ((Machine) == EFI_IMAGE_MACHINE_EBC))
292a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
293a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE)
294a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
295a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef EFI_IMAGE_NT_HEADERS64    EFI_IMAGE_NT_HEADERS;
296a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
297a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#elif defined (MDE_CPU_X64)
298a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
299a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
300a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  (((Machine) == EFI_IMAGE_MACHINE_X64) || ((Machine) == EFI_IMAGE_MACHINE_EBC))
301a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
302a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_IA32)
303a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
304c020e37c21341394b1ef3e50c429e3824eb4e941lgaotypedef EFI_IMAGE_NT_HEADERS64    EFI_IMAGE_NT_HEADERS;
305a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
306a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#elif defined (MDE_CPU_EBC)
307a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
3081bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
3091bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu/// This is just to make sure you can cross compile with the EBC compiiler.
3101bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu/// It does not make sense to have a PE loader coded in EBC. You need to
3111bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu/// understand the basic
3121bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
313a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_EBC)
314a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
315a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE)
316a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
317a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef EFI_IMAGE_NT_HEADERS64    EFI_IMAGE_NT_HEADERS;
318a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
319a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#else
320a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#error Unknown Processor Type
321a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#endif
322a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
323a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
324a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_FIRST_SECTION(ntheader) \
325a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    ( \
326a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang      (EFI_IMAGE_SECTION_HEADER *) \
327a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang        ( \
328a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang          (UINT32) ntheader + \
329a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang          FIELD_OFFSET (EFI_IMAGE_NT_HEADERS, OptionalHeader) + \
330a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang          ((EFI_IMAGE_NT_HEADERS *) (ntheader))->FileHeader.SizeOfOptionalHeader \
331a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang        ) \
332a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    )
333a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
3341f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
3351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Other Windows Subsystem Values
3361f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
337a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_UNKNOWN     0
338a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_NATIVE      1
339a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI 2
3401f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI 3
341a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_OS2_CUI     5
342a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SUBSYSTEM_POSIX_CUI   7
343a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
3441f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
3451f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Section header format.
3461f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
347a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_SHORT_NAME 8
348a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
349a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
350a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8 Name[EFI_IMAGE_SIZEOF_SHORT_NAME];
351a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
352a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  PhysicalAddress;
353a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  VirtualSize;
354a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } Misc;
355a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
356a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfRawData;
357a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToRawData;
358a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToRelocations;
359a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  PointerToLinenumbers;
360a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfRelocations;
361a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  NumberOfLinenumbers;
362a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
363a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_SECTION_HEADER;
364a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
3651f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
3661f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_SECTION_HEADER
3671f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
368a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_SECTION_HEADER       40
3691f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3701f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
3711f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Section Flags Values
3721f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
3731f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_TYPE_NO_PAD                  BIT3   ///< 0x00000008  ///< Reserved.
3741f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_CODE                     BIT5   ///< 0x00000020
3751f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA         BIT6   ///< 0x00000040
3761f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA       BIT7   ///< 0x00000080
3771f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3781f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_OTHER                    BIT8   ///< 0x00000100  ///< Reserved.
3791f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_INFO                     BIT9   ///< 0x00000200  ///< Section contains comments or some other type of information.
3801f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_REMOVE                   BIT10  ///< 0x00000800  ///< Section contents will not become part of image.
3811f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_LNK_COMDAT                   BIT12  ///< 0x00001000
3821f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3831f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_1BYTES                 BIT20  ///< 0x00100000
3841f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_2BYTES                 BIT21  ///< 0x00200000
3851f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_4BYTES          (BIT20|BIT21) ///< 0x00300000
3861f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_8BYTES                 BIT22  ///< 0x00400000
3871f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_16BYTES         (BIT20|BIT22) ///< 0x00500000
3881f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_32BYTES         (BIT21|BIT22) ///< 0x00600000
3891f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_ALIGN_64BYTES   (BIT20|BIT21|BIT22) ///< 0x00700000
3901f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3911f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_DISCARDABLE              BIT25  ///< 0x02000000
3921f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_NOT_CACHED               BIT26  ///< 0x04000000
3931f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_NOT_PAGED                BIT27  ///< 0x08000000
3941f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_SHARED                   BIT28  ///< 0x10000000
3951f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_EXECUTE                  BIT29  ///< 0x20000000
3961f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_READ                     BIT30  ///< 0x40000000
3971f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SCN_MEM_WRITE                    BIT31  ///< 0x80000000
3981f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
3991f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4001f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of a Symbol Table Record
4011f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4021f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SIZEOF_SYMBOL 18
403a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
404a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
4051f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Symbols have a section number of the section in which they are
4061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// defined. Otherwise, section numbers have the following meanings:
407a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
4081f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_UNDEFINED (UINT16) 0  ///< Symbol is undefined or is common.
4091f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_ABSOLUTE  (UINT16) -1 ///< Symbol is an absolute value.
4101f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_DEBUG     (UINT16) -2 ///< Symbol is a special debug item.
411a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4121f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4131f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Symbol Type (fundamental) values.
4141f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_NULL   0   ///< no type.
4161f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_VOID   1   ///< no valid type.
4171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_CHAR   2   ///< type character.
4181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_SHORT  3   ///< type short integer.
419a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_INT    4
420a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_LONG   5
421a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_FLOAT  6
422a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_DOUBLE 7
423a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_STRUCT 8
424a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_UNION  9
4251f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_ENUM   10  ///< enumeration.
4261f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_TYPE_MOE    11  ///< member of enumeration.
427a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_BYTE   12
428a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_WORD   13
429a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_UINT   14
430a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_TYPE_DWORD  15
431a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4321f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4331f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Symbol Type (derived) values.
4341f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4351f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_DTYPE_NULL      0 ///< no derived type.
436a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_POINTER   1
437a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_FUNCTION  2
438a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_DTYPE_ARRAY     3
439a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4401f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4411f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Storage classes.
4421f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4431f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION   ((UINT8) -1)
444a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_NULL              0
445a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_AUTOMATIC         1
446a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_EXTERNAL          2
447a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_STATIC            3
448a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_REGISTER          4
449a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF      5
450a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_LABEL             6
451a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL   7
452a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT  8
453a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_ARGUMENT          9
454a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_STRUCT_TAG        10
455a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION   11
456a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNION_TAG         12
457a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION   13
458a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC  14
459a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_ENUM_TAG          15
460a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM    16
461a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM    17
462a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_BIT_FIELD         18
463a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_BLOCK             100
464a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_FUNCTION          101
465a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT     102
466a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_FILE              103
467a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_SECTION           104
468a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL     105
469a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
470a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
471a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// type packing constants
472a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
473a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_BTMASK  017
474a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK   060
475a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK1  0300
476a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TMASK2  0360
477a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_BTSHFT  4
478a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_N_TSHIFT  2
479a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
4801f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4811f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Communal selection types.
4821f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
483a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES    1
484a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_ANY             2
485a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE       3
486a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH     4
487a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE     5
4881f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
4891f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
4901f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// the following values only be referred in PeCoff, not defined in PECOFF.
4911f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
492a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
493a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
494a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
495a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
496a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
497a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Relocation format.
498a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
499a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
500a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
501a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SymbolTableIndex;
502a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Type;
503a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_RELOCATION;
504a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5051f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_RELOCATION
5071f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
508a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_RELOCATION 10
509a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5101f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5111f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// I386 relocation types.
5121f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5131f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_ABSOLUTE 0x0000  ///< Reference is absolute, no relocation is necessary
5141f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_DIR16    0x0001  ///< Direct 16-bit reference to the symbols virtual address
5151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_REL16    0x0002  ///< PC-relative 16-bit reference to the symbols virtual address
5161f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_DIR32    0x0006  ///< Direct 32-bit reference to the symbols virtual address
5171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_DIR32NB  0x0007  ///< Direct 32-bit reference to the symbols virtual address, base not included
5181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_SEG12    0x0009  ///< Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
5191f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_SECTION  0x000A
5201f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_SECREL   0x000B
5211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_REL_I386_REL32    0x0014  ///< PC-relative 32-bit reference to the symbols virtual address
522a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5241f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// x64 processor relocation types.
5251f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
526a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_ABSOLUTE	0x0000
527a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_ADDR64	  0x0001
528a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_ADDR32	  0x0002
529a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_ADDR32NB	0x0003
530a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_REL32	    0x0004
531a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_REL32_1	  0x0005
532a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_REL32_2	  0x0006
533a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_REL32_3	  0x0007
534a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_REL32_4	  0x0008
535a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_REL32_5	  0x0009
536a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_SECTION	  0x000A
537a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_SECREL	  0x000B
538a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_SECREL7	  0x000C
539a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_TOKEN	    0x000D
540a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_SREL32	  0x000E
541a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_PAIR	    0x000F
542a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define IMAGE_REL_AMD64_SSPAN32	  0x0010
543a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
544a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
545a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Based relocation format.
546a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
547a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
548a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  VirtualAddress;
549a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfBlock;
550a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_BASE_RELOCATION;
551a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5521f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5531f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_BASE_RELOCATION
5541f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
555a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_BASE_RELOCATION  8
556a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5571f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5581f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Based relocation types.
5591f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
560a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_ABSOLUTE      0
561a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_HIGH          1
562a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_LOW           2
563a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_HIGHLOW       3
564a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_HIGHADJ       4
565a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR  5
566a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_IA64_IMM64    9
5671f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define IMAGE_REL_BASED_MIPS_JMPADDR16    9
568a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_REL_BASED_DIR64         10
569a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
570a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
571a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang/// Line number format.
572a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
573a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
574a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
575a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  SymbolTableIndex; // Symbol table index of function name if Linenumber is 0.
576a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32  VirtualAddress;   // Virtual address of line number.
577a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } Type;
578a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Linenumber;         // Line number.
579a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_LINENUMBER;
580a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5811f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5821f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_LINENUMBER
5831f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
584a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_LINENUMBER 6
585a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
5861f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
5871f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Archive format.
5881f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
589a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_START_SIZE        8
590a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_START             "!<arch>\n"
591a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_END               "`\n"
592a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_PAD               "\n"
593a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_LINKER_MEMBER     "/               "
594a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER  "//              "
595a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
596a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
5971f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Name[16];     ///< File member name - `/' terminated.
5981f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Date[12];     ///< File member date - decimal.
5991f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 UserID[6];    ///< File member user id - decimal.
6001f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 GroupID[6];   ///< File member group id - decimal.
6011f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Mode[8];      ///< File member mode - octal.
6021f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 Size[10];     ///< File member size - decimal.
6031f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8 EndHeader[2]; ///< String to end header. (0x60 0x0A)
604a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_ARCHIVE_MEMBER_HEADER;
605a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6061f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
6071f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Size of EFI_IMAGE_ARCHIVE_MEMBER_HEADER
6081f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
609a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
610a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
611a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
612a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
6131f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// DLL Support
6141f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
6151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
6161f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
6171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Export Directory Table
618a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
619a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
620a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
621a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
622a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MajorVersion;
623a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MinorVersion;
624a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Name;
625a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Base;
626a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfFunctions;
627a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  NumberOfNames;
628a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfFunctions;
629a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfNames;
630a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  AddressOfNameOrdinals;
631a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_EXPORT_DIRECTORY;
632a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
633a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
6341f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Hint/Name Table
635a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
636a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
637a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  Hint;
638a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT8   Name[1];
639a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_IMPORT_BY_NAME;
640a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
641a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
642a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  union {
643a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32                    Function;
644a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    UINT32                    Ordinal;
645a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang    EFI_IMAGE_IMPORT_BY_NAME  *AddressOfData;
646a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  } u1;
647a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_THUNK_DATA;
648a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6491f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_ORDINAL_FLAG              BIT31    ///< Flag for PE32
650a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal)  ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0)
651a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_IMAGE_ORDINAL(Ordinal)          (Ordinal & 0xffff)
652a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6531f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
6541f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Import Directory Table
6551f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
656a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
657a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                Characteristics;
658a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                TimeDateStamp;
659a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                ForwarderChain;
660a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32                Name;
661a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_THUNK_DATA  *FirstThunk;
662a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_IMPORT_DESCRIPTOR;
663a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6641f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
665a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
6661f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Debug Direcotry Format
667a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
668a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
669a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Characteristics;
670a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  TimeDateStamp;
671a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MajorVersion;
672a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT16  MinorVersion;
673a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Type;
674a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  SizeOfData;
6751f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32  RVA;           ///< The address of the debug data when loaded, relative to the image base
6761f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32  FileOffset;    ///< The file pointer to the debug data
677a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;
678a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6791f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2     ///< The Visual C++ debug information
6801f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
6811f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
6821f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Debug Data Structure defined in Microsoft C++
6831f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
684a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define CODEVIEW_SIGNATURE_NB10 0x3031424E  // "NB10"
685a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
6861f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32  Signature;                        ///< "NB10"
687a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown;
688a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown2;
689a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown3;
690a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
691a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // Filename of .PDB goes here
692a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
693a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;
694a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
6951f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
6961f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Debug Data Structure defined in Microsoft C++
6971f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff///
698a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define CODEVIEW_SIGNATURE_RSDS 0x53445352  // "RSDS"
699a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
7001f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32  Signature;                        ///< "RSDS"
701a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown;
702a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown2;
703a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown3;
704a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown4;
705a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  UINT32  Unknown5;
706a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
707a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  // Filename of .PDB goes here
708a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  //
709a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;
710a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
711a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
7121f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff/// Header format for TE images, defined in PI Specification, 1.0
713a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang///
714a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef struct {
7151f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16                    Signature;            ///< signature for TE format = "VZ"
7161f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16                    Machine;              ///< from the original file header
7171f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8                     NumberOfSections;     ///< from the original file header
7181f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT8                     Subsystem;            ///< from original optional header
7191f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT16                    StrippedSize;         ///< how many bytes we removed from the header
7201f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32                    AddressOfEntryPoint;  ///< offset to entry point -- from original optional header
7211f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT32                    BaseOfCode;           ///< from original image -- required for ITP debug
7221f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  UINT64                    ImageBase;            ///< from original file header
7231f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff  EFI_IMAGE_DATA_DIRECTORY  DataDirectory[2];     ///< only base relocation and debug directory
724a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_TE_IMAGE_HEADER;
725a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
7261f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff
7271f76500ee9ed238000c96ca02df6d1cadf6b433fvanjeff#define EFI_TE_IMAGE_HEADER_SIGNATURE 0x5A56      ///< "VZ"
728a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
729a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
730a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang// Data directory indexes in our TE image header
731a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang//
732a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC  0
733a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG      1
734a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
735a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
7361bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
7371bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu/// Union of PE32, PE32+, and TE headers
7381bc5d0217a6e9e6086a14cc00c075b9003bd3f0aklu///
739a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef union {
740a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS32   Pe32;
741a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS64   Pe32Plus;
742a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_TE_IMAGE_HEADER      Te;
743a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER_UNION;
744a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
745a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshangtypedef union {
746a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS32            *Pe32;
747a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_NT_HEADERS64            *Pe32Plus;
748a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_TE_IMAGE_HEADER               *Te;
749a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang  EFI_IMAGE_OPTIONAL_HEADER_UNION   *Union;
750a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang} EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;
751a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang
752a7ed1e2ed5305d2b1e3ed2ccfe7f9d0cab564106yshang#endif
753