[FREELDR] Adjust WinLdrInitSystemHive() and its callers to load at startup either...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 3 Jun 2017 14:55:18 +0000 (14:55 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Wed, 24 Oct 2018 22:40:05 +0000 (00:40 +0200)
We now run the 1st-stage setup with a regular system hive, similarly to
what's done for the LiveCD, or for a regular ROS installation.
The ExpInTextModeSetup hacks I previously removed are now completely unneeded.

svn path=/branches/setup_improvements/; revision=74762

boot/freeldr/freeldr/ntldr/setupldr.c
boot/freeldr/freeldr/ntldr/winldr.c
boot/freeldr/freeldr/ntldr/wlregistry.c

index 72e69f8..111194a 100644 (file)
@@ -74,8 +74,13 @@ SetupLdrLoadNlsData(PLOADER_PARAMETER_BLOCK LoaderBlock, HINF InfHandle, LPCSTR
         return;
     }
 
+    TRACE("NLS data %s %s %s\n", AnsiName, OemName, LangName);
+
     Success = WinLdrLoadNLSData(LoaderBlock, SearchPath, AnsiName, OemName, LangName);
     TRACE("NLS data loading %s\n", Success ? "successful" : "failed");
+
+    /* TODO: Load OEM HAL font */
+    // Value "OemHalFont"
 }
 
 static VOID
@@ -128,6 +133,9 @@ SetupLdrScanBootDrivers(PLIST_ENTRY BootDriverListHead, HINF InfHandle, LPCSTR S
     } while (InfFindNextLine(&InfContext, &InfContext));
 }
 
+
+/* SETUP STARTER **************************************************************/
+
 VOID
 LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem,
                  IN USHORT OperatingSystemVersion)
@@ -143,6 +151,7 @@ LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem,
     LPCSTR LoadOptions;
     LPSTR BootOptions;
     BOOLEAN BootFromFloppy;
+    BOOLEAN Success;
     ULONG i, ErrorLine;
     HINF InfHandle;
     INFCONTEXT InfContext;
@@ -163,6 +172,8 @@ LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem,
         NULL
     };
 
+    UiDrawStatusText("Setup is loading...");
+
     /* Get OS setting value */
     SettingsValue[0] = ANSI_NULL;
     IniOpenSection("Operating Systems", &SectionId);
@@ -303,8 +314,6 @@ LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem,
 
     TRACE("BootOptions: '%s'\n", BootOptions);
 
-    UiDrawStatusText("Setup is loading...");
-
     /* Allocate and minimalist-initialize LPB */
     AllocateAndInitLPB(&LoaderBlock);
 
@@ -315,17 +324,30 @@ LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem,
     /* Set textmode setup flag */
     SetupBlock->Flags = SETUPLDR_TEXT_MODE;
 
-    /* Load NLS data, they are in system32 */
+    /* Load the system hive "setupreg.hiv" for setup */
+    UiDrawBackdrop();
+    UiDrawProgressBarCenter(15, 100, "Loading setup system hive...");
+    Success = WinLdrInitSystemHive(LoaderBlock, BootPath, TRUE);
+    TRACE("Setup SYSTEM hive %s\n", (Success ? "loaded" : "not loaded"));
+    /* Bail out if failure */
+    if (!Success)
+        return;
+
+    /* Load NLS data, they are in the System32 directory of the installation medium */
     strcpy(FileName, BootPath);
     strcat(FileName, "system32\\");
     SetupLdrLoadNlsData(LoaderBlock, InfHandle, FileName);
 
+    // UiDrawStatusText("Press F6 if you need to install a 3rd-party SCSI or RAID driver...");
+
     /* Get a list of boot drivers */
     SetupLdrScanBootDrivers(&LoaderBlock->BootDriverListHead, InfHandle, BootPath);
 
     /* Close the inf file */
     InfCloseFile(InfHandle);
 
+    UiDrawStatusText("The Setup program is starting...");
+
     /* Load ReactOS Setup */
     LoadAndBootWindowsCommon(_WIN32_WINNT_WS03,
                              LoaderBlock,
index 6c8da87..e776a84 100644 (file)
@@ -750,7 +750,7 @@ LoadAndBootWindows(IN OperatingSystemItem* OperatingSystem,
     /* Load the system hive */
     UiDrawBackdrop();
     UiDrawProgressBarCenter(15, 100, "Loading system hive...");
-    Success = WinLdrInitSystemHive(LoaderBlock, BootPath);
+    Success = WinLdrInitSystemHive(LoaderBlock, BootPath, FALSE);
     TRACE("SYSTEM hive %s\n", (Success ? "loaded" : "not loaded"));
     /* Bail out if failure */
     if (!Success)
index 5fd438f..641b13f 100644 (file)
@@ -30,20 +30,21 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead,
 
 /* FUNCTIONS **************************************************************/
 
-BOOLEAN
-WinLdrLoadSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
-                     IN LPCSTR DirectoryPath,
-                     IN LPCSTR HiveName)
+static BOOLEAN
+WinLdrLoadSystemHive(
+    IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+    IN PCSTR DirectoryPath,
+    IN PCSTR HiveName)
 {
     ULONG FileId;
-    CHAR FullHiveName[256];
+    CHAR FullHiveName[MAX_PATH];
     ARC_STATUS Status;
     FILEINFORMATION FileInfo;
     ULONG HiveFileSize;
     ULONG_PTR HiveDataPhysical;
     PVOID HiveDataVirtual;
     ULONG BytesRead;
-    LPCWSTR FsService;
+    PCWSTR FsService;
 
     /* Concatenate path and filename to get the full name */
     strcpy(FullHiveName, DirectoryPath);
@@ -94,7 +95,7 @@ WinLdrLoadSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
         return FALSE;
     }
 
-    // Add boot filesystem driver to the list
+    /* Add boot filesystem driver to the list */
     FsService = FsGetServiceName(FileId);
     if (FsService)
     {
@@ -116,25 +117,40 @@ WinLdrLoadSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
     return TRUE;
 }
 
-BOOLEAN WinLdrInitSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
-                             IN LPCSTR DirectoryPath)
+BOOLEAN
+WinLdrInitSystemHive(
+    IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+    IN PCSTR SystemRoot,
+    IN BOOLEAN Setup)
 {
     CHAR SearchPath[1024];
+    PCSTR HiveName;
     BOOLEAN Success;
 
-    // There is a simple logic here: try to load usual hive (system), if it
-    // fails, then give system.alt a try, and finally try a system.sav
+    if (Setup)
+    {
+        strcpy(SearchPath, SystemRoot);
+        HiveName = "SETUPREG.HIV";
+    }
+    else
+    {
+        // There is a simple logic here: try to load usual hive (system), if it
+        // fails, then give system.alt a try, and finally try a system.sav
 
-    // FIXME: For now we only try system
-    strcpy(SearchPath, DirectoryPath);
-    strcat(SearchPath, "system32\\config\\");
-    Success = WinLdrLoadSystemHive(LoaderBlock, SearchPath, "SYSTEM");
+        // FIXME: For now we only try system
+        strcpy(SearchPath, SystemRoot);
+        strcat(SearchPath, "system32\\config\\");
+        HiveName = "SYSTEM";
+    }
+
+    ERR("WinLdrInitSystemHive: try to load hive %s%s\n", SearchPath, HiveName);
+    Success = WinLdrLoadSystemHive(LoaderBlock, SearchPath, HiveName);
 
-    // Fail if failed...
+    /* Fail if failed... */
     if (!Success)
         return FALSE;
 
-    // Import what was loaded
+    /* Import what was loaded */
     Success = RegImportBinaryHive(VaToPa(LoaderBlock->RegistryBase), LoaderBlock->RegistryLength);
     if (!Success)
     {
@@ -142,7 +158,7 @@ BOOLEAN WinLdrInitSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
         return FALSE;
     }
 
-    // Initialize the 'CurrentControlSet' link
+    /* Initialize the 'CurrentControlSet' link */
     if (RegInitCurrentControlSet(FALSE) != ERROR_SUCCESS)
     {
         UiMessageBox("Initializing CurrentControlSet link failed!");
@@ -159,10 +175,10 @@ BOOLEAN WinLdrScanSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
     CHAR AnsiName[256], OemName[256], LangName[256];
     BOOLEAN Success;
 
-    // Scan registry and prepare boot drivers list
+    /* Scan registry and prepare boot drivers list */
     WinLdrScanRegistry(&LoaderBlock->BootDriverListHead, DirectoryPath);
 
-    // Get names of NLS files
+    /* Get names of NLS files */
     Success = WinLdrGetNLSNames(AnsiName, OemName, LangName);
     if (!Success)
     {
@@ -172,13 +188,15 @@ BOOLEAN WinLdrScanSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
 
     TRACE("NLS data %s %s %s\n", AnsiName, OemName, LangName);
 
-    // Load NLS data
+    /* Load NLS data */
     strcpy(SearchPath, DirectoryPath);
     strcat(SearchPath, "system32\\");
     Success = WinLdrLoadNLSData(LoaderBlock, SearchPath, AnsiName, OemName, LangName);
     TRACE("NLS data loading %s\n", Success ? "successful" : "failed");
 
     /* TODO: Load OEM HAL font */
+    // In HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage,
+    // REG_SZ value "OEMHAL"
 
     return TRUE;
 }
@@ -208,7 +226,7 @@ WinLdrGetNLSNames(LPSTR AnsiName,
         return FALSE;
     }
 
-    /* get ANSI codepage */
+    /* Get ANSI codepage */
     BufferSize = sizeof(szIdBuffer);
     rc = RegQueryValue(hKey, L"ACP", NULL, (PUCHAR)szIdBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS)
@@ -227,7 +245,7 @@ WinLdrGetNLSNames(LPSTR AnsiName,
     }
     sprintf(AnsiName, "%S", NameBuffer);
 
-    /* get OEM codepage */
+    /* Get OEM codepage */
     BufferSize = sizeof(szIdBuffer);
     rc = RegQueryValue(hKey, L"OEMCP", NULL, (PUCHAR)szIdBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS)
@@ -246,7 +264,7 @@ WinLdrGetNLSNames(LPSTR AnsiName,
     }
     sprintf(OemName, "%S", NameBuffer);
 
-    /* open the language key */
+    /* Open the language key */
     rc = RegOpenKey(NULL,
         L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Language",
         &hKey);
@@ -256,7 +274,7 @@ WinLdrGetNLSNames(LPSTR AnsiName,
         return FALSE;
     }
 
-    /* get the Unicode case table */
+    /* Get the Unicode case table */
     BufferSize = sizeof(szIdBuffer);
     rc = RegQueryValue(hKey, L"Default", NULL, (PUCHAR)szIdBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS)