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