#include <freeldr.h>
#include <ndk/ldrtypes.h>
+#include <arc/setupblk.h>
+
#include <debug.h>
// TODO: Move to .h
CHAR SystemPath[512], SearchPath[512];
CHAR FileName[512];
CHAR BootPath[512];
+ CHAR LoadOptions[512];
LPCSTR BootOptions;
PVOID NtosBase = NULL, HalBase = NULL, KdComBase = NULL;
BOOLEAN Status;
HINF InfHandle;
INFCONTEXT InfContext;
PLOADER_PARAMETER_BLOCK LoaderBlock, LoaderBlockVA;
+ PSETUP_LOADER_BLOCK SetupBlock;
KERNEL_ENTRY_POINT KiSystemStartup;
PLDR_DATA_TABLE_ENTRY KernelDTE, HalDTE, KdComDTE = NULL;
// Mm-related things
/* Allocate and minimalistic-initialize LPB */
AllocateAndInitLPB(&LoaderBlock);
+ /* Allocate and initialize setup loader block */
+ SetupBlock = MmHeapAlloc(sizeof(SETUP_LOADER_BLOCK));
+ RtlZeroMemory(SetupBlock, sizeof(SETUP_LOADER_BLOCK));
+ LoaderBlock->SetupLdrBlock = SetupBlock;
+
+ /* Set textmode setup flag */
+ SetupBlock->Flags = SETUPLDR_TEXT_MODE;
+
/* Detect hardware */
UseRealHeap = TRUE;
LoaderBlock->ConfigurationRoot = MachHwDetect();
WinLdrSetupForNt(LoaderBlock, &GdtIdt, &PcrBasePage, &TssBasePage);
/* Initialize Phase 1 - no drivers loading anymore */
- WinLdrInitializePhase1(LoaderBlock, (PCHAR)BootOptions, SystemPath, BootPath, _WIN32_WINNT_WS03);
+ LoadOptions[0] = 0;
+ WinLdrInitializePhase1(LoaderBlock, LoadOptions, SystemPath, BootPath, _WIN32_WINNT_WS03);
/* Save entry-point pointer and Loader block VAs */
KiSystemStartup = (KERNEL_ENTRY_POINT)KernelDTE->EntryPoint;
//WinLdrpDumpBootDriver(LoaderBlockVA);
//WinLdrpDumpArcDisks(LoaderBlockVA);
+ /*asm(".intel_syntax noprefix\n");
+ asm("test1:\n");
+ asm("jmp test1\n");
+ asm(".att_syntax\n");*/
+
/* Pass control */
(*KiSystemStartup)(LoaderBlockVA);
Extension->DrvDBImage = PaToVa(WinLdrLoadModule(MiscFiles,
&Extension->DrvDBSize, LoaderRegistryData));
+ /* Convert extension and setup block pointers */
LoaderBlock->Extension = PaToVa(Extension);
+
+ if (LoaderBlock->SetupLdrBlock)
+ LoaderBlock->SetupLdrBlock = PaToVa(LoaderBlock->SetupLdrBlock);
}
// Last step before going virtual