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