summaryrefslogtreecommitdiffhomepage
path: root/Boot/Sources/HEL
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-04 16:29:09 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-04 16:29:09 +0200
commit1b92501a27f8781945bc6b19bb43e22588d4c933 (patch)
tree8e73c4045188b0620bd8612dacdbab449ae97f94 /Boot/Sources/HEL
parenta38083f7d528111087949a0ba8e3970f091f2fc9 (diff)
[IMP] ProgramLoader class for PE32+.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Boot/Sources/HEL')
-rw-r--r--Boot/Sources/HEL/AMD64/BootFileReader.cxx30
-rw-r--r--Boot/Sources/HEL/AMD64/BootMain.cxx10
-rw-r--r--Boot/Sources/HEL/AMD64/Support.cxx19
3 files changed, 35 insertions, 24 deletions
diff --git a/Boot/Sources/HEL/AMD64/BootFileReader.cxx b/Boot/Sources/HEL/AMD64/BootFileReader.cxx
index f784bf6f..7b07ee23 100644
--- a/Boot/Sources/HEL/AMD64/BootFileReader.cxx
+++ b/Boot/Sources/HEL/AMD64/BootFileReader.cxx
@@ -123,12 +123,12 @@ BFileReader::~BFileReader()
@param **readUntil** size of file
@param **chunkToRead** chunk to read each time.
*/
-Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead)
+Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr outAddress)
{
if (mBlob == nullptr)
{
EfiFileInfo newPtrInfo;
- UInt32 szInfo = 0;
+ UInt32 szInfo = 0;
EfiGUID cFileInfoGUID = EFI_FILE_INFO_GUID;
@@ -142,11 +142,18 @@ Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead)
mWriter.Write(L"newosldr: physical size: ").Write(readUntil).Write("\r");
}
- if (auto err = BS->AllocatePool(EfiLoaderCode, readUntil, (VoidPtr*)&mBlob) !=
- kEfiOk)
+ if (!outAddress)
{
- mWriter.Write(L"*** error: ").Write(err).Write(L" ***\r");
- EFI::ThrowError(L"OutOfMemory", L"Out of memory.");
+ if (auto err = BS->AllocatePool(EfiLoaderCode, readUntil, (VoidPtr*)&mBlob) !=
+ kEfiOk)
+ {
+ mWriter.Write(L"*** error: ").Write(err).Write(L" ***\r");
+ EFI::ThrowError(L"OutOfMemory", L"Out of memory.");
+ }
+ }
+ else
+ {
+ mBlob = (VoidPtr)outAddress;
}
}
@@ -163,16 +170,7 @@ Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead)
if (res == kBufferTooSmall)
{
- mErrorCode = kTooSmall;
- return;
- }
- else if (res == kEfiOk)
- {
- continue;
- }
- else
- {
- break;
+ bufSize = chunkToRead;
}
}
diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx
index 0c0c9953..6aec67f5 100644
--- a/Boot/Sources/HEL/AMD64/BootMain.cxx
+++ b/Boot/Sources/HEL/AMD64/BootMain.cxx
@@ -157,12 +157,6 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
CGDrawInRegion(CGColor(0xFF, 0xFF, 0xFF), handoverHdrPtr->f_GOP.f_Height, handoverHdrPtr->f_GOP.f_Width, 0, 0);
CGFini();
- // check if we are running in the PC platform. If so abort.
-#if defined(__NEWOS_AMD64__) && !defined(__DEBUG__)
- writer.Write(L"\rnewosldr: AMD64 support is not official.\r");
- EFI::ThrowError(L"Beta-Software", L"Beta Software.");
-#endif
-
// ---------------------------------------------------- //
// The following checks for an exisiting partition
// inside the disk, if it doesn't have one,
@@ -170,7 +164,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
// ---------------------------------------------------- //
BFileReader readerKernel(L"newoskrnl.dll", ImageHandle);
-
+
readerKernel.ReadAll(0);
Boot::ProgramLoader* loader = nullptr;
@@ -198,7 +192,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
// ---------------------------------------------------- //
cg_write_text("NEWOSLDR (C) ZKA TECHNOLOGIES.", 10, 10, RGB(0x00, 0x00, 0x00));
- cg_write_text("SMP OS (MAX 8 CORES).", 20, 10, RGB(0x00, 0x00, 0x00));
+ cg_write_text("LOADING NEWOSKRNL...", 20, 10, RGB(0x00, 0x00, 0x00));
loader->Start(handoverHdrPtr);
diff --git a/Boot/Sources/HEL/AMD64/Support.cxx b/Boot/Sources/HEL/AMD64/Support.cxx
index a2ac6394..8c82f78a 100644
--- a/Boot/Sources/HEL/AMD64/Support.cxx
+++ b/Boot/Sources/HEL/AMD64/Support.cxx
@@ -58,6 +58,25 @@ EXTERN_C size_t strlen(const char* whatToCheck)
return len;
}
+/// @brief strcmp definition in C++.
+EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight)
+{
+ if (!whatToCheck || *whatToCheck == 0)
+ return 0;
+
+ SizeT len = 0;
+
+ while (whatToCheck[len] == whatToCheckRight[len])
+ {
+ if (whatToCheck[len] == 0)
+ return 0;
+
+ ++len;
+ }
+
+ return whatToCheck[len] == whatToCheckRight[len] ? 0 : len;
+}
+
/// @brief somthing specific to the Microsoft's ABI, When the stack grows too big.
EXTERN_C void ___chkstk_ms(void)
{