xref: /openbmc/qemu/contrib/elf2dmp/pe.h (revision 8de6e6e12e623ea402274d4cf24de20ed7e40717)
13fa2d384SViktor Prutyanov /*
23fa2d384SViktor Prutyanov  * Copyright (c) 2018 Virtuozzo International GmbH
33fa2d384SViktor Prutyanov  *
43fa2d384SViktor Prutyanov  * This work is licensed under the terms of the GNU GPL, version 2 or later.
53fa2d384SViktor Prutyanov  *
63fa2d384SViktor Prutyanov  */
73fa2d384SViktor Prutyanov 
83fa2d384SViktor Prutyanov #ifndef PE_H
93fa2d384SViktor Prutyanov #define PE_H
103fa2d384SViktor Prutyanov 
113fa2d384SViktor Prutyanov 
124591f4ceSViktor Prutyanov #ifndef _WIN32
133fa2d384SViktor Prutyanov typedef struct IMAGE_DOS_HEADER {
143fa2d384SViktor Prutyanov     uint16_t  e_magic;      /* 0x00: MZ Header signature */
153fa2d384SViktor Prutyanov     uint16_t  e_cblp;       /* 0x02: Bytes on last page of file */
163fa2d384SViktor Prutyanov     uint16_t  e_cp;         /* 0x04: Pages in file */
173fa2d384SViktor Prutyanov     uint16_t  e_crlc;       /* 0x06: Relocations */
183fa2d384SViktor Prutyanov     uint16_t  e_cparhdr;    /* 0x08: Size of header in paragraphs */
193fa2d384SViktor Prutyanov     uint16_t  e_minalloc;   /* 0x0a: Minimum extra paragraphs needed */
203fa2d384SViktor Prutyanov     uint16_t  e_maxalloc;   /* 0x0c: Maximum extra paragraphs needed */
213fa2d384SViktor Prutyanov     uint16_t  e_ss;         /* 0x0e: Initial (relative) SS value */
223fa2d384SViktor Prutyanov     uint16_t  e_sp;         /* 0x10: Initial SP value */
233fa2d384SViktor Prutyanov     uint16_t  e_csum;       /* 0x12: Checksum */
243fa2d384SViktor Prutyanov     uint16_t  e_ip;         /* 0x14: Initial IP value */
253fa2d384SViktor Prutyanov     uint16_t  e_cs;         /* 0x16: Initial (relative) CS value */
263fa2d384SViktor Prutyanov     uint16_t  e_lfarlc;     /* 0x18: File address of relocation table */
273fa2d384SViktor Prutyanov     uint16_t  e_ovno;       /* 0x1a: Overlay number */
283fa2d384SViktor Prutyanov     uint16_t  e_res[4];     /* 0x1c: Reserved words */
293fa2d384SViktor Prutyanov     uint16_t  e_oemid;      /* 0x24: OEM identifier (for e_oeminfo) */
303fa2d384SViktor Prutyanov     uint16_t  e_oeminfo;    /* 0x26: OEM information; e_oemid specific */
313fa2d384SViktor Prutyanov     uint16_t  e_res2[10];   /* 0x28: Reserved words */
323fa2d384SViktor Prutyanov     uint32_t  e_lfanew;     /* 0x3c: Offset to extended header */
333fa2d384SViktor Prutyanov } __attribute__ ((packed)) IMAGE_DOS_HEADER;
343fa2d384SViktor Prutyanov 
353fa2d384SViktor Prutyanov typedef struct IMAGE_FILE_HEADER {
363fa2d384SViktor Prutyanov     uint16_t  Machine;
373fa2d384SViktor Prutyanov     uint16_t  NumberOfSections;
383fa2d384SViktor Prutyanov     uint32_t  TimeDateStamp;
393fa2d384SViktor Prutyanov     uint32_t  PointerToSymbolTable;
403fa2d384SViktor Prutyanov     uint32_t  NumberOfSymbols;
413fa2d384SViktor Prutyanov     uint16_t  SizeOfOptionalHeader;
423fa2d384SViktor Prutyanov     uint16_t  Characteristics;
433fa2d384SViktor Prutyanov } __attribute__ ((packed)) IMAGE_FILE_HEADER;
443fa2d384SViktor Prutyanov 
453fa2d384SViktor Prutyanov typedef struct IMAGE_DATA_DIRECTORY {
463fa2d384SViktor Prutyanov     uint32_t VirtualAddress;
473fa2d384SViktor Prutyanov     uint32_t Size;
483fa2d384SViktor Prutyanov } __attribute__ ((packed)) IMAGE_DATA_DIRECTORY;
493fa2d384SViktor Prutyanov 
503fa2d384SViktor Prutyanov #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
513fa2d384SViktor Prutyanov 
523fa2d384SViktor Prutyanov typedef struct IMAGE_OPTIONAL_HEADER64 {
533fa2d384SViktor Prutyanov     uint16_t  Magic; /* 0x20b */
543fa2d384SViktor Prutyanov     uint8_t   MajorLinkerVersion;
553fa2d384SViktor Prutyanov     uint8_t   MinorLinkerVersion;
563fa2d384SViktor Prutyanov     uint32_t  SizeOfCode;
573fa2d384SViktor Prutyanov     uint32_t  SizeOfInitializedData;
583fa2d384SViktor Prutyanov     uint32_t  SizeOfUninitializedData;
593fa2d384SViktor Prutyanov     uint32_t  AddressOfEntryPoint;
603fa2d384SViktor Prutyanov     uint32_t  BaseOfCode;
613fa2d384SViktor Prutyanov     uint64_t  ImageBase;
623fa2d384SViktor Prutyanov     uint32_t  SectionAlignment;
633fa2d384SViktor Prutyanov     uint32_t  FileAlignment;
643fa2d384SViktor Prutyanov     uint16_t  MajorOperatingSystemVersion;
653fa2d384SViktor Prutyanov     uint16_t  MinorOperatingSystemVersion;
663fa2d384SViktor Prutyanov     uint16_t  MajorImageVersion;
673fa2d384SViktor Prutyanov     uint16_t  MinorImageVersion;
683fa2d384SViktor Prutyanov     uint16_t  MajorSubsystemVersion;
693fa2d384SViktor Prutyanov     uint16_t  MinorSubsystemVersion;
703fa2d384SViktor Prutyanov     uint32_t  Win32VersionValue;
713fa2d384SViktor Prutyanov     uint32_t  SizeOfImage;
723fa2d384SViktor Prutyanov     uint32_t  SizeOfHeaders;
733fa2d384SViktor Prutyanov     uint32_t  CheckSum;
743fa2d384SViktor Prutyanov     uint16_t  Subsystem;
753fa2d384SViktor Prutyanov     uint16_t  DllCharacteristics;
763fa2d384SViktor Prutyanov     uint64_t  SizeOfStackReserve;
773fa2d384SViktor Prutyanov     uint64_t  SizeOfStackCommit;
783fa2d384SViktor Prutyanov     uint64_t  SizeOfHeapReserve;
793fa2d384SViktor Prutyanov     uint64_t  SizeOfHeapCommit;
803fa2d384SViktor Prutyanov     uint32_t  LoaderFlags;
813fa2d384SViktor Prutyanov     uint32_t  NumberOfRvaAndSizes;
823fa2d384SViktor Prutyanov     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
833fa2d384SViktor Prutyanov } __attribute__ ((packed)) IMAGE_OPTIONAL_HEADER64;
843fa2d384SViktor Prutyanov 
853fa2d384SViktor Prutyanov typedef struct IMAGE_NT_HEADERS64 {
863fa2d384SViktor Prutyanov     uint32_t Signature;
873fa2d384SViktor Prutyanov     IMAGE_FILE_HEADER FileHeader;
883fa2d384SViktor Prutyanov     IMAGE_OPTIONAL_HEADER64 OptionalHeader;
893fa2d384SViktor Prutyanov } __attribute__ ((packed)) IMAGE_NT_HEADERS64;
903fa2d384SViktor Prutyanov 
91*d399d6b1SViktor Prutyanov typedef struct IMAGE_EXPORT_DIRECTORY {
92*d399d6b1SViktor Prutyanov     uint32_t    Characteristics;
93*d399d6b1SViktor Prutyanov     uint32_t    TimeDateStamp;
94*d399d6b1SViktor Prutyanov     uint16_t    MajorVersion;
95*d399d6b1SViktor Prutyanov     uint16_t    MinorVersion;
96*d399d6b1SViktor Prutyanov     uint32_t    Name;
97*d399d6b1SViktor Prutyanov     uint32_t    Base;
98*d399d6b1SViktor Prutyanov     uint32_t    NumberOfFunctions;
99*d399d6b1SViktor Prutyanov     uint32_t    NumberOfNames;
100*d399d6b1SViktor Prutyanov     uint32_t    AddressOfFunctions;
101*d399d6b1SViktor Prutyanov     uint32_t    AddressOfNames;
102*d399d6b1SViktor Prutyanov     uint32_t    AddressOfNameOrdinals;
103*d399d6b1SViktor Prutyanov } __attribute__ ((packed)) IMAGE_EXPORT_DIRECTORY;
104*d399d6b1SViktor Prutyanov 
1053fa2d384SViktor Prutyanov typedef struct IMAGE_DEBUG_DIRECTORY {
1063fa2d384SViktor Prutyanov     uint32_t Characteristics;
1073fa2d384SViktor Prutyanov     uint32_t TimeDateStamp;
1083fa2d384SViktor Prutyanov     uint16_t MajorVersion;
1093fa2d384SViktor Prutyanov     uint16_t MinorVersion;
1103fa2d384SViktor Prutyanov     uint32_t Type;
1113fa2d384SViktor Prutyanov     uint32_t SizeOfData;
1123fa2d384SViktor Prutyanov     uint32_t AddressOfRawData;
1133fa2d384SViktor Prutyanov     uint32_t PointerToRawData;
1143fa2d384SViktor Prutyanov } __attribute__ ((packed)) IMAGE_DEBUG_DIRECTORY;
1153fa2d384SViktor Prutyanov 
1163fa2d384SViktor Prutyanov #define IMAGE_DEBUG_TYPE_CODEVIEW   2
1174591f4ceSViktor Prutyanov #endif
1184591f4ceSViktor Prutyanov 
119*d399d6b1SViktor Prutyanov #define IMAGE_FILE_EXPORT_DIRECTORY 0
1204591f4ceSViktor Prutyanov #define IMAGE_FILE_DEBUG_DIRECTORY  6
1213fa2d384SViktor Prutyanov 
1223fa2d384SViktor Prutyanov typedef struct guid_t {
1233fa2d384SViktor Prutyanov     uint32_t a;
1243fa2d384SViktor Prutyanov     uint16_t b;
1253fa2d384SViktor Prutyanov     uint16_t c;
1263fa2d384SViktor Prutyanov     uint8_t d[2];
1273fa2d384SViktor Prutyanov     uint8_t  e[6];
1283fa2d384SViktor Prutyanov } __attribute__ ((packed)) guid_t;
1293fa2d384SViktor Prutyanov 
1303fa2d384SViktor Prutyanov typedef struct OMFSignatureRSDS {
1313fa2d384SViktor Prutyanov     char        Signature[4];
1323fa2d384SViktor Prutyanov     guid_t      guid;
1333fa2d384SViktor Prutyanov     uint32_t    age;
1343fa2d384SViktor Prutyanov     char        name[];
1353fa2d384SViktor Prutyanov } __attribute__ ((packed)) OMFSignatureRSDS;
1363fa2d384SViktor Prutyanov 
1373fa2d384SViktor Prutyanov #endif /* PE_H */
138