summaryrefslogtreecommitdiffhomepage
path: root/Boot/Sources/ProgramLoader.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Boot/Sources/ProgramLoader.cxx')
-rw-r--r--Boot/Sources/ProgramLoader.cxx49
1 files changed, 41 insertions, 8 deletions
diff --git a/Boot/Sources/ProgramLoader.cxx b/Boot/Sources/ProgramLoader.cxx
index 88e2f14a..5938c2a0 100644
--- a/Boot/Sources/ProgramLoader.cxx
+++ b/Boot/Sources/ProgramLoader.cxx
@@ -8,7 +8,10 @@
#include <BootKit/Support.hxx>
#include <BootKit/BootKit.hxx>
-#include <KernelKit/PEF.hpp>
+#include <KernelKit/PEF.hxx>
+#include <KernelKit/PE.hxx>
+#include <KernelKit/MSDOS.hxx>
+#include <CFKit/LoaderUtils.hxx>
EXTERN_C
{
@@ -17,6 +20,8 @@ EXTERN_C
namespace Boot
{
+ EXTERN_C Int32 rt_jump_to_address(HEL::HandoverProc baseCode, HEL::HandoverInformationHeader* handover, Char* stackPointer);
+
ProgramLoader::ProgramLoader(VoidPtr blob)
: fBlob(blob), fStartAddress(nullptr)
{
@@ -34,9 +39,21 @@ namespace Boot
if (firstBytes[0] == kMagMz0 &&
firstBytes[1] == kMagMz1)
{
+ writer.Write("newosldr: MZ executable detected.\r");
+
+ ExecHeaderPtr hdrPtr = (ldr_find_exec_header(firstBytes));
+ ExecOptionalHeaderPtr optHdr = (ldr_find_opt_exec_header(firstBytes));
+
// Parse PE32+
- fStartAddress = nullptr;
- writer.Write("newosldr: MZ executable detected.\r");
+ fStartAddress = (VoidPtr)((UIntPtr)optHdr->mImageBase + optHdr->mBaseOfCode + optHdr->mAddressOfEntryPoint);
+ fStackPtr = new Char[optHdr->mSizeOfStackReserve];
+
+ writer.Write("newosldr: Major Linker: ").Write(optHdr->mMajorLinkerVersion).Write("\r");
+ writer.Write("newosldr: Minor Linker: ").Write(optHdr->mMinorLinkerVersion).Write("\r");
+ writer.Write("newosldr: Major Subsystem: ").Write(optHdr->mMajorSubsystemVersion).Write("\r");
+ writer.Write("newosldr: Minor Subsystem: ").Write(optHdr->mMinorSubsystemVersion).Write("\r");
+ writer.Write("newosldr: Magic: ").Write(optHdr->mMagic).Write("\r");
+ writer.Write("newosldr: StartAddress: ").Write((UIntPtr)optHdr->mImageBase + optHdr->mBaseOfCode + optHdr->mAddressOfEntryPoint).Write("\r");
}
else if (firstBytes[0] == kPefMagic[0] &&
firstBytes[1] == kPefMagic[1] &&
@@ -56,18 +73,34 @@ namespace Boot
/// @note handover header has to be valid!
Void ProgramLoader::Start(HEL::HandoverInformationHeader* handover)
{
- MUST_PASS(handover);
+ BTextWriter writer;
+
+ if (!handover)
+ {
+ writer.Write("newosldr: Exec format error.\r");
+ return;
+ }
- BTextWriter writer;
writer.Write("newosldr: Trying to run: ").Write(fBlobName).Write("\r");
- if (!fStartAddress)
+ if (!fStartAddress ||
+ ((Char*)fStartAddress)[0] == 0x0)
{
- writer.Write("newosldr: Exec format error.\r");
+ HEL::HandoverProc fn = [](HEL::HandoverInformationHeader* rcx) -> void {
+ BTextWriter writer;
+ writer.Write("newosldr: Exec format error, Thread has been aborted.\r");
+
+ EFI::ThrowError(L"Exec-Format-Error", L"Format doesn't match (Thread aborted.)");
+ };
+
+ rt_jump_to_address(fn, handover, fStackPtr);
+
return;
}
- ((HEL::HandoverProc)fStartAddress)(handover);
+ HEL::HandoverProc start = reinterpret_cast<HEL::HandoverProc>((UIntPtr)fStartAddress);
+
+ rt_jump_to_address(start, handover, fStackPtr);
}
const Char* ProgramLoader::GetName()