PeImage.h

Go to the documentation of this file.
00001 /** @file
00002   EFI image format for PE32, PE32+ and TE. Please note some data structures are
00003   different for PE32 and PE32+. EFI_IMAGE_NT_HEADERS32 is for PE32 and
00004   EFI_IMAGE_NT_HEADERS64 is for PE32+.
00005 
00006   This file is coded to the Visual Studio, Microsoft Portable Executable and
00007   Common Object File Format Specification, Revision 8.0 - May 16, 2006.
00008   This file also includes some definitions in PI Specification, Revision 1.0.
00009 
00010   Copyright (c) 2006 - 2008, Intel Corporation
00011   All rights reserved. This program and the accompanying materials
00012   are licensed and made available under the terms and conditions of the BSD License
00013   which accompanies this distribution.  The full text of the license may be found at
00014   http://opensource.org/licenses/bsd-license.php
00015 
00016   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
00017   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
00018 
00019 **/
00020 
00021 #ifndef __PE_IMAGE_H__
00022 #define __PE_IMAGE_H__
00023 
00024 ///
00025 /// PE32+ Subsystem type for EFI images
00026 ///
00027 #define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION         10
00028 #define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
00029 #define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER      12
00030 #define EFI_IMAGE_SUBSYSTEM_EFI_EFI_ROM             13
00031 
00032 #define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER      13 ///< defined PI Specification, 1.0
00033 
00034 
00035 ///
00036 /// PE32+ Machine type for EFI images
00037 ///
00038 #define IMAGE_FILE_MACHINE_I386     0x014c
00039 #define IMAGE_FILE_MACHINE_IA64     0x0200
00040 #define IMAGE_FILE_MACHINE_EBC      0x0EBC
00041 #define IMAGE_FILE_MACHINE_X64      0x8664
00042 //
00043 // Support old names for backward compatible
00044 //
00045 #define EFI_IMAGE_MACHINE_IA32      IMAGE_FILE_MACHINE_I386
00046 #define EFI_IMAGE_MACHINE_IA64      IMAGE_FILE_MACHINE_IA64
00047 #define EFI_IMAGE_MACHINE_IPF       IMAGE_FILE_MACHINE_IA64
00048 #define EFI_IMAGE_MACHINE_EBC       IMAGE_FILE_MACHINE_EBC
00049 #define EFI_IMAGE_MACHINE_X64       IMAGE_FILE_MACHINE_X64
00050 
00051 ///
00052 /// EXE file formats
00053 ///
00054 #define EFI_IMAGE_DOS_SIGNATURE     SIGNATURE_16('M', 'Z')
00055 #define EFI_IMAGE_OS2_SIGNATURE     SIGNATURE_16('N', 'E')
00056 #define EFI_IMAGE_OS2_SIGNATURE_LE  SIGNATURE_16('L', 'E')
00057 #define EFI_IMAGE_NT_SIGNATURE      SIGNATURE_32('P', 'E', '\0', '\0')
00058 
00059 ///
00060 /// PE images can start with an optional DOS header, so if an image is run
00061 /// under DOS it can print an error message.
00062 ///
00063 typedef struct {
00064   UINT16  e_magic;    ///< Magic number
00065   UINT16  e_cblp;     ///< Bytes on last page of file
00066   UINT16  e_cp;       ///< Pages in file
00067   UINT16  e_crlc;     ///< Relocations
00068   UINT16  e_cparhdr;  ///< Size of header in paragraphs
00069   UINT16  e_minalloc; ///< Minimum extra paragraphs needed
00070   UINT16  e_maxalloc; ///< Maximum extra paragraphs needed
00071   UINT16  e_ss;       ///< Initial (relative) SS value
00072   UINT16  e_sp;       ///< Initial SP value
00073   UINT16  e_csum;     ///< Checksum
00074   UINT16  e_ip;       ///< Initial IP value
00075   UINT16  e_cs;       ///< Initial (relative) CS value
00076   UINT16  e_lfarlc;   ///< File address of relocation table
00077   UINT16  e_ovno;     ///< Overlay number
00078   UINT16  e_res[4];   ///< Reserved words
00079   UINT16  e_oemid;    ///< OEM identifier (for e_oeminfo)
00080   UINT16  e_oeminfo;  ///< OEM information; e_oemid specific
00081   UINT16  e_res2[10]; ///< Reserved words
00082   UINT32  e_lfanew;   ///< File address of new exe header
00083 } EFI_IMAGE_DOS_HEADER;
00084 
00085 ///
00086 /// COFF File Header (Object and Image)
00087 ///
00088 typedef struct {
00089   UINT16  Machine;
00090   UINT16  NumberOfSections;
00091   UINT32  TimeDateStamp;
00092   UINT32  PointerToSymbolTable;
00093   UINT32  NumberOfSymbols;
00094   UINT16  SizeOfOptionalHeader;
00095   UINT16  Characteristics;
00096 } EFI_IMAGE_FILE_HEADER;
00097 
00098 ///
00099 /// Size of EFI_IMAGE_FILE_HEADER
00100 ///
00101 #define EFI_IMAGE_SIZEOF_FILE_HEADER        20
00102 
00103 ///
00104 /// Characteristics
00105 ///
00106 #define EFI_IMAGE_FILE_RELOCS_STRIPPED      BIT0     ///< 0x0001  Relocation info stripped from file.
00107 #define EFI_IMAGE_FILE_EXECUTABLE_IMAGE     BIT1     ///< 0x0002  File is executable  (i.e. no unresolved externel references).
00108 #define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED   BIT2     ///< 0x0004  Line nunbers stripped from file.
00109 #define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED  BIT3     ///< 0x0008  Local symbols stripped from file.
00110 #define EFI_IMAGE_FILE_BYTES_REVERSED_LO    BIT7     ///< 0x0080  Bytes of machine word are reversed.
00111 #define EFI_IMAGE_FILE_32BIT_MACHINE        BIT8     ///< 0x0100  32 bit word machine.
00112 #define EFI_IMAGE_FILE_DEBUG_STRIPPED       BIT9     ///< 0x0200  Debugging info stripped from file in .DBG file
00113 #define EFI_IMAGE_FILE_SYSTEM               BIT12    ///< 0x1000  System File.
00114 #define EFI_IMAGE_FILE_DLL                  BIT13    ///< 0x2000  File is a DLL.
00115 #define EFI_IMAGE_FILE_BYTES_REVERSED_HI    BIT15    ///< 0x8000  Bytes of machine word are reversed.
00116 
00117 ///
00118 /// Other Machine Types
00119 ///
00120 #define EFI_IMAGE_FILE_MACHINE_UNKNOWN      0       ///< Any machine type
00121 #define EFI_IMAGE_FILE_MACHINE_I386         0x14c   ///< Intel 386.
00122 #define EFI_IMAGE_FILE_MACHINE_R3000        0x162   ///< MIPS* little-endian, 0540 big-endian
00123 #define EFI_IMAGE_FILE_MACHINE_R4000        0x166   ///< MIPS* little-endian
00124 #define EFI_IMAGE_FILE_MACHINE_POWERPC      0x1F0   ///< IBM* PowerPC Little-Endian
00125 //
00126 // * Other names and brands may be claimed as the property of others.
00127 //
00128 
00129 ///
00130 /// Header Data Directories
00131 ///
00132 typedef struct {
00133   UINT32  VirtualAddress;
00134   UINT32  Size;
00135 } EFI_IMAGE_DATA_DIRECTORY;
00136 
00137 #define EFI_IMAGE_ROM_OPTIONAL_HDR_MAGIC      0x107
00138 
00139 ///
00140 /// Directory Entries
00141 ///
00142 #define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT      0
00143 #define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT      1
00144 #define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE    2
00145 #define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION   3
00146 #define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY    4
00147 #define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC   5
00148 #define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG       6
00149 #define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT   7
00150 #define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR   8
00151 #define EFI_IMAGE_DIRECTORY_ENTRY_TLS         9
00152 #define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
00153 
00154 #define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16
00155 
00156 ///
00157 /// @attention
00158 /// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and
00159 /// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary
00160 /// after NT additional fields.
00161 ///
00162 #define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
00163 
00164 typedef struct {
00165   ///
00166   /// Standard fields.
00167   ///
00168   UINT16                    Magic;
00169   UINT8                     MajorLinkerVersion;
00170   UINT8                     MinorLinkerVersion;
00171   UINT32                    SizeOfCode;
00172   UINT32                    SizeOfInitializedData;
00173   UINT32                    SizeOfUninitializedData;
00174   UINT32                    AddressOfEntryPoint;
00175   UINT32                    BaseOfCode;
00176   UINT32                    BaseOfData;  ///< PE32 contains this additional field, which is absent in PE32+
00177   ///
00178   /// NT additional fields.
00179   ///
00180   UINT32                    ImageBase;
00181   UINT32                    SectionAlignment;
00182   UINT32                    FileAlignment;
00183   UINT16                    MajorOperatingSystemVersion;
00184   UINT16                    MinorOperatingSystemVersion;
00185   UINT16                    MajorImageVersion;
00186   UINT16                    MinorImageVersion;
00187   UINT16                    MajorSubsystemVersion;
00188   UINT16                    MinorSubsystemVersion;
00189   UINT32                    Win32VersionValue;
00190   UINT32                    SizeOfImage;
00191   UINT32                    SizeOfHeaders;
00192   UINT32                    CheckSum;
00193   UINT16                    Subsystem;
00194   UINT16                    DllCharacteristics;
00195   UINT32                    SizeOfStackReserve;
00196   UINT32                    SizeOfStackCommit;
00197   UINT32                    SizeOfHeapReserve;
00198   UINT32                    SizeOfHeapCommit;
00199   UINT32                    LoaderFlags;
00200   UINT32                    NumberOfRvaAndSizes;
00201   EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
00202 } EFI_IMAGE_OPTIONAL_HEADER32;
00203 
00204 ///
00205 /// @attention
00206 /// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and
00207 /// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary
00208 /// after NT additional fields.
00209 ///
00210 #define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
00211 
00212 typedef struct {
00213   //
00214   // Standard fields.
00215   //
00216   UINT16                    Magic;
00217   UINT8                     MajorLinkerVersion;
00218   UINT8                     MinorLinkerVersion;
00219   UINT32                    SizeOfCode;
00220   UINT32                    SizeOfInitializedData;
00221   UINT32                    SizeOfUninitializedData;
00222   UINT32                    AddressOfEntryPoint;
00223   UINT32                    BaseOfCode;
00224   //
00225   // NT additional fields.
00226   //
00227   UINT64                    ImageBase;
00228   UINT32                    SectionAlignment;
00229   UINT32                    FileAlignment;
00230   UINT16                    MajorOperatingSystemVersion;
00231   UINT16                    MinorOperatingSystemVersion;
00232   UINT16                    MajorImageVersion;
00233   UINT16                    MinorImageVersion;
00234   UINT16                    MajorSubsystemVersion;
00235   UINT16                    MinorSubsystemVersion;
00236   UINT32                    Win32VersionValue;
00237   UINT32                    SizeOfImage;
00238   UINT32                    SizeOfHeaders;
00239   UINT32                    CheckSum;
00240   UINT16                    Subsystem;
00241   UINT16                    DllCharacteristics;
00242   UINT64                    SizeOfStackReserve;
00243   UINT64                    SizeOfStackCommit;
00244   UINT64                    SizeOfHeapReserve;
00245   UINT64                    SizeOfHeapCommit;
00246   UINT32                    LoaderFlags;
00247   UINT32                    NumberOfRvaAndSizes;
00248   EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
00249 } EFI_IMAGE_OPTIONAL_HEADER64;
00250 
00251 
00252 ///
00253 /// @attention
00254 /// EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY
00255 /// by tools.  All proper EFI code MUST use EFI_IMAGE_NT_HEADERS ONLY!!!
00256 ///
00257 typedef struct {
00258   UINT32                      Signature;
00259   EFI_IMAGE_FILE_HEADER       FileHeader;
00260   EFI_IMAGE_OPTIONAL_HEADER32 OptionalHeader;
00261 } EFI_IMAGE_NT_HEADERS32;
00262 
00263 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER sizeof (EFI_IMAGE_NT_HEADERS32)
00264 
00265 typedef struct {
00266   UINT32                      Signature;
00267   EFI_IMAGE_FILE_HEADER       FileHeader;
00268   EFI_IMAGE_OPTIONAL_HEADER64 OptionalHeader;
00269 } EFI_IMAGE_NT_HEADERS64;
00270 
00271 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)
00272 
00273 
00274 ///
00275 /// Processor specific definition of EFI_IMAGE_OPTIONAL_HEADER so the
00276 /// type name EFI_IMAGE_OPTIONAL_HEADER is appropriate to the build.  Same for
00277 /// EFI_IMAGE_NT_HEADERS.  These definitions MUST be used by ALL EFI code.
00278 ///
00279 #if   defined (MDE_CPU_IA32)
00280 
00281 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
00282   (((Machine) == EFI_IMAGE_MACHINE_IA32) || ((Machine) == EFI_IMAGE_MACHINE_EBC))
00283 
00284 #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_X64)
00285 
00286 typedef EFI_IMAGE_NT_HEADERS32    EFI_IMAGE_NT_HEADERS;
00287 
00288 #elif defined (MDE_CPU_IPF)
00289 
00290 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
00291   (((Machine) == EFI_IMAGE_MACHINE_IPF) || ((Machine) == EFI_IMAGE_MACHINE_EBC))
00292 
00293 #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE)
00294 
00295 typedef EFI_IMAGE_NT_HEADERS64    EFI_IMAGE_NT_HEADERS;
00296 
00297 #elif defined (MDE_CPU_X64)
00298 
00299 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
00300   (((Machine) == EFI_IMAGE_MACHINE_X64) || ((Machine) == EFI_IMAGE_MACHINE_EBC))
00301 
00302 #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_IA32)
00303 
00304 typedef EFI_IMAGE_NT_HEADERS64    EFI_IMAGE_NT_HEADERS;
00305 
00306 #elif defined (MDE_CPU_EBC)
00307 
00308 ///
00309 /// This is just to make sure you can cross compile with the EBC compiiler.
00310 /// It does not make sense to have a PE loader coded in EBC. You need to
00311 /// understand the basic
00312 ///
00313 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_EBC)
00314 
00315 #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE)
00316 
00317 typedef EFI_IMAGE_NT_HEADERS64    EFI_IMAGE_NT_HEADERS;
00318 
00319 #else
00320 #error Unknown Processor Type
00321 #endif
00322 
00323 
00324 #define EFI_IMAGE_FIRST_SECTION(ntheader) \
00325     ( \
00326       (EFI_IMAGE_SECTION_HEADER *) \
00327         ( \
00328           (UINT32) ntheader + \
00329           FIELD_OFFSET (EFI_IMAGE_NT_HEADERS, OptionalHeader) + \
00330           ((EFI_IMAGE_NT_HEADERS *) (ntheader))->FileHeader.SizeOfOptionalHeader \
00331         ) \
00332     )
00333 
00334 ///
00335 /// Other Windows Subsystem Values
00336 ///
00337 #define EFI_IMAGE_SUBSYSTEM_UNKNOWN     0
00338 #define EFI_IMAGE_SUBSYSTEM_NATIVE      1
00339 #define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI 2
00340 #define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI 3
00341 #define EFI_IMAGE_SUBSYSTEM_OS2_CUI     5
00342 #define EFI_IMAGE_SUBSYSTEM_POSIX_CUI   7
00343 
00344 ///
00345 /// Section header format.
00346 ///
00347 #define EFI_IMAGE_SIZEOF_SHORT_NAME 8
00348 
00349 typedef struct {
00350   UINT8 Name[EFI_IMAGE_SIZEOF_SHORT_NAME];
00351   union {
00352     UINT32  PhysicalAddress;
00353     UINT32  VirtualSize;
00354   } Misc;
00355   UINT32  VirtualAddress;
00356   UINT32  SizeOfRawData;
00357   UINT32  PointerToRawData;
00358   UINT32  PointerToRelocations;
00359   UINT32  PointerToLinenumbers;
00360   UINT16  NumberOfRelocations;
00361   UINT16  NumberOfLinenumbers;
00362   UINT32  Characteristics;
00363 } EFI_IMAGE_SECTION_HEADER;
00364 
00365 ///
00366 /// Size of EFI_IMAGE_SECTION_HEADER
00367 ///
00368 #define EFI_IMAGE_SIZEOF_SECTION_HEADER       40
00369 
00370 ///
00371 /// Section Flags Values
00372 ///
00373 #define EFI_IMAGE_SCN_TYPE_NO_PAD                  BIT3   ///< 0x00000008  ///< Reserved.
00374 #define EFI_IMAGE_SCN_CNT_CODE                     BIT5   ///< 0x00000020
00375 #define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA         BIT6   ///< 0x00000040
00376 #define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA       BIT7   ///< 0x00000080
00377 
00378 #define EFI_IMAGE_SCN_LNK_OTHER                    BIT8   ///< 0x00000100  ///< Reserved.
00379 #define EFI_IMAGE_SCN_LNK_INFO                     BIT9   ///< 0x00000200  ///< Section contains comments or some other type of information.
00380 #define EFI_IMAGE_SCN_LNK_REMOVE                   BIT10  ///< 0x00000800  ///< Section contents will not become part of image.
00381 #define EFI_IMAGE_SCN_LNK_COMDAT                   BIT12  ///< 0x00001000
00382 
00383 #define EFI_IMAGE_SCN_ALIGN_1BYTES                 BIT20  ///< 0x00100000
00384 #define EFI_IMAGE_SCN_ALIGN_2BYTES                 BIT21  ///< 0x00200000
00385 #define EFI_IMAGE_SCN_ALIGN_4BYTES          (BIT20|BIT21) ///< 0x00300000
00386 #define EFI_IMAGE_SCN_ALIGN_8BYTES                 BIT22  ///< 0x00400000
00387 #define EFI_IMAGE_SCN_ALIGN_16BYTES         (BIT20|BIT22) ///< 0x00500000
00388 #define EFI_IMAGE_SCN_ALIGN_32BYTES         (BIT21|BIT22) ///< 0x00600000
00389 #define EFI_IMAGE_SCN_ALIGN_64BYTES   (BIT20|BIT21|BIT22) ///< 0x00700000
00390 
00391 #define EFI_IMAGE_SCN_MEM_DISCARDABLE              BIT25  ///< 0x02000000
00392 #define EFI_IMAGE_SCN_MEM_NOT_CACHED               BIT26  ///< 0x04000000
00393 #define EFI_IMAGE_SCN_MEM_NOT_PAGED                BIT27  ///< 0x08000000
00394 #define EFI_IMAGE_SCN_MEM_SHARED                   BIT28  ///< 0x10000000
00395 #define EFI_IMAGE_SCN_MEM_EXECUTE                  BIT29  ///< 0x20000000
00396 #define EFI_IMAGE_SCN_MEM_READ                     BIT30  ///< 0x40000000
00397 #define EFI_IMAGE_SCN_MEM_WRITE                    BIT31  ///< 0x80000000
00398 
00399 ///
00400 /// Size of a Symbol Table Record
00401 ///
00402 #define EFI_IMAGE_SIZEOF_SYMBOL 18
00403 
00404 ///
00405 /// Symbols have a section number of the section in which they are
00406 /// defined. Otherwise, section numbers have the following meanings:
00407 ///
00408 #define EFI_IMAGE_SYM_UNDEFINED (UINT16) 0  ///< Symbol is undefined or is common.
00409 #define EFI_IMAGE_SYM_ABSOLUTE  (UINT16) -1 ///< Symbol is an absolute value.
00410 #define EFI_IMAGE_SYM_DEBUG     (UINT16) -2 ///< Symbol is a special debug item.
00411 
00412 ///
00413 /// Symbol Type (fundamental) values.
00414 ///
00415 #define EFI_IMAGE_SYM_TYPE_NULL   0   ///< no type.
00416 #define EFI_IMAGE_SYM_TYPE_VOID   1   ///< no valid type.
00417 #define EFI_IMAGE_SYM_TYPE_CHAR   2   ///< type character.
00418 #define EFI_IMAGE_SYM_TYPE_SHORT  3   ///< type short integer.
00419 #define EFI_IMAGE_SYM_TYPE_INT    4
00420 #define EFI_IMAGE_SYM_TYPE_LONG   5
00421 #define EFI_IMAGE_SYM_TYPE_FLOAT  6
00422 #define EFI_IMAGE_SYM_TYPE_DOUBLE 7
00423 #define EFI_IMAGE_SYM_TYPE_STRUCT 8
00424 #define EFI_IMAGE_SYM_TYPE_UNION  9
00425 #define EFI_IMAGE_SYM_TYPE_ENUM   10  ///< enumeration.
00426 #define EFI_IMAGE_SYM_TYPE_MOE    11  ///< member of enumeration.
00427 #define EFI_IMAGE_SYM_TYPE_BYTE   12
00428 #define EFI_IMAGE_SYM_TYPE_WORD   13
00429 #define EFI_IMAGE_SYM_TYPE_UINT   14
00430 #define EFI_IMAGE_SYM_TYPE_DWORD  15
00431 
00432 ///
00433 /// Symbol Type (derived) values.
00434 ///
00435 #define EFI_IMAGE_SYM_DTYPE_NULL      0 ///< no derived type.
00436 #define EFI_IMAGE_SYM_DTYPE_POINTER   1
00437 #define EFI_IMAGE_SYM_DTYPE_FUNCTION  2
00438 #define EFI_IMAGE_SYM_DTYPE_ARRAY     3
00439 
00440 ///
00441 /// Storage classes.
00442 ///
00443 #define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION   ((UINT8) -1)
00444 #define EFI_IMAGE_SYM_CLASS_NULL              0
00445 #define EFI_IMAGE_SYM_CLASS_AUTOMATIC         1
00446 #define EFI_IMAGE_SYM_CLASS_EXTERNAL          2
00447 #define EFI_IMAGE_SYM_CLASS_STATIC            3
00448 #define EFI_IMAGE_SYM_CLASS_REGISTER          4
00449 #define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF      5
00450 #define EFI_IMAGE_SYM_CLASS_LABEL             6
00451 #define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL   7
00452 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT  8
00453 #define EFI_IMAGE_SYM_CLASS_ARGUMENT          9
00454 #define EFI_IMAGE_SYM_CLASS_STRUCT_TAG        10
00455 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION   11
00456 #define EFI_IMAGE_SYM_CLASS_UNION_TAG         12
00457 #define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION   13
00458 #define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC  14
00459 #define EFI_IMAGE_SYM_CLASS_ENUM_TAG          15
00460 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM    16
00461 #define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM    17
00462 #define EFI_IMAGE_SYM_CLASS_BIT_FIELD         18
00463 #define EFI_IMAGE_SYM_CLASS_BLOCK             100
00464 #define EFI_IMAGE_SYM_CLASS_FUNCTION          101
00465 #define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT     102
00466 #define EFI_IMAGE_SYM_CLASS_FILE              103
00467 #define EFI_IMAGE_SYM_CLASS_SECTION           104
00468 #define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL     105
00469 
00470 //
00471 // type packing constants
00472 //
00473 #define EFI_IMAGE_N_BTMASK  017
00474 #define EFI_IMAGE_N_TMASK   060
00475 #define EFI_IMAGE_N_TMASK1  0300
00476 #define EFI_IMAGE_N_TMASK2  0360
00477 #define EFI_IMAGE_N_BTSHFT  4
00478 #define EFI_IMAGE_N_TSHIFT  2
00479 
00480 ///
00481 /// Communal selection types.
00482 ///
00483 #define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES    1
00484 #define EFI_IMAGE_COMDAT_SELECT_ANY             2
00485 #define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE       3
00486 #define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH     4
00487 #define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE     5
00488 
00489 ///
00490 /// the following values only be referred in PeCoff, not defined in PECOFF.
00491 ///
00492 #define EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
00493 #define EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
00494 #define EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
00495 
00496 ///
00497 /// Relocation format.
00498 ///
00499 typedef struct {
00500   UINT32  VirtualAddress;
00501   UINT32  SymbolTableIndex;
00502   UINT16  Type;
00503 } EFI_IMAGE_RELOCATION;
00504 
00505 ///
00506 /// Size of EFI_IMAGE_RELOCATION
00507 ///
00508 #define EFI_IMAGE_SIZEOF_RELOCATION 10
00509 
00510 ///
00511 /// I386 relocation types.
00512 ///
00513 #define EFI_IMAGE_REL_I386_ABSOLUTE 0x0000  ///< Reference is absolute, no relocation is necessary
00514 #define EFI_IMAGE_REL_I386_DIR16    0x0001  ///< Direct 16-bit reference to the symbols virtual address
00515 #define EFI_IMAGE_REL_I386_REL16    0x0002  ///< PC-relative 16-bit reference to the symbols virtual address
00516 #define EFI_IMAGE_REL_I386_DIR32    0x0006  ///< Direct 32-bit reference to the symbols virtual address
00517 #define EFI_IMAGE_REL_I386_DIR32NB  0x0007  ///< Direct 32-bit reference to the symbols virtual address, base not included
00518 #define EFI_IMAGE_REL_I386_SEG12    0x0009  ///< Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
00519 #define EFI_IMAGE_REL_I386_SECTION  0x000A
00520 #define EFI_IMAGE_REL_I386_SECREL   0x000B
00521 #define EFI_IMAGE_REL_I386_REL32    0x0014  ///< PC-relative 32-bit reference to the symbols virtual address
00522 
00523 ///
00524 /// x64 processor relocation types.
00525 ///
00526 #define IMAGE_REL_AMD64_ABSOLUTE        0x0000
00527 #define IMAGE_REL_AMD64_ADDR64    0x0001
00528 #define IMAGE_REL_AMD64_ADDR32    0x0002
00529 #define IMAGE_REL_AMD64_ADDR32NB        0x0003
00530 #define IMAGE_REL_AMD64_REL32       0x0004
00531 #define IMAGE_REL_AMD64_REL32_1   0x0005
00532 #define IMAGE_REL_AMD64_REL32_2   0x0006
00533 #define IMAGE_REL_AMD64_REL32_3   0x0007
00534 #define IMAGE_REL_AMD64_REL32_4   0x0008
00535 #define IMAGE_REL_AMD64_REL32_5   0x0009
00536 #define IMAGE_REL_AMD64_SECTION   0x000A
00537 #define IMAGE_REL_AMD64_SECREL    0x000B
00538 #define IMAGE_REL_AMD64_SECREL7   0x000C
00539 #define IMAGE_REL_AMD64_TOKEN       0x000D
00540 #define IMAGE_REL_AMD64_SREL32    0x000E
00541 #define IMAGE_REL_AMD64_PAIR        0x000F
00542 #define IMAGE_REL_AMD64_SSPAN32   0x0010
00543 
00544 ///
00545 /// Based relocation format.
00546 ///
00547 typedef struct {
00548   UINT32  VirtualAddress;
00549   UINT32  SizeOfBlock;
00550 } EFI_IMAGE_BASE_RELOCATION;
00551 
00552 ///
00553 /// Size of EFI_IMAGE_BASE_RELOCATION
00554 ///
00555 #define EFI_IMAGE_SIZEOF_BASE_RELOCATION  8
00556 
00557 ///
00558 /// Based relocation types.
00559 ///
00560 #define EFI_IMAGE_REL_BASED_ABSOLUTE      0
00561 #define EFI_IMAGE_REL_BASED_HIGH          1
00562 #define EFI_IMAGE_REL_BASED_LOW           2
00563 #define EFI_IMAGE_REL_BASED_HIGHLOW       3
00564 #define EFI_IMAGE_REL_BASED_HIGHADJ       4
00565 #define EFI_IMAGE_REL_BASED_MIPS_JMPADDR  5
00566 #define EFI_IMAGE_REL_BASED_IA64_IMM64    9
00567 #define IMAGE_REL_BASED_MIPS_JMPADDR16    9
00568 #define EFI_IMAGE_REL_BASED_DIR64         10
00569 
00570 ///
00571 /// Line number format.
00572 ///
00573 typedef struct {
00574   union {
00575     UINT32  SymbolTableIndex; // Symbol table index of function name if Linenumber is 0.
00576     UINT32  VirtualAddress;   // Virtual address of line number.
00577   } Type;
00578   UINT16  Linenumber;         // Line number.
00579 } EFI_IMAGE_LINENUMBER;
00580 
00581 ///
00582 /// Size of EFI_IMAGE_LINENUMBER
00583 ///
00584 #define EFI_IMAGE_SIZEOF_LINENUMBER 6
00585 
00586 ///
00587 /// Archive format.
00588 ///
00589 #define EFI_IMAGE_ARCHIVE_START_SIZE        8
00590 #define EFI_IMAGE_ARCHIVE_START             "!<arch>\n"
00591 #define EFI_IMAGE_ARCHIVE_END               "`\n"
00592 #define EFI_IMAGE_ARCHIVE_PAD               "\n"
00593 #define EFI_IMAGE_ARCHIVE_LINKER_MEMBER     "/               "
00594 #define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER  "//              "
00595 
00596 typedef struct {
00597   UINT8 Name[16];     ///< File member name - `/' terminated.
00598   UINT8 Date[12];     ///< File member date - decimal.
00599   UINT8 UserID[6];    ///< File member user id - decimal.
00600   UINT8 GroupID[6];   ///< File member group id - decimal.
00601   UINT8 Mode[8];      ///< File member mode - octal.
00602   UINT8 Size[10];     ///< File member size - decimal.
00603   UINT8 EndHeader[2]; ///< String to end header. (0x60 0x0A)
00604 } EFI_IMAGE_ARCHIVE_MEMBER_HEADER;
00605 
00606 ///
00607 /// Size of EFI_IMAGE_ARCHIVE_MEMBER_HEADER
00608 ///
00609 #define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
00610 
00611 
00612 ///
00613 /// DLL Support
00614 ///
00615 
00616 ///
00617 /// Export Directory Table
00618 ///
00619 typedef struct {
00620   UINT32  Characteristics;
00621   UINT32  TimeDateStamp;
00622   UINT16  MajorVersion;
00623   UINT16  MinorVersion;
00624   UINT32  Name;
00625   UINT32  Base;
00626   UINT32  NumberOfFunctions;
00627   UINT32  NumberOfNames;
00628   UINT32  AddressOfFunctions;
00629   UINT32  AddressOfNames;
00630   UINT32  AddressOfNameOrdinals;
00631 } EFI_IMAGE_EXPORT_DIRECTORY;
00632 
00633 ///
00634 /// Hint/Name Table
00635 ///
00636 typedef struct {
00637   UINT16  Hint;
00638   UINT8   Name[1];
00639 } EFI_IMAGE_IMPORT_BY_NAME;
00640 
00641 typedef struct {
00642   union {
00643     UINT32                    Function;
00644     UINT32                    Ordinal;
00645     EFI_IMAGE_IMPORT_BY_NAME  *AddressOfData;
00646   } u1;
00647 } EFI_IMAGE_THUNK_DATA;
00648 
00649 #define EFI_IMAGE_ORDINAL_FLAG              BIT31    ///< Flag for PE32
00650 #define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal)  ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0)
00651 #define EFI_IMAGE_ORDINAL(Ordinal)          (Ordinal & 0xffff)
00652 
00653 ///
00654 /// Import Directory Table
00655 ///
00656 typedef struct {
00657   UINT32                Characteristics;
00658   UINT32                TimeDateStamp;
00659   UINT32                ForwarderChain;
00660   UINT32                Name;
00661   EFI_IMAGE_THUNK_DATA  *FirstThunk;
00662 } EFI_IMAGE_IMPORT_DESCRIPTOR;
00663 
00664 
00665 ///
00666 /// Debug Direcotry Format
00667 ///
00668 typedef struct {
00669   UINT32  Characteristics;
00670   UINT32  TimeDateStamp;
00671   UINT16  MajorVersion;
00672   UINT16  MinorVersion;
00673   UINT32  Type;
00674   UINT32  SizeOfData;
00675   UINT32  RVA;           ///< The address of the debug data when loaded, relative to the image base
00676   UINT32  FileOffset;    ///< The file pointer to the debug data
00677 } EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;
00678 
00679 #define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2     ///< The Visual C++ debug information
00680 
00681 ///
00682 /// Debug Data Structure defined in Microsoft C++
00683 ///
00684 #define CODEVIEW_SIGNATURE_NB10  SIGNATURE_32('N', 'B', '1', '0')
00685 typedef struct {
00686   UINT32  Signature;                        ///< "NB10"
00687   UINT32  Unknown;
00688   UINT32  Unknown2;
00689   UINT32  Unknown3;
00690   //
00691   // Filename of .PDB goes here
00692   //
00693 } EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;
00694 
00695 ///
00696 /// Debug Data Structure defined in Microsoft C++
00697 ///
00698 #define CODEVIEW_SIGNATURE_RSDS  SIGNATURE_32('R', 'S', 'D', 'S')
00699 typedef struct {
00700   UINT32  Signature;                        ///< "RSDS"
00701   UINT32  Unknown;
00702   UINT32  Unknown2;
00703   UINT32  Unknown3;
00704   UINT32  Unknown4;
00705   UINT32  Unknown5;
00706   //
00707   // Filename of .PDB goes here
00708   //
00709 } EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;
00710 
00711 ///
00712 /// Header format for TE images, defined in PI Specification, 1.0
00713 ///
00714 typedef struct {
00715   UINT16                    Signature;            ///< signature for TE format = "VZ"
00716   UINT16                    Machine;              ///< from the original file header
00717   UINT8                     NumberOfSections;     ///< from the original file header
00718   UINT8                     Subsystem;            ///< from original optional header
00719   UINT16                    StrippedSize;         ///< how many bytes we removed from the header
00720   UINT32                    AddressOfEntryPoint;  ///< offset to entry point -- from original optional header
00721   UINT32                    BaseOfCode;           ///< from original image -- required for ITP debug
00722   UINT64                    ImageBase;            ///< from original file header
00723   EFI_IMAGE_DATA_DIRECTORY  DataDirectory[2];     ///< only base relocation and debug directory
00724 } EFI_TE_IMAGE_HEADER;
00725 
00726 
00727 #define EFI_TE_IMAGE_HEADER_SIGNATURE  SIGNATURE_16('V', 'Z')
00728 
00729 //
00730 // Data directory indexes in our TE image header
00731 //
00732 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC  0
00733 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG      1
00734 
00735 
00736 ///
00737 /// Union of PE32, PE32+, and TE headers
00738 ///
00739 typedef union {
00740   EFI_IMAGE_NT_HEADERS32   Pe32;
00741   EFI_IMAGE_NT_HEADERS64   Pe32Plus;
00742   EFI_TE_IMAGE_HEADER      Te;
00743 } EFI_IMAGE_OPTIONAL_HEADER_UNION;
00744 
00745 typedef union {
00746   EFI_IMAGE_NT_HEADERS32            *Pe32;
00747   EFI_IMAGE_NT_HEADERS64            *Pe32Plus;
00748   EFI_TE_IMAGE_HEADER               *Te;
00749   EFI_IMAGE_OPTIONAL_HEADER_UNION   *Union;
00750 } EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;
00751 
00752 #endif

Generated on Tue Apr 6 20:01:07 2010 for gPXE by  doxygen 1.5.7.1