https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c441de22325a85decc0375...
commit c441de22325a85decc0375cb2e75fbc1ddf4ac27 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Mon Jun 4 01:36:19 2018 +0200 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Mon Jun 4 01:36:19 2018 +0200
[SYSSETUP] If creating the default-user hive file fails because the file already exists, make a backup (i.e. rename it) and retry its creation.
This situation happens when one "updates" ReactOS by re-installing it on top of an existing installation. --- dll/win32/syssetup/install.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c index 74b357d444..63fa4a28e9 100644 --- a/dll/win32/syssetup/install.c +++ b/dll/win32/syssetup/install.c @@ -1200,10 +1200,37 @@ SaveDefaultUserHive(VOID)
pSetupEnablePrivilege(L"SeBackupPrivilege", TRUE);
+ /* Save the Default hive */ dwError = RegSaveKeyExW(hUserKey, szDefaultUserHive, NULL, REG_STANDARD_FORMAT); + if (dwError == ERROR_ALREADY_EXISTS) + { + WCHAR szBackupHive[MAX_PATH]; + + /* Build the backup hive file name by replacing the extension */ + wcscpy(szBackupHive, szDefaultUserHive); + wcscpy(&szBackupHive[wcslen(szBackupHive) - 4], L".bak"); + + /* Back up the existing default user hive by renaming it, replacing any possible existing old backup */ + if (!MoveFileExW(szDefaultUserHive, + szBackupHive, + MOVEFILE_REPLACE_EXISTING)) + { + dwError = GetLastError(); + DPRINT1("Failed to create a default-user hive backup '%S', MoveFileExW failed (Error %lu)\n", + szBackupHive, dwError); + } + else + { + /* The backup has been done, retry saving the Default hive */ + dwError = RegSaveKeyExW(hUserKey, + szDefaultUserHive, + NULL, + REG_STANDARD_FORMAT); + } + } if (dwError != ERROR_SUCCESS) { DPRINT1("RegSaveKeyExW() failed (Error %lu)\n", dwError);