summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit/PE.hpp
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__ */