https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0b2b53b9c3e002276c6c03...
commit 0b2b53b9c3e002276c6c034c8d43b9e7d8453d92 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sat Jun 3 14:55:18 2017 +0000 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Thu Oct 25 00:40:05 2018 +0200
[FREELDR] Adjust WinLdrInitSystemHive() and its callers to load at startup either the regular SYSTEM hive, or the SETUPREG.HIV setup system hive.
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 | 28 ++++++++++++-- boot/freeldr/freeldr/ntldr/winldr.c | 2 +- boot/freeldr/freeldr/ntldr/wlregistry.c | 68 +++++++++++++++++++++------------ 3 files changed, 69 insertions(+), 29 deletions(-)
diff --git a/boot/freeldr/freeldr/ntldr/setupldr.c b/boot/freeldr/freeldr/ntldr/setupldr.c index 72e69f889c..111194acd0 100644 --- a/boot/freeldr/freeldr/ntldr/setupldr.c +++ b/boot/freeldr/freeldr/ntldr/setupldr.c @@ -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, diff --git a/boot/freeldr/freeldr/ntldr/winldr.c b/boot/freeldr/freeldr/ntldr/winldr.c index 6c8da87683..e776a84024 100644 --- a/boot/freeldr/freeldr/ntldr/winldr.c +++ b/boot/freeldr/freeldr/ntldr/winldr.c @@ -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) diff --git a/boot/freeldr/freeldr/ntldr/wlregistry.c b/boot/freeldr/freeldr/ntldr/wlregistry.c index 5fd438fd14..641b13f69e 100644 --- a/boot/freeldr/freeldr/ntldr/wlregistry.c +++ b/boot/freeldr/freeldr/ntldr/wlregistry.c @@ -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)