blob: b4adf732339024e4915d1d8d07a68fd8829f5a47 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/* -------------------------------------------
Copyright SoftwareLabs
File: PE.hxx
Purpose: Portable Executable for NewOS.
Revision History:
30/01/24: Added file (amlel)
------------------------------------------- */
#ifndef __PE__
#define __PE__
#include <NewKit/Defines.hpp>
#define kPeMagic 0x00004550
typedef struct ExecHeader final
{
NewOS::UInt32 mMagic; // PE\0\0 or 0x00004550
NewOS::UInt16 mMachine;
NewOS::UInt16 mNumberOfSections;
NewOS::UInt32 mTimeDateStamp;
NewOS::UInt32 mPointerToSymbolTable;
NewOS::UInt32 mNumberOfSymbols;
NewOS::UInt16 mSizeOfOptionalHeader;
NewOS::UInt16 mCharacteristics;
} ALIGN(8) ExecHeader, *ExecHeaderPtr;
#define kMagPE32 0x010b
#define kMagPE64 0x020b
#define kPEMachineAMD64 0x8664
#define kPEMachineARM64 0xaa64
typedef struct ExecOptionalHeader final
{
NewOS::UInt16 mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit)
NewOS::UChar mMajorLinkerVersion;
NewOS::UChar mMinorLinkerVersion;
NewOS::UIntPtr mSizeOfCode;
NewOS::UIntPtr mSizeOfInitializedData;
NewOS::UIntPtr mSizeOfUninitializedData;
NewOS::UInt32 mAddressOfEntryPoint;
NewOS::UInt32 mBaseOfCode;
NewOS::UIntPtr mImageBase;
NewOS::UInt32 mSectionAlignment;
NewOS::UInt32 mFileAlignment;
NewOS::UInt16 mMajorOperatingSystemVersion;
NewOS::UInt16 mMinorOperatingSystemVersion;
NewOS::UInt16 mMajorImageVersion;
NewOS::UInt16 mMinorImageVersion;
NewOS::UInt16 mMajorSubsystemVersion;
NewOS::UInt16 mMinorSubsystemVersion;
NewOS::UInt32 mWin32VersionValue;
NewOS::UIntPtr mSizeOfImage;
NewOS::UIntPtr mSizeOfHeaders;
NewOS::UInt32 mCheckSum;
NewOS::UInt16 mSubsystem;
NewOS::UInt16 mDllCharacteristics;
NewOS::UIntPtr mSizeOfStackReserve;
NewOS::UIntPtr mSizeOfStackCommit;
NewOS::UIntPtr mSizeOfHeapReserve;
NewOS::UIntPtr mSizeOfHeapCommit;
NewOS::UInt32 mLoaderFlags;
NewOS::UInt32 mNumberOfRvaAndSizes;
} ExecOptionalHeader, *ExecOptionalHeaderPtr;
typedef struct ExecSectionHeader final
{
CONST NewOS::UChar mName[8];
NewOS::UInt32 mVirtualSize;
NewOS::UInt32 mVirtualAddress;
NewOS::UInt32 mSizeOfRawData;
NewOS::UInt32 mPointerToRawData;
NewOS::UInt32 mPointerToRelocations;
NewOS::UInt32 mPointerToLinenumbers;
NewOS::UInt16 mNumberOfRelocations;
NewOS::UInt16 mNumberOfLinenumbers;
NewOS::UInt32 mCharacteristics;
} ExecSectionHeader, *ExecSectionHeaderPtr;
enum kExecDataDirParams
{
kExecExport,
kExecImport,
kExecInvalid,
kExecCount,
};
typedef struct ExecExportDirectory
{
NewOS::UInt32 mCharacteristics;
NewOS::UInt32 mTimeDateStamp;
NewOS::UInt16 mMajorVersion;
NewOS::UInt16 mMinorVersion;
NewOS::UInt32 mName;
NewOS::UInt32 mBase;
NewOS::UInt32 mNumberOfFunctions;
NewOS::UInt32 mNumberOfNames;
NewOS::UInt32 mAddressOfFunctions; // export table rva
NewOS::UInt32 mAddressOfNames;
NewOS::UInt32 mAddressOfNameOrdinal; // ordinal table rva
} ExecExportDirectory, *ExecExportDirectoryPtr;
typedef struct ExecImportDirectory
{
union {
NewOS::UInt32 mCharacteristics;
NewOS::UInt32 mOriginalFirstThunk;
};
NewOS::UInt32 mTimeDateStamp;
NewOS::UInt32 mForwarderChain;
NewOS::UInt32 mNameRva;
NewOS::UInt32 mThunkTableRva;
} ExecImportDirectory, *ExecImportDirectoryPtr;
#define kPeStart "__hcore_subsys_start"
#endif /* ifndef __PE__ */
|