[FREELDR]: Headless/EMS support is an x86-specific feature (at least for now, until...
[reactos.git] / reactos / boot / freeldr / freeldr / windows / winldr.c
index 4d96515..073a00a 100644 (file)
@@ -37,6 +37,7 @@ extern char reactos_arc_strings[32][256];
 
 extern BOOLEAN UseRealHeap;
 extern ULONG LoaderPagesSpanned;
+extern BOOLEAN AcpiPresent;
 
 BOOLEAN
 WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
@@ -196,6 +197,33 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
        Extension->MinorVersion = VersionToBoot & 0xFF;
        Extension->Profile.Status = 2;
 
+       /* Check if ACPI is present */
+       if (AcpiPresent)
+       {
+               /* See KiRosFrldrLpbToNtLpb for details */
+               Extension->AcpiTable = (PVOID)1;
+       }
+    
+#ifndef _M_ARM
+    /* Set headless block pointer */
+    extern HEADLESS_LOADER_BLOCK LoaderRedirectionInformation;
+    extern BOOLEAN WinLdrTerminalConnected;
+    if (WinLdrTerminalConnected)
+    {
+        Extension->HeadlessLoaderBlock = MmHeapAlloc(sizeof(HEADLESS_LOADER_BLOCK));
+        if (Extension->HeadlessLoaderBlock == NULL)
+        {
+            UiMessageBox("Failed to allocate HLB Extension!");
+            while (TRUE);
+            return;
+        }
+        RtlCopyMemory(
+            Extension->HeadlessLoaderBlock,
+            &LoaderRedirectionInformation,
+            sizeof(HEADLESS_LOADER_BLOCK));
+        Extension->HeadlessLoaderBlock = PaToVa(Extension->HeadlessLoaderBlock);
+    }
+#endif
        /* Load drivers database */
        strcpy(MiscFiles, BootPath);
        strcat(MiscFiles, "AppPatch\\drvmain.sdb");
@@ -207,6 +235,7 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
 
        if (LoaderBlock->SetupLdrBlock)
                LoaderBlock->SetupLdrBlock = PaToVa(LoaderBlock->SetupLdrBlock);
+
 }
 
 BOOLEAN
@@ -224,7 +253,7 @@ WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock,
        PVOID DriverBase;
 
        // Separate the path to file name and directory path
-       sprintf(DriverPath, "%S", FilePath->Buffer);
+       _snprintf(DriverPath, sizeof(DriverPath), "%wZ", FilePath);
        DriverNamePos = strrchr(DriverPath, '\\');
        if (DriverNamePos != NULL)
        {
@@ -253,13 +282,10 @@ WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock,
        }
 
        // It's not loaded, we have to load it
-       sprintf(FullPath,"%s%S", BootPath, FilePath->Buffer);
+       _snprintf(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath);
        Status = WinLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase);
        if (!Status)
-       {
-               DPRINTM(DPRINT_WINDOWS, "WinLdrLoadImage() failed\n");
                return FALSE;
-       }
 
        // Allocate a DTE for it
        Status = WinLdrAllocateDataTableEntry(LoaderBlock, DllName, DllName, DriverBase, DriverDTE);
@@ -313,13 +339,13 @@ WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock,
                //FIXME: Maybe remove it from the list and try to continue?
                if (!Status)
                {
-                       DPRINTM(DPRINT_WARNING, "Can't load boot driver: %wZ\n", &BootDriver->FilePath);
                        UiMessageBox("Can't load boot driver!");
                        return FALSE;
                }
 
                // Convert the RegistryPath and DTE addresses to VA since we are not going to use it anymore
                BootDriver->RegistryPath.Buffer = PaToVa(BootDriver->RegistryPath.Buffer);
+               BootDriver->FilePath.Buffer = PaToVa(BootDriver->FilePath.Buffer);
                BootDriver->LdrEntry = PaToVa(BootDriver->LdrEntry);
 
                NextBd = BootDriver->Link.Flink;
@@ -470,6 +496,9 @@ LoadAndBootWindows(PCSTR OperatingSystemName,
                DPRINTM(DPRINT_WINDOWS,"BootOptions: '%s'\n", BootOptions);
        }
 
+       /* Append boot-time options */
+       AppendBootTimeOptions(BootOptions);
+
        //
        // Check if a ramdisk file was given
        //
@@ -505,7 +534,12 @@ LoadAndBootWindows(PCSTR OperatingSystemName,
 
        /* Allocate and minimalistic-initialize LPB */
        AllocateAndInitLPB(&LoaderBlock);
-
+    
+#ifndef _M_ARM
+       /* Setup redirection support */
+       extern void WinLdrSetupEms(IN PCHAR BootOptions);
+       WinLdrSetupEms(BootOptions);
+#endif
        /* Detect hardware */
        UseRealHeap = TRUE;
        LoaderBlock->ConfigurationRoot = MachHwDetect();
@@ -587,16 +621,12 @@ LoadAndBootWindows(PCSTR OperatingSystemName,
        /* Turn on paging mode of CPU*/
        WinLdrTurnOnPaging(LoaderBlock, PcrBasePage, TssBasePage, GdtIdt);
 
-DbgPrint("Heeelooo\n");
-
        /* Save final value of LoaderPagesSpanned */
-       LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
+       LoaderBlockVA->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
 
-       DPRINTM(DPRINT_WINDOWS, "Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
+       printf( "Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
                KiSystemStartup, LoaderBlockVA);
 
-DbgPrint("Heeelooo\n");
-
        WinLdrpDumpMemoryDescriptors(LoaderBlockVA);
        WinLdrpDumpBootDriver(LoaderBlockVA);
        WinLdrpDumpArcDisks(LoaderBlockVA);