https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c441de22325a85decc037…
commit c441de22325a85decc0375cb2e75fbc1ddf4ac27
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Mon Jun 4 01:36:19 2018 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)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);