| /* |
| * Copyright (c) 2018 Virtuozzo International GmbH |
| * |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| * |
| */ |
| |
| #ifndef PE_H |
| #define PE_H |
| |
| #include <stdint.h> |
| |
| typedef struct IMAGE_DOS_HEADER { |
| uint16_t e_magic; /* 0x00: MZ Header signature */ |
| uint16_t e_cblp; /* 0x02: Bytes on last page of file */ |
| uint16_t e_cp; /* 0x04: Pages in file */ |
| uint16_t e_crlc; /* 0x06: Relocations */ |
| uint16_t e_cparhdr; /* 0x08: Size of header in paragraphs */ |
| uint16_t e_minalloc; /* 0x0a: Minimum extra paragraphs needed */ |
| uint16_t e_maxalloc; /* 0x0c: Maximum extra paragraphs needed */ |
| uint16_t e_ss; /* 0x0e: Initial (relative) SS value */ |
| uint16_t e_sp; /* 0x10: Initial SP value */ |
| uint16_t e_csum; /* 0x12: Checksum */ |
| uint16_t e_ip; /* 0x14: Initial IP value */ |
| uint16_t e_cs; /* 0x16: Initial (relative) CS value */ |
| uint16_t e_lfarlc; /* 0x18: File address of relocation table */ |
| uint16_t e_ovno; /* 0x1a: Overlay number */ |
| uint16_t e_res[4]; /* 0x1c: Reserved words */ |
| uint16_t e_oemid; /* 0x24: OEM identifier (for e_oeminfo) */ |
| uint16_t e_oeminfo; /* 0x26: OEM information; e_oemid specific */ |
| uint16_t e_res2[10]; /* 0x28: Reserved words */ |
| uint32_t e_lfanew; /* 0x3c: Offset to extended header */ |
| } __attribute__ ((packed)) IMAGE_DOS_HEADER; |
| |
| typedef struct IMAGE_FILE_HEADER { |
| uint16_t Machine; |
| uint16_t NumberOfSections; |
| uint32_t TimeDateStamp; |
| uint32_t PointerToSymbolTable; |
| uint32_t NumberOfSymbols; |
| uint16_t SizeOfOptionalHeader; |
| uint16_t Characteristics; |
| } __attribute__ ((packed)) IMAGE_FILE_HEADER; |
| |
| typedef struct IMAGE_DATA_DIRECTORY { |
| uint32_t VirtualAddress; |
| uint32_t Size; |
| } __attribute__ ((packed)) IMAGE_DATA_DIRECTORY; |
| |
| #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 |
| |
| typedef struct IMAGE_OPTIONAL_HEADER64 { |
| uint16_t Magic; /* 0x20b */ |
| uint8_t MajorLinkerVersion; |
| uint8_t MinorLinkerVersion; |
| uint32_t SizeOfCode; |
| uint32_t SizeOfInitializedData; |
| uint32_t SizeOfUninitializedData; |
| uint32_t AddressOfEntryPoint; |
| uint32_t BaseOfCode; |
| uint64_t ImageBase; |
| uint32_t SectionAlignment; |
| uint32_t FileAlignment; |
| uint16_t MajorOperatingSystemVersion; |
| uint16_t MinorOperatingSystemVersion; |
| uint16_t MajorImageVersion; |
| uint16_t MinorImageVersion; |
| uint16_t MajorSubsystemVersion; |
| uint16_t MinorSubsystemVersion; |
| uint32_t Win32VersionValue; |
| uint32_t SizeOfImage; |
| uint32_t SizeOfHeaders; |
| uint32_t CheckSum; |
| uint16_t Subsystem; |
| uint16_t DllCharacteristics; |
| uint64_t SizeOfStackReserve; |
| uint64_t SizeOfStackCommit; |
| uint64_t SizeOfHeapReserve; |
| uint64_t SizeOfHeapCommit; |
| uint32_t LoaderFlags; |
| uint32_t NumberOfRvaAndSizes; |
| IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; |
| } __attribute__ ((packed)) IMAGE_OPTIONAL_HEADER64; |
| |
| typedef struct IMAGE_NT_HEADERS64 { |
| uint32_t Signature; |
| IMAGE_FILE_HEADER FileHeader; |
| IMAGE_OPTIONAL_HEADER64 OptionalHeader; |
| } __attribute__ ((packed)) IMAGE_NT_HEADERS64; |
| |
| #define IMAGE_FILE_DEBUG_DIRECTORY 6 |
| |
| typedef struct IMAGE_DEBUG_DIRECTORY { |
| uint32_t Characteristics; |
| uint32_t TimeDateStamp; |
| uint16_t MajorVersion; |
| uint16_t MinorVersion; |
| uint32_t Type; |
| uint32_t SizeOfData; |
| uint32_t AddressOfRawData; |
| uint32_t PointerToRawData; |
| } __attribute__ ((packed)) IMAGE_DEBUG_DIRECTORY; |
| |
| #define IMAGE_DEBUG_TYPE_CODEVIEW 2 |
| |
| typedef struct guid_t { |
| uint32_t a; |
| uint16_t b; |
| uint16_t c; |
| uint8_t d[2]; |
| uint8_t e[6]; |
| } __attribute__ ((packed)) guid_t; |
| |
| typedef struct OMFSignatureRSDS { |
| char Signature[4]; |
| guid_t guid; |
| uint32_t age; |
| char name[]; |
| } __attribute__ ((packed)) OMFSignatureRSDS; |
| |
| #endif /* PE_H */ |