diff options
Diffstat (limited to 'Private/KernelKit')
| -rw-r--r-- | Private/KernelKit/DebugOutput.hpp | 35 | ||||
| -rw-r--r-- | Private/KernelKit/PE.hpp | 137 | ||||
| -rw-r--r-- | Private/KernelKit/Rsrc/Util.hxx | 4 |
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 |
