summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit
diff options
context:
space:
mode:
Diffstat (limited to 'Private/KernelKit')
-rw-r--r--Private/KernelKit/DebugOutput.hpp35
-rw-r--r--Private/KernelKit/PE.hpp137
-rw-r--r--Private/KernelKit/Rsrc/Util.hxx4
3 files changed, 106 insertions, 70 deletions
diff --git a/Private/KernelKit/DebugOutput.hpp b/Private/KernelKit/DebugOutput.hpp
index 75031687..a2355cd8 100644
--- a/Private/KernelKit/DebugOutput.hpp
+++ b/Private/KernelKit/DebugOutput.hpp
@@ -55,7 +55,40 @@ inline TerminalDevice carriage_return() {
return selfTerm;
}
-inline TerminalDevice get_buffer(Char* buf) {
+namespace Detail {
+inline TerminalDevice _write_number_hex(const Long &x, TerminalDevice& term) {
+ int y = x / 16;
+ int h = x % 16;
+
+ if (y) _write_number_hex(y, term);
+
+ /* fail if the hex number is not base-16 */
+ if (h > 15) {
+ _write_number_hex('?', term);
+ return term;
+ }
+
+ if (y < 0) y = -y;
+
+ const char NUMBERS[17] = "0123456789ABCDEF";
+
+ Char buf[2];
+ buf[0] = NUMBERS[h];
+ buf[1] = 0;
+
+ term << buf;
+ return term;
+}
+} // namespace Detail
+
+inline TerminalDevice hex_number(const Long &x) {
+ TerminalDevice selfTerm = TerminalDevice::Shared();
+ Detail::_write_number_hex(x, selfTerm);
+
+ return selfTerm;
+}
+
+inline TerminalDevice get_console_in(Char* buf) {
TerminalDevice selfTerm = TerminalDevice::Shared();
selfTerm >> buf;
return selfTerm;
diff --git a/Private/KernelKit/PE.hpp b/Private/KernelKit/PE.hpp
index 3a2db99f..3fd4f965 100644
--- a/Private/KernelKit/PE.hpp
+++ b/Private/KernelKit/PE.hpp
@@ -19,24 +19,23 @@
namespace Detail
{
- typedef HCore::UIntPtr U64;
- typedef HCore::UInt32 U32;
- typedef HCore::UInt16 U16;
- typedef HCore::UInt8 U8;
- typedef Detail::U8 BYTE;
+ typedef HCore::UIntPtr PE_QWORD;
+ typedef HCore::UInt32 PE_DWORD;
+ typedef HCore::UInt16 PE_WORD;
+ typedef HCore::UChar PE_BYTE;
} // namespace Detail
#define kPeMagic 0x00004550
typedef struct ExecHeader final {
- Detail::U32 mMagic; // PE\0\0 or 0x00004550
- Detail::U16 mMachine;
- Detail::U16 mNumberOfSections;
- Detail::U32 mTimeDateStamp;
- Detail::U32 mPointerToSymbolTable;
- Detail::U32 mNumberOfSymbols;
- Detail::U16 mSizeOfOptionalHeader;
- Detail::U16 mCharacteristics;
+ 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
@@ -46,48 +45,48 @@ typedef struct ExecHeader final {
#define kPEMachineARM64 0xaa64
typedef struct ExecOptionalHeader final {
- Detail::U16 mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit)
- Detail::U8 mMajorLinkerVersion;
- Detail::U8 mMinorLinkerVersion;
- Detail::U64 mSizeOfCode;
- Detail::U64 mSizeOfInitializedData;
- Detail::U64 mSizeOfUninitializedData;
- Detail::U32 mAddressOfEntryPoint;
- Detail::U32 mBaseOfCode;
- Detail::U64 mImageBase;
- Detail::U32 mSectionAlignment;
- Detail::U32 mFileAlignment;
- Detail::U16 mMajorOperatingSystemVersion;
- Detail::U16 mMinorOperatingSystemVersion;
- Detail::U16 mMajorImageVersion;
- Detail::U16 mMinorImageVersion;
- Detail::U16 mMajorSubsystemVersion;
- Detail::U16 mMinorSubsystemVersion;
- Detail::U32 mWin32VersionValue;
- Detail::U64 mSizeOfImage;
- Detail::U64 mSizeOfHeaders;
- Detail::U32 mCheckSum;
- Detail::U16 mSubsystem;
- Detail::U16 mDllCharacteristics;
- Detail::U64 mSizeOfStackReserve;
- Detail::U64 mSizeOfStackCommit;
- Detail::U64 mSizeOfHeapReserve;
- Detail::U64 mSizeOfHeapCommit;
- Detail::U32 mLoaderFlags;
- Detail::U32 mNumberOfRvaAndSizes;
+ 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 {
- Detail::BYTE mName[8];
- Detail::U32 mVirtualSize;
- Detail::U32 mVirtualAddress;
- Detail::U32 mSizeOfRawData;
- Detail::U32 mPointerToRawData;
- Detail::U32 mPointerToRelocations;
- Detail::U32 mPointerToLinenumbers;
- Detail::U16 mNumberOfRelocations;
- Detail::U16 mNumberOfLinenumbers;
- Detail::U32 mCharacteristics;
+ 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 {
@@ -98,28 +97,28 @@ enum kExecDataDirParams {
};
typedef struct ExecExportDirectory {
- Detail::U32 mCharacteristics;
- Detail::U32 mTimeDateStamp;
- Detail::U16 mMajorVersion;
- Detail::U16 mMinorVersion;
- Detail::U32 mName;
- Detail::U32 mBase;
- Detail::U32 mNumberOfFunctions;
- Detail::U32 mNumberOfNames;
- Detail::U32 mAddressOfFunctions; // export table rva
- Detail::U32 mAddressOfNames;
- Detail::U32 mAddressOfNameOrdinal; // ordinal table rva
+ 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::U32 mCharacteristics;
- Detail::U32 mOriginalFirstThunk;
+ Detail::PE_DWORD mCharacteristics;
+ Detail::PE_DWORD mOriginalFirstThunk;
};
- Detail::U32 mTimeDateStamp;
- Detail::U32 mForwarderChain;
- Detail::U32 mNameRva;
- Detail::U32 mThunkTableRva;
+ Detail::PE_DWORD mTimeDateStamp;
+ Detail::PE_DWORD mForwarderChain;
+ Detail::PE_DWORD mNameRva;
+ Detail::PE_DWORD mThunkTableRva;
} ExecImportDirectory, *ExecImportDirectoryPtr;
#define kPeStart "__hcore_subsys_start"
diff --git a/Private/KernelKit/Rsrc/Util.hxx b/Private/KernelKit/Rsrc/Util.hxx
index 2ff81076..bf753055 100644
--- a/Private/KernelKit/Rsrc/Util.hxx
+++ b/Private/KernelKit/Rsrc/Util.hxx
@@ -5,6 +5,7 @@
// Sat Feb 24 CET 2024
#define KeInitRsrc() HCore::SizeT uA = 0
+
#define KeClearRsrc() uA = 0
/// @brief draws a resource.
@@ -33,6 +34,7 @@
} \
}
+
/// @brief cleans a resource.
#define KeClearZone(_Height, _Width, BaseX, BaseY) \
\
@@ -47,6 +49,7 @@
} \
}
+
#define KeDrawZone(_Clr, _Height, _Width, BaseX, BaseY) \
\
for (HCore::SizeT i = BaseX; i < _Height + BaseX; ++i) { \
@@ -60,4 +63,5 @@
} \
}
+
#endif