Path: blob/main/sys/contrib/edk2/Include/IndustryStandard/PeImage.h
96339 views
/** @file1EFI image format for PE32, PE32+ and TE. Please note some data structures are2different for PE32 and PE32+. EFI_IMAGE_NT_HEADERS32 is for PE32 and3EFI_IMAGE_NT_HEADERS64 is for PE32+.45This file is coded to the Visual Studio, Microsoft Portable Executable and6Common Object File Format Specification, Revision 9.3 - December 29, 2015.7This file also includes some definitions in PI Specification, Revision 1.0.89Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>10Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>11Portions Copyright (c) 2016 - 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>12Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>1314SPDX-License-Identifier: BSD-2-Clause-Patent1516**/1718#ifndef __PE_IMAGE_H__19#define __PE_IMAGE_H__2021//22// PE32+ Subsystem type for EFI images23//24#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION 1025#define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 1126#define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 1227#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13///< defined PI Specification, 1.02829//30// PE32+ Machine type for EFI images31//32#define IMAGE_FILE_MACHINE_I386 0x014c33#define IMAGE_FILE_MACHINE_IA64 0x020034#define IMAGE_FILE_MACHINE_EBC 0x0EBC35#define IMAGE_FILE_MACHINE_X64 0x866436#define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x01c237#define IMAGE_FILE_MACHINE_ARM64 0xAA6438#define IMAGE_FILE_MACHINE_RISCV32 0x503239#define IMAGE_FILE_MACHINE_RISCV64 0x506440#define IMAGE_FILE_MACHINE_RISCV128 0x512841#define IMAGE_FILE_MACHINE_LOONGARCH32 0x623242#define IMAGE_FILE_MACHINE_LOONGARCH64 0x62644344//45// EXE file formats46//47#define EFI_IMAGE_DOS_SIGNATURE SIGNATURE_16('M', 'Z')48#define EFI_IMAGE_OS2_SIGNATURE SIGNATURE_16('N', 'E')49#define EFI_IMAGE_OS2_SIGNATURE_LE SIGNATURE_16('L', 'E')50#define EFI_IMAGE_NT_SIGNATURE SIGNATURE_32('P', 'E', '\0', '\0')5152///53/// PE images can start with an optional DOS header, so if an image is run54/// under DOS it can print an error message.55///56typedef struct {57UINT16 e_magic; ///< Magic number.58UINT16 e_cblp; ///< Bytes on last page of file.59UINT16 e_cp; ///< Pages in file.60UINT16 e_crlc; ///< Relocations.61UINT16 e_cparhdr; ///< Size of header in paragraphs.62UINT16 e_minalloc; ///< Minimum extra paragraphs needed.63UINT16 e_maxalloc; ///< Maximum extra paragraphs needed.64UINT16 e_ss; ///< Initial (relative) SS value.65UINT16 e_sp; ///< Initial SP value.66UINT16 e_csum; ///< Checksum.67UINT16 e_ip; ///< Initial IP value.68UINT16 e_cs; ///< Initial (relative) CS value.69UINT16 e_lfarlc; ///< File address of relocation table.70UINT16 e_ovno; ///< Overlay number.71UINT16 e_res[4]; ///< Reserved words.72UINT16 e_oemid; ///< OEM identifier (for e_oeminfo).73UINT16 e_oeminfo; ///< OEM information; e_oemid specific.74UINT16 e_res2[10]; ///< Reserved words.75UINT32 e_lfanew; ///< File address of new exe header.76} EFI_IMAGE_DOS_HEADER;7778///79/// COFF File Header (Object and Image).80///81typedef struct {82UINT16 Machine;83UINT16 NumberOfSections;84UINT32 TimeDateStamp;85UINT32 PointerToSymbolTable;86UINT32 NumberOfSymbols;87UINT16 SizeOfOptionalHeader;88UINT16 Characteristics;89} EFI_IMAGE_FILE_HEADER;9091///92/// Size of EFI_IMAGE_FILE_HEADER.93///94#define EFI_IMAGE_SIZEOF_FILE_HEADER 209596//97// Characteristics98//99#define EFI_IMAGE_FILE_RELOCS_STRIPPED BIT0 ///< 0x0001 Relocation info stripped from file.100#define EFI_IMAGE_FILE_EXECUTABLE_IMAGE BIT1 ///< 0x0002 File is executable (i.e. no unresolved externel references).101#define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED BIT2 ///< 0x0004 Line numbers stripped from file.102#define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED BIT3 ///< 0x0008 Local symbols stripped from file.103#define EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE BIT5 ///< 0x0020 Supports addresses > 2-GB104#define EFI_IMAGE_FILE_BYTES_REVERSED_LO BIT7 ///< 0x0080 Bytes of machine word are reversed.105#define EFI_IMAGE_FILE_32BIT_MACHINE BIT8 ///< 0x0100 32 bit word machine.106#define EFI_IMAGE_FILE_DEBUG_STRIPPED BIT9 ///< 0x0200 Debugging info stripped from file in .DBG file.107#define EFI_IMAGE_FILE_SYSTEM BIT12 ///< 0x1000 System File.108#define EFI_IMAGE_FILE_DLL BIT13 ///< 0x2000 File is a DLL.109#define EFI_IMAGE_FILE_BYTES_REVERSED_HI BIT15 ///< 0x8000 Bytes of machine word are reversed.110111///112/// Header Data Directories.113///114typedef struct {115UINT32 VirtualAddress;116UINT32 Size;117} EFI_IMAGE_DATA_DIRECTORY;118119//120// Directory Entries121//122#define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT 0123#define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT 1124#define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE 2125#define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION 3126#define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY 4127#define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC 5128#define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG 6129#define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7130#define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8131#define EFI_IMAGE_DIRECTORY_ENTRY_TLS 9132#define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10133134#define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16135136///137/// @attention138/// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and139/// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary140/// after NT additional fields.141///142#define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b143144///145/// Optional Header Standard Fields for PE32.146///147typedef struct {148///149/// Standard fields.150///151UINT16 Magic;152UINT8 MajorLinkerVersion;153UINT8 MinorLinkerVersion;154UINT32 SizeOfCode;155UINT32 SizeOfInitializedData;156UINT32 SizeOfUninitializedData;157UINT32 AddressOfEntryPoint;158UINT32 BaseOfCode;159UINT32 BaseOfData; ///< PE32 contains this additional field, which is absent in PE32+.160///161/// Optional Header Windows-Specific Fields.162///163UINT32 ImageBase;164UINT32 SectionAlignment;165UINT32 FileAlignment;166UINT16 MajorOperatingSystemVersion;167UINT16 MinorOperatingSystemVersion;168UINT16 MajorImageVersion;169UINT16 MinorImageVersion;170UINT16 MajorSubsystemVersion;171UINT16 MinorSubsystemVersion;172UINT32 Win32VersionValue;173UINT32 SizeOfImage;174UINT32 SizeOfHeaders;175UINT32 CheckSum;176UINT16 Subsystem;177UINT16 DllCharacteristics;178UINT32 SizeOfStackReserve;179UINT32 SizeOfStackCommit;180UINT32 SizeOfHeapReserve;181UINT32 SizeOfHeapCommit;182UINT32 LoaderFlags;183UINT32 NumberOfRvaAndSizes;184EFI_IMAGE_DATA_DIRECTORY DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];185} EFI_IMAGE_OPTIONAL_HEADER32;186187///188/// @attention189/// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and190/// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary191/// after NT additional fields.192///193#define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b194195///196/// Optional Header Standard Fields for PE32+.197///198typedef struct {199///200/// Standard fields.201///202UINT16 Magic;203UINT8 MajorLinkerVersion;204UINT8 MinorLinkerVersion;205UINT32 SizeOfCode;206UINT32 SizeOfInitializedData;207UINT32 SizeOfUninitializedData;208UINT32 AddressOfEntryPoint;209UINT32 BaseOfCode;210///211/// Optional Header Windows-Specific Fields.212///213UINT64 ImageBase;214UINT32 SectionAlignment;215UINT32 FileAlignment;216UINT16 MajorOperatingSystemVersion;217UINT16 MinorOperatingSystemVersion;218UINT16 MajorImageVersion;219UINT16 MinorImageVersion;220UINT16 MajorSubsystemVersion;221UINT16 MinorSubsystemVersion;222UINT32 Win32VersionValue;223UINT32 SizeOfImage;224UINT32 SizeOfHeaders;225UINT32 CheckSum;226UINT16 Subsystem;227UINT16 DllCharacteristics;228UINT64 SizeOfStackReserve;229UINT64 SizeOfStackCommit;230UINT64 SizeOfHeapReserve;231UINT64 SizeOfHeapCommit;232UINT32 LoaderFlags;233UINT32 NumberOfRvaAndSizes;234EFI_IMAGE_DATA_DIRECTORY DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];235} EFI_IMAGE_OPTIONAL_HEADER64;236237///238/// @attention239/// EFI_IMAGE_NT_HEADERS32 is for use ONLY by tools.240///241typedef struct {242UINT32 Signature;243EFI_IMAGE_FILE_HEADER FileHeader;244EFI_IMAGE_OPTIONAL_HEADER32 OptionalHeader;245} EFI_IMAGE_NT_HEADERS32;246247#define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER sizeof (EFI_IMAGE_NT_HEADERS32)248249///250/// @attention251/// EFI_IMAGE_HEADERS64 is for use ONLY by tools.252///253typedef struct {254UINT32 Signature;255EFI_IMAGE_FILE_HEADER FileHeader;256EFI_IMAGE_OPTIONAL_HEADER64 OptionalHeader;257} EFI_IMAGE_NT_HEADERS64;258259#define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)260261//262// Other Windows Subsystem Values263//264#define EFI_IMAGE_SUBSYSTEM_UNKNOWN 0265#define EFI_IMAGE_SUBSYSTEM_NATIVE 1266#define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI 2267#define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI 3268#define EFI_IMAGE_SUBSYSTEM_OS2_CUI 5269#define EFI_IMAGE_SUBSYSTEM_POSIX_CUI 7270271//272// DLL Characteristics273//274#define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020275#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040276#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080277#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100278#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200279#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400280#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800281#define IMAGE_DLLCHARACTERISTICS_APPCONTAINER 0x1000282#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000283#define IMAGE_DLLCHARACTERISTICS_GUARD_CF 0x4000284#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000285286///287/// Length of ShortName.288///289#define EFI_IMAGE_SIZEOF_SHORT_NAME 8290291///292/// Section Table. This table immediately follows the optional header.293///294typedef struct {295UINT8 Name[EFI_IMAGE_SIZEOF_SHORT_NAME];296union {297UINT32 PhysicalAddress;298UINT32 VirtualSize;299} Misc;300UINT32 VirtualAddress;301UINT32 SizeOfRawData;302UINT32 PointerToRawData;303UINT32 PointerToRelocations;304UINT32 PointerToLinenumbers;305UINT16 NumberOfRelocations;306UINT16 NumberOfLinenumbers;307UINT32 Characteristics;308} EFI_IMAGE_SECTION_HEADER;309310///311/// Size of EFI_IMAGE_SECTION_HEADER.312///313#define EFI_IMAGE_SIZEOF_SECTION_HEADER 40314315//316// Section Flags Values317//318#define EFI_IMAGE_SCN_TYPE_NO_PAD BIT3 ///< 0x00000008 ///< Reserved.319#define EFI_IMAGE_SCN_CNT_CODE BIT5 ///< 0x00000020320#define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA BIT6 ///< 0x00000040321#define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA BIT7 ///< 0x00000080322323#define EFI_IMAGE_SCN_LNK_OTHER BIT8 ///< 0x00000100 ///< Reserved.324#define EFI_IMAGE_SCN_LNK_INFO BIT9 ///< 0x00000200 ///< Section contains comments or some other type of information.325#define EFI_IMAGE_SCN_LNK_REMOVE BIT11 ///< 0x00000800 ///< Section contents will not become part of image.326#define EFI_IMAGE_SCN_LNK_COMDAT BIT12 ///< 0x00001000327328#define EFI_IMAGE_SCN_ALIGN_1BYTES BIT20 ///< 0x00100000329#define EFI_IMAGE_SCN_ALIGN_2BYTES BIT21 ///< 0x00200000330#define EFI_IMAGE_SCN_ALIGN_4BYTES (BIT20|BIT21) ///< 0x00300000331#define EFI_IMAGE_SCN_ALIGN_8BYTES BIT22 ///< 0x00400000332#define EFI_IMAGE_SCN_ALIGN_16BYTES (BIT20|BIT22) ///< 0x00500000333#define EFI_IMAGE_SCN_ALIGN_32BYTES (BIT21|BIT22) ///< 0x00600000334#define EFI_IMAGE_SCN_ALIGN_64BYTES (BIT20|BIT21|BIT22) ///< 0x00700000335336#define EFI_IMAGE_SCN_MEM_DISCARDABLE BIT25 ///< 0x02000000337#define EFI_IMAGE_SCN_MEM_NOT_CACHED BIT26 ///< 0x04000000338#define EFI_IMAGE_SCN_MEM_NOT_PAGED BIT27 ///< 0x08000000339#define EFI_IMAGE_SCN_MEM_SHARED BIT28 ///< 0x10000000340#define EFI_IMAGE_SCN_MEM_EXECUTE BIT29 ///< 0x20000000341#define EFI_IMAGE_SCN_MEM_READ BIT30 ///< 0x40000000342#define EFI_IMAGE_SCN_MEM_WRITE BIT31 ///< 0x80000000343344///345/// Size of a Symbol Table Record.346///347#define EFI_IMAGE_SIZEOF_SYMBOL 18348349//350// Symbols have a section number of the section in which they are351// defined. Otherwise, section numbers have the following meanings:352//353#define EFI_IMAGE_SYM_UNDEFINED (UINT16) 0 ///< Symbol is undefined or is common.354#define EFI_IMAGE_SYM_ABSOLUTE (UINT16) -1 ///< Symbol is an absolute value.355#define EFI_IMAGE_SYM_DEBUG (UINT16) -2 ///< Symbol is a special debug item.356357//358// Symbol Type (fundamental) values.359//360#define EFI_IMAGE_SYM_TYPE_NULL 0 ///< no type.361#define EFI_IMAGE_SYM_TYPE_VOID 1 ///< no valid type.362#define EFI_IMAGE_SYM_TYPE_CHAR 2 ///< type character.363#define EFI_IMAGE_SYM_TYPE_SHORT 3 ///< type short integer.364#define EFI_IMAGE_SYM_TYPE_INT 4365#define EFI_IMAGE_SYM_TYPE_LONG 5366#define EFI_IMAGE_SYM_TYPE_FLOAT 6367#define EFI_IMAGE_SYM_TYPE_DOUBLE 7368#define EFI_IMAGE_SYM_TYPE_STRUCT 8369#define EFI_IMAGE_SYM_TYPE_UNION 9370#define EFI_IMAGE_SYM_TYPE_ENUM 10 ///< enumeration.371#define EFI_IMAGE_SYM_TYPE_MOE 11 ///< member of enumeration.372#define EFI_IMAGE_SYM_TYPE_BYTE 12373#define EFI_IMAGE_SYM_TYPE_WORD 13374#define EFI_IMAGE_SYM_TYPE_UINT 14375#define EFI_IMAGE_SYM_TYPE_DWORD 15376377//378// Symbol Type (derived) values.379//380#define EFI_IMAGE_SYM_DTYPE_NULL 0 ///< no derived type.381#define EFI_IMAGE_SYM_DTYPE_POINTER 1382#define EFI_IMAGE_SYM_DTYPE_FUNCTION 2383#define EFI_IMAGE_SYM_DTYPE_ARRAY 3384385//386// Storage classes.387//388#define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION ((UINT8) -1)389#define EFI_IMAGE_SYM_CLASS_NULL 0390#define EFI_IMAGE_SYM_CLASS_AUTOMATIC 1391#define EFI_IMAGE_SYM_CLASS_EXTERNAL 2392#define EFI_IMAGE_SYM_CLASS_STATIC 3393#define EFI_IMAGE_SYM_CLASS_REGISTER 4394#define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF 5395#define EFI_IMAGE_SYM_CLASS_LABEL 6396#define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL 7397#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8398#define EFI_IMAGE_SYM_CLASS_ARGUMENT 9399#define EFI_IMAGE_SYM_CLASS_STRUCT_TAG 10400#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION 11401#define EFI_IMAGE_SYM_CLASS_UNION_TAG 12402#define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION 13403#define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC 14404#define EFI_IMAGE_SYM_CLASS_ENUM_TAG 15405#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16406#define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM 17407#define EFI_IMAGE_SYM_CLASS_BIT_FIELD 18408#define EFI_IMAGE_SYM_CLASS_BLOCK 100409#define EFI_IMAGE_SYM_CLASS_FUNCTION 101410#define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT 102411#define EFI_IMAGE_SYM_CLASS_FILE 103412#define EFI_IMAGE_SYM_CLASS_SECTION 104413#define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL 105414415//416// type packing constants417//418#define EFI_IMAGE_N_BTMASK 017419#define EFI_IMAGE_N_TMASK 060420#define EFI_IMAGE_N_TMASK1 0300421#define EFI_IMAGE_N_TMASK2 0360422#define EFI_IMAGE_N_BTSHFT 4423#define EFI_IMAGE_N_TSHIFT 2424425//426// Communal selection types.427//428#define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES 1429#define EFI_IMAGE_COMDAT_SELECT_ANY 2430#define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE 3431#define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH 4432#define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE 5433434//435// the following values only be referred in PeCoff, not defined in PECOFF.436//437#define EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1438#define EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2439#define EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3440441///442/// Relocation format.443///444typedef struct {445UINT32 VirtualAddress;446UINT32 SymbolTableIndex;447UINT16 Type;448} EFI_IMAGE_RELOCATION;449450///451/// Size of EFI_IMAGE_RELOCATION452///453#define EFI_IMAGE_SIZEOF_RELOCATION 10454455//456// I386 relocation types.457//458#define EFI_IMAGE_REL_I386_ABSOLUTE 0x0000 ///< Reference is absolute, no relocation is necessary.459#define EFI_IMAGE_REL_I386_DIR16 0x0001 ///< Direct 16-bit reference to the symbols virtual address.460#define EFI_IMAGE_REL_I386_REL16 0x0002 ///< PC-relative 16-bit reference to the symbols virtual address.461#define EFI_IMAGE_REL_I386_DIR32 0x0006 ///< Direct 32-bit reference to the symbols virtual address.462#define EFI_IMAGE_REL_I386_DIR32NB 0x0007 ///< Direct 32-bit reference to the symbols virtual address, base not included.463#define EFI_IMAGE_REL_I386_SEG12 0x0009 ///< Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address.464#define EFI_IMAGE_REL_I386_SECTION 0x000A465#define EFI_IMAGE_REL_I386_SECREL 0x000B466#define EFI_IMAGE_REL_I386_REL32 0x0014 ///< PC-relative 32-bit reference to the symbols virtual address.467468//469// x64 processor relocation types.470//471#define IMAGE_REL_AMD64_ABSOLUTE 0x0000472#define IMAGE_REL_AMD64_ADDR64 0x0001473#define IMAGE_REL_AMD64_ADDR32 0x0002474#define IMAGE_REL_AMD64_ADDR32NB 0x0003475#define IMAGE_REL_AMD64_REL32 0x0004476#define IMAGE_REL_AMD64_REL32_1 0x0005477#define IMAGE_REL_AMD64_REL32_2 0x0006478#define IMAGE_REL_AMD64_REL32_3 0x0007479#define IMAGE_REL_AMD64_REL32_4 0x0008480#define IMAGE_REL_AMD64_REL32_5 0x0009481#define IMAGE_REL_AMD64_SECTION 0x000A482#define IMAGE_REL_AMD64_SECREL 0x000B483#define IMAGE_REL_AMD64_SECREL7 0x000C484#define IMAGE_REL_AMD64_TOKEN 0x000D485#define IMAGE_REL_AMD64_SREL32 0x000E486#define IMAGE_REL_AMD64_PAIR 0x000F487#define IMAGE_REL_AMD64_SSPAN32 0x0010488489///490/// Based relocation format.491///492typedef struct {493UINT32 VirtualAddress;494UINT32 SizeOfBlock;495} EFI_IMAGE_BASE_RELOCATION;496497///498/// Size of EFI_IMAGE_BASE_RELOCATION.499///500#define EFI_IMAGE_SIZEOF_BASE_RELOCATION 8501502//503// Based relocation types.504//505#define EFI_IMAGE_REL_BASED_ABSOLUTE 0506#define EFI_IMAGE_REL_BASED_HIGH 1507#define EFI_IMAGE_REL_BASED_LOW 2508#define EFI_IMAGE_REL_BASED_HIGHLOW 3509#define EFI_IMAGE_REL_BASED_HIGHADJ 4510#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR 5511#define EFI_IMAGE_REL_BASED_ARM_MOV32A 5512#define EFI_IMAGE_REL_BASED_ARM_MOV32T 7513#define EFI_IMAGE_REL_BASED_IA64_IMM64 9514#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR16 9515#define EFI_IMAGE_REL_BASED_DIR64 10516517///518/// Relocation types of RISC-V processor.519///520#define EFI_IMAGE_REL_BASED_RISCV_HI20 5521#define EFI_IMAGE_REL_BASED_RISCV_LOW12I 7522#define EFI_IMAGE_REL_BASED_RISCV_LOW12S 8523524//525// Relocation types of LoongArch processor.526//527#define EFI_IMAGE_REL_BASED_LOONGARCH32_MARK_LA 8528#define EFI_IMAGE_REL_BASED_LOONGARCH64_MARK_LA 8529530///531/// Line number format.532///533typedef struct {534union {535UINT32 SymbolTableIndex; ///< Symbol table index of function name if Linenumber is 0.536UINT32 VirtualAddress; ///< Virtual address of line number.537} Type;538UINT16 Linenumber; ///< Line number.539} EFI_IMAGE_LINENUMBER;540541///542/// Size of EFI_IMAGE_LINENUMBER.543///544#define EFI_IMAGE_SIZEOF_LINENUMBER 6545546//547// Archive format.548//549#define EFI_IMAGE_ARCHIVE_START_SIZE 8550#define EFI_IMAGE_ARCHIVE_START "!<arch>\n"551#define EFI_IMAGE_ARCHIVE_END "`\n"552#define EFI_IMAGE_ARCHIVE_PAD "\n"553#define EFI_IMAGE_ARCHIVE_LINKER_MEMBER "/ "554#define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "555556///557/// Archive Member Headers558///559typedef struct {560UINT8 Name[16]; ///< File member name - `/' terminated.561UINT8 Date[12]; ///< File member date - decimal.562UINT8 UserID[6]; ///< File member user id - decimal.563UINT8 GroupID[6]; ///< File member group id - decimal.564UINT8 Mode[8]; ///< File member mode - octal.565UINT8 Size[10]; ///< File member size - decimal.566UINT8 EndHeader[2]; ///< String to end header. (0x60 0x0A).567} EFI_IMAGE_ARCHIVE_MEMBER_HEADER;568569///570/// Size of EFI_IMAGE_ARCHIVE_MEMBER_HEADER.571///572#define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60573574//575// DLL Support576//577578///579/// Export Directory Table.580///581typedef struct {582UINT32 Characteristics;583UINT32 TimeDateStamp;584UINT16 MajorVersion;585UINT16 MinorVersion;586UINT32 Name;587UINT32 Base;588UINT32 NumberOfFunctions;589UINT32 NumberOfNames;590UINT32 AddressOfFunctions;591UINT32 AddressOfNames;592UINT32 AddressOfNameOrdinals;593} EFI_IMAGE_EXPORT_DIRECTORY;594595//596// Based export types.597//598#define EFI_IMAGE_EXPORT_ORDINAL_BASE 1599#define EFI_IMAGE_EXPORT_ADDR_SIZE 4600#define EFI_IMAGE_EXPORT_ORDINAL_SIZE 2601602///603/// Hint/Name Table.604///605typedef struct {606UINT16 Hint;607UINT8 Name[1];608} EFI_IMAGE_IMPORT_BY_NAME;609610///611/// Import Address Table RVA (Thunk Table).612///613typedef struct {614union {615UINT32 Function;616UINT32 Ordinal;617EFI_IMAGE_IMPORT_BY_NAME *AddressOfData;618} u1;619} EFI_IMAGE_THUNK_DATA;620621#define EFI_IMAGE_ORDINAL_FLAG BIT31 ///< Flag for PE32.622#define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0)623#define EFI_IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)624625///626/// Import Directory Table627///628typedef struct {629UINT32 Characteristics;630UINT32 TimeDateStamp;631UINT32 ForwarderChain;632UINT32 Name;633EFI_IMAGE_THUNK_DATA *FirstThunk;634} EFI_IMAGE_IMPORT_DESCRIPTOR;635636///637/// Debug Directory Format.638///639typedef struct {640UINT32 Characteristics;641UINT32 TimeDateStamp;642UINT16 MajorVersion;643UINT16 MinorVersion;644UINT32 Type;645UINT32 SizeOfData;646UINT32 RVA; ///< The address of the debug data when loaded, relative to the image base.647UINT32 FileOffset; ///< The file pointer to the debug data.648} EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;649650#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2 ///< The Visual C++ debug information.651#define EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20652653///654/// Debug Data Structure defined in Microsoft C++.655///656#define CODEVIEW_SIGNATURE_NB10 SIGNATURE_32('N', 'B', '1', '0')657typedef struct {658UINT32 Signature; ///< "NB10"659UINT32 Unknown;660UINT32 Unknown2;661UINT32 Unknown3;662//663// Filename of .PDB goes here664//665} EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;666667///668/// Debug Data Structure defined in Microsoft C++.669///670#define CODEVIEW_SIGNATURE_RSDS SIGNATURE_32('R', 'S', 'D', 'S')671typedef struct {672UINT32 Signature; ///< "RSDS".673UINT32 Unknown;674UINT32 Unknown2;675UINT32 Unknown3;676UINT32 Unknown4;677UINT32 Unknown5;678//679// Filename of .PDB goes here680//681} EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;682683///684/// Debug Data Structure defined by Apple Mach-O to Coff utility.685///686#define CODEVIEW_SIGNATURE_MTOC SIGNATURE_32('M', 'T', 'O', 'C')687typedef struct {688UINT32 Signature; ///< "MTOC".689GUID MachOUuid;690//691// Filename of .DLL (Mach-O with debug info) goes here692//693} EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY;694695//696// .pdata entries for X64697//698typedef struct {699UINT32 FunctionStartAddress;700UINT32 FunctionEndAddress;701UINT32 UnwindInfoAddress;702} RUNTIME_FUNCTION;703704typedef struct {705UINT8 Version : 3;706UINT8 Flags : 5;707UINT8 SizeOfProlog;708UINT8 CountOfUnwindCodes;709UINT8 FrameRegister : 4;710UINT8 FrameRegisterOffset : 4;711} UNWIND_INFO;712713///714/// Extended DLL Characteristics715///716#define EFI_IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001717#define EFI_IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040718719typedef struct {720UINT32 DllCharacteristicsEx;721} EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY;722723///724/// Resource format.725///726typedef struct {727UINT32 Characteristics;728UINT32 TimeDateStamp;729UINT16 MajorVersion;730UINT16 MinorVersion;731UINT16 NumberOfNamedEntries;732UINT16 NumberOfIdEntries;733//734// Array of EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY entries goes here.735//736} EFI_IMAGE_RESOURCE_DIRECTORY;737738///739/// Resource directory entry format.740///741typedef struct {742union {743struct {744UINT32 NameOffset : 31;745UINT32 NameIsString : 1;746} s;747UINT32 Id;748} u1;749union {750UINT32 OffsetToData;751struct {752UINT32 OffsetToDirectory : 31;753UINT32 DataIsDirectory : 1;754} s;755} u2;756} EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY;757758///759/// Resource directory entry for string.760///761typedef struct {762UINT16 Length;763CHAR16 String[1];764} EFI_IMAGE_RESOURCE_DIRECTORY_STRING;765766///767/// Resource directory entry for data array.768///769typedef struct {770UINT32 OffsetToData;771UINT32 Size;772UINT32 CodePage;773UINT32 Reserved;774} EFI_IMAGE_RESOURCE_DATA_ENTRY;775776///777/// Header format for TE images, defined in the PI Specification, 1.0.778///779typedef struct {780UINT16 Signature; ///< The signature for TE format = "VZ".781UINT16 Machine; ///< From the original file header.782UINT8 NumberOfSections; ///< From the original file header.783UINT8 Subsystem; ///< From original optional header.784UINT16 StrippedSize; ///< Number of bytes we removed from the header.785UINT32 AddressOfEntryPoint; ///< Offset to entry point -- from original optional header.786UINT32 BaseOfCode; ///< From original image -- required for ITP debug.787UINT64 ImageBase; ///< From original file header.788EFI_IMAGE_DATA_DIRECTORY DataDirectory[2]; ///< Only base relocation and debug directory.789} EFI_TE_IMAGE_HEADER;790791#define EFI_TE_IMAGE_HEADER_SIGNATURE SIGNATURE_16('V', 'Z')792793//794// Data directory indexes in our TE image header795//796#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC 0797#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG 1798799///800/// Union of PE32, PE32+, and TE headers.801///802typedef union {803EFI_IMAGE_NT_HEADERS32 Pe32;804EFI_IMAGE_NT_HEADERS64 Pe32Plus;805EFI_TE_IMAGE_HEADER Te;806} EFI_IMAGE_OPTIONAL_HEADER_UNION;807808typedef union {809EFI_IMAGE_NT_HEADERS32 *Pe32;810EFI_IMAGE_NT_HEADERS64 *Pe32Plus;811EFI_TE_IMAGE_HEADER *Te;812EFI_IMAGE_OPTIONAL_HEADER_UNION *Union;813} EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;814815#endif816817818