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