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