blob: f397ff4809ec7c6457d5720b305724096a4b3212 (
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
124
125
126
|
/* -------------------------------------------
Copyright Mahrouss Logic
File: PE.hpp
Purpose: Portable Executable for NewOS.
Revision History:
30/01/24: Added file (amlel)
------------------------------------------- */
#ifndef __PE__
#define __PE__
#include <NewKit/Defines.hpp>
#include <KernelKit/PE.hpp>
namespace Detail
{
typedef NewOS::UIntPtr PE_QWORD;
typedef NewOS::UInt32 PE_DWORD;
typedef NewOS::UInt16 PE_WORD;
typedef NewOS::UChar PE_BYTE;
} // namespace Detail
#define kPeMagic 0x00004550
typedef struct ExecHeader final {
Detail::PE_DWORD mMagic; // PE\0\0 or 0x00004550
Detail::PE_WORD mMachine;
Detail::PE_WORD mNumberOfSections;
Detail::PE_DWORD mTimeDateStamp;
Detail::PE_DWORD mPointerToSymbolTable;
Detail::PE_DWORD mNumberOfSymbols;
Detail::PE_WORD mSizeOfOptionalHeader;
Detail::PE_WORD mCharacteristics;
} ALIGN(8) ExecHeader, *ExecHeaderPtr;
#define kMagPE32 0x010b
#define kMagPE64 0x020b
#define kPEMachineAMD64 0x8664
#define kPEMachineARM64 0xaa64
typedef struct ExecOptionalHeader final {
Detail::PE_WORD mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit)
Detail::PE_BYTE mMajorLinkerVersion;
Detail::PE_BYTE mMinorLinkerVersion;
Detail::PE_QWORD mSizeOfCode;
Detail::PE_QWORD mSizeOfInitializedData;
Detail::PE_QWORD mSizeOfUninitializedData;
Detail::PE_DWORD mAddressOfEntryPoint;
Detail::PE_DWORD mBaseOfCode;
Detail::PE_QWORD mImageBase;
Detail::PE_DWORD mSectionAlignment;
Detail::PE_DWORD mFileAlignment;
Detail::PE_WORD mMajorOperatingSystemVersion;
Detail::PE_WORD mMinorOperatingSystemVersion;
Detail::PE_WORD mMajorImageVersion;
Detail::PE_WORD mMinorImageVersion;
Detail::PE_WORD mMajorSubsystemVersion;
Detail::PE_WORD mMinorSubsystemVersion;
Detail::PE_DWORD mWin32VersionValue;
Detail::PE_QWORD mSizeOfImage;
Detail::PE_QWORD mSizeOfHeaders;
Detail::PE_DWORD mCheckSum;
Detail::PE_WORD mSubsystem;
Detail::PE_WORD mDllCharacteristics;
Detail::PE_QWORD mSizeOfStackReserve;
Detail::PE_QWORD mSizeOfStackCommit;
Detail::PE_QWORD mSizeOfHeapReserve;
Detail::PE_QWORD mSizeOfHeapCommit;
Detail::PE_DWORD mLoaderFlags;
Detail::PE_DWORD mNumberOfRvaAndSizes;
} ExecOptionalHeader, *ExecOptionalHeaderPtr;
typedef struct ExecSectionHeader final {
CONST Detail::PE_BYTE mName[8];
Detail::PE_DWORD mVirtualSize;
Detail::PE_DWORD mVirtualAddress;
Detail::PE_DWORD mSizeOfRawData;
Detail::PE_DWORD mPointerToRawData;
Detail::PE_DWORD mPointerToRelocations;
Detail::PE_DWORD mPointerToLinenumbers;
Detail::PE_WORD mNumberOfRelocations;
Detail::PE_WORD mNumberOfLinenumbers;
Detail::PE_DWORD mCharacteristics;
} ExecSectionHeader, *ExecSectionHeaderPtr;
enum kExecDataDirParams {
kExecExport,
kExecImport,
kExecInvalid,
kExecCount,
};
typedef struct ExecExportDirectory {
Detail::PE_DWORD mCharacteristics;
Detail::PE_DWORD mTimeDateStamp;
Detail::PE_WORD mMajorVersion;
Detail::PE_WORD mMinorVersion;
Detail::PE_DWORD mName;
Detail::PE_DWORD mBase;
Detail::PE_DWORD mNumberOfFunctions;
Detail::PE_DWORD mNumberOfNames;
Detail::PE_DWORD mAddressOfFunctions; // export table rva
Detail::PE_DWORD mAddressOfNames;
Detail::PE_DWORD mAddressOfNameOrdinal; // ordinal table rva
} ExecExportDirectory, *ExecExportDirectoryPtr;
typedef struct ExecImportDirectory {
union {
Detail::PE_DWORD mCharacteristics;
Detail::PE_DWORD mOriginalFirstThunk;
};
Detail::PE_DWORD mTimeDateStamp;
Detail::PE_DWORD mForwarderChain;
Detail::PE_DWORD mNameRva;
Detail::PE_DWORD mThunkTableRva;
} ExecImportDirectory, *ExecImportDirectoryPtr;
#define kPeStart "__hcore_subsys_start"
#endif /* ifndef __PE__ */
|