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
13typedef 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
35typedef 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
45typedef 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
52typedef 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
85typedef 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
91typedef struct IMAGE_DEBUG_DIRECTORY {
92 uint32_t Characteristics;
93 uint32_t TimeDateStamp;
94 uint16_t MajorVersion;
95 uint16_t MinorVersion;
96 uint32_t Type;
97 uint32_t SizeOfData;
98 uint32_t AddressOfRawData;
99 uint32_t PointerToRawData;
100} __attribute__ ((packed)) IMAGE_DEBUG_DIRECTORY;
101
102#define IMAGE_DEBUG_TYPE_CODEVIEW 2
103#endif
104
105#define IMAGE_FILE_DEBUG_DIRECTORY 6
106
107typedef struct guid_t {
108 uint32_t a;
109 uint16_t b;
110 uint16_t c;
111 uint8_t d[2];
112 uint8_t e[6];
113} __attribute__ ((packed)) guid_t;
114
115typedef struct OMFSignatureRSDS {
116 char Signature[4];
117 guid_t guid;
118 uint32_t age;
119 char name[];
120} __attribute__ ((packed)) OMFSignatureRSDS;
121
122#endif /* PE_H */
123