| 1 | /* |
| 2 | * Copyright (c) 2018 Virtuozzo International GmbH |
| 3 | * |
| 4 | * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| 5 | * |
| 6 | */ |
| 7 | |
| 8 | #ifndef PE_H |
| 9 | #define PE_H |
| 10 | |
| 11 | |
| 12 | #ifndef _WIN32 |
| 13 | typedef struct IMAGE_DOS_HEADER { |
| 14 | uint16_t e_magic; /* 0x00: MZ Header signature */ |
| 15 | uint16_t e_cblp; /* 0x02: Bytes on last page of file */ |
| 16 | uint16_t e_cp; /* 0x04: Pages in file */ |
| 17 | uint16_t e_crlc; /* 0x06: Relocations */ |
| 18 | uint16_t e_cparhdr; /* 0x08: Size of header in paragraphs */ |
| 19 | uint16_t e_minalloc; /* 0x0a: Minimum extra paragraphs needed */ |
| 20 | uint16_t e_maxalloc; /* 0x0c: Maximum extra paragraphs needed */ |
| 21 | uint16_t e_ss; /* 0x0e: Initial (relative) SS value */ |
| 22 | uint16_t e_sp; /* 0x10: Initial SP value */ |
| 23 | uint16_t e_csum; /* 0x12: Checksum */ |
| 24 | uint16_t e_ip; /* 0x14: Initial IP value */ |
| 25 | uint16_t e_cs; /* 0x16: Initial (relative) CS value */ |
| 26 | uint16_t e_lfarlc; /* 0x18: File address of relocation table */ |
| 27 | uint16_t e_ovno; /* 0x1a: Overlay number */ |
| 28 | uint16_t e_res[4]; /* 0x1c: Reserved words */ |
| 29 | uint16_t e_oemid; /* 0x24: OEM identifier (for e_oeminfo) */ |
| 30 | uint16_t e_oeminfo; /* 0x26: OEM information; e_oemid specific */ |
| 31 | uint16_t e_res2[10]; /* 0x28: Reserved words */ |
| 32 | uint32_t e_lfanew; /* 0x3c: Offset to extended header */ |
| 33 | } __attribute__ ((packed)) IMAGE_DOS_HEADER; |
| 34 | |
| 35 | typedef struct IMAGE_FILE_HEADER { |
| 36 | uint16_t Machine; |
| 37 | uint16_t NumberOfSections; |
| 38 | uint32_t TimeDateStamp; |
| 39 | uint32_t PointerToSymbolTable; |
| 40 | uint32_t NumberOfSymbols; |
| 41 | uint16_t SizeOfOptionalHeader; |
| 42 | uint16_t Characteristics; |
| 43 | } __attribute__ ((packed)) IMAGE_FILE_HEADER; |
| 44 | |
| 45 | typedef struct IMAGE_DATA_DIRECTORY { |
| 46 | uint32_t VirtualAddress; |
| 47 | uint32_t Size; |
| 48 | } __attribute__ ((packed)) IMAGE_DATA_DIRECTORY; |
| 49 | |
| 50 | #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 |
| 51 | |
| 52 | typedef struct IMAGE_OPTIONAL_HEADER64 { |
| 53 | uint16_t Magic; /* 0x20b */ |
| 54 | uint8_t MajorLinkerVersion; |
| 55 | uint8_t MinorLinkerVersion; |
| 56 | uint32_t SizeOfCode; |
| 57 | uint32_t SizeOfInitializedData; |
| 58 | uint32_t SizeOfUninitializedData; |
| 59 | uint32_t AddressOfEntryPoint; |
| 60 | uint32_t BaseOfCode; |
| 61 | uint64_t ImageBase; |
| 62 | uint32_t SectionAlignment; |
| 63 | uint32_t FileAlignment; |
| 64 | uint16_t MajorOperatingSystemVersion; |
| 65 | uint16_t MinorOperatingSystemVersion; |
| 66 | uint16_t MajorImageVersion; |
| 67 | uint16_t MinorImageVersion; |
| 68 | uint16_t MajorSubsystemVersion; |
| 69 | uint16_t MinorSubsystemVersion; |
| 70 | uint32_t Win32VersionValue; |
| 71 | uint32_t SizeOfImage; |
| 72 | uint32_t SizeOfHeaders; |
| 73 | uint32_t CheckSum; |
| 74 | uint16_t Subsystem; |
| 75 | uint16_t DllCharacteristics; |
| 76 | uint64_t SizeOfStackReserve; |
| 77 | uint64_t SizeOfStackCommit; |
| 78 | uint64_t SizeOfHeapReserve; |
| 79 | uint64_t SizeOfHeapCommit; |
| 80 | uint32_t LoaderFlags; |
| 81 | uint32_t NumberOfRvaAndSizes; |
| 82 | IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; |
| 83 | } __attribute__ ((packed)) IMAGE_OPTIONAL_HEADER64; |
| 84 | |
| 85 | typedef struct IMAGE_NT_HEADERS64 { |
| 86 | uint32_t Signature; |
| 87 | IMAGE_FILE_HEADER FileHeader; |
| 88 | IMAGE_OPTIONAL_HEADER64 OptionalHeader; |
| 89 | } __attribute__ ((packed)) IMAGE_NT_HEADERS64; |
| 90 | |
| 91 | typedef struct IMAGE_EXPORT_DIRECTORY { |
| 92 | uint32_t Characteristics; |
| 93 | uint32_t TimeDateStamp; |
| 94 | uint16_t MajorVersion; |
| 95 | uint16_t MinorVersion; |
| 96 | uint32_t Name; |
| 97 | uint32_t Base; |
| 98 | uint32_t NumberOfFunctions; |
| 99 | uint32_t NumberOfNames; |
| 100 | uint32_t AddressOfFunctions; |
| 101 | uint32_t AddressOfNames; |
| 102 | uint32_t AddressOfNameOrdinals; |
| 103 | } __attribute__ ((packed)) IMAGE_EXPORT_DIRECTORY; |
| 104 | |
| 105 | typedef struct IMAGE_DEBUG_DIRECTORY { |
| 106 | uint32_t Characteristics; |
| 107 | uint32_t TimeDateStamp; |
| 108 | uint16_t MajorVersion; |
| 109 | uint16_t MinorVersion; |
| 110 | uint32_t Type; |
| 111 | uint32_t SizeOfData; |
| 112 | uint32_t AddressOfRawData; |
| 113 | uint32_t PointerToRawData; |
| 114 | } __attribute__ ((packed)) IMAGE_DEBUG_DIRECTORY; |
| 115 | |
| 116 | #define IMAGE_DEBUG_TYPE_CODEVIEW 2 |
| 117 | #endif |
| 118 | |
| 119 | #define IMAGE_FILE_EXPORT_DIRECTORY 0 |
| 120 | #define IMAGE_FILE_DEBUG_DIRECTORY 6 |
| 121 | |
| 122 | typedef struct guid_t { |
| 123 | uint32_t a; |
| 124 | uint16_t b; |
| 125 | uint16_t c; |
| 126 | uint8_t d[2]; |
| 127 | uint8_t e[6]; |
| 128 | } __attribute__ ((packed)) guid_t; |
| 129 | |
| 130 | typedef struct OMFSignatureRSDS { |
| 131 | char Signature[4]; |
| 132 | guid_t guid; |
| 133 | uint32_t age; |
| 134 | char name[]; |
| 135 | } __attribute__ ((packed)) OMFSignatureRSDS; |
| 136 | |
| 137 | #endif /* PE_H */ |