Author: hbelusca Date: Sat Jun 3 14:55:18 2017 New Revision: 74762
URL: http://svn.reactos.org/svn/reactos?rev=74762&view=rev Log: [FREELDR]: Adjust WinLdrInitSystemHive() and its callers to load either the regular SYSTEM hive, or the SETUPREG.HIV setup system hive, at startup. 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 indeed now unneeded.
Modified: branches/setup_improvements/boot/freeldr/freeldr/ntldr/setupldr.c branches/setup_improvements/boot/freeldr/freeldr/ntldr/winldr.c branches/setup_improvements/boot/freeldr/freeldr/ntldr/wlregistry.c
Modified: branches/setup_improvements/boot/freeldr/freeldr/ntldr/setupldr.c URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/boot/freeldr/... ============================================================================== --- branches/setup_improvements/boot/freeldr/freeldr/ntldr/setupldr.c [iso-8859-1] (original) +++ branches/setup_improvements/boot/freeldr/freeldr/ntldr/setupldr.c [iso-8859-1] Sat Jun 3 14:55:18 2017 @@ -74,8 +74,13 @@ 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 @@ -127,6 +132,9 @@ } } while (InfFindNextLine(&InfContext, &InfContext)); } + + +/* SETUP STARTER **************************************************************/
VOID LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem, @@ -143,6 +151,7 @@ LPCSTR LoadOptions; LPSTR BootOptions; BOOLEAN BootFromFloppy; + BOOLEAN Success; ULONG i, ErrorLine; HINF InfHandle; INFCONTEXT InfContext; @@ -162,6 +171,8 @@ "reactos\", NULL }; + + UiDrawStatusText("Setup is loading...");
/* Get OS setting value */ SettingsValue[0] = ANSI_NULL; @@ -303,8 +314,6 @@
TRACE("BootOptions: '%s'\n", BootOptions);
- UiDrawStatusText("Setup is loading..."); - /* Allocate and minimalist-initialize LPB */ AllocateAndInitLPB(&LoaderBlock);
@@ -315,16 +324,29 @@ /* 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\"); + 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,
Modified: branches/setup_improvements/boot/freeldr/freeldr/ntldr/winldr.c URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/boot/freeldr/... ============================================================================== --- branches/setup_improvements/boot/freeldr/freeldr/ntldr/winldr.c [iso-8859-1] (original) +++ branches/setup_improvements/boot/freeldr/freeldr/ntldr/winldr.c [iso-8859-1] Sat Jun 3 14:55:18 2017 @@ -750,7 +750,7 @@ /* 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)
Modified: branches/setup_improvements/boot/freeldr/freeldr/ntldr/wlregistry.c URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/boot/freeldr/... ============================================================================== --- branches/setup_improvements/boot/freeldr/freeldr/ntldr/wlregistry.c [iso-8859-1] (original) +++ branches/setup_improvements/boot/freeldr/freeldr/ntldr/wlregistry.c [iso-8859-1] Sat Jun 3 14:55:18 2017 @@ -30,20 +30,21 @@
/* 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 @@ 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 @@ 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 - - // FIXME: For now we only try system - strcpy(SearchPath, DirectoryPath); - strcat(SearchPath, "SYSTEM32\CONFIG\"); - Success = WinLdrLoadSystemHive(LoaderBlock, SearchPath, "SYSTEM"); - - // Fail if failed... + 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, 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... */ 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 @@ return FALSE; }
- // Initialize the 'CurrentControlSet' link + /* Initialize the 'CurrentControlSet' link */ if (RegInitCurrentControlSet(FALSE) != ERROR_SUCCESS) { UiMessageBox("Initializing CurrentControlSet link failed!"); @@ -159,10 +175,10 @@ 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 @@
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 @@ 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 @@ } 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 @@ } 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 @@ 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)