[SYSSETUP] If creating the default-user hive file fails because the file already...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 3 Jun 2018 23:36:19 +0000 (01:36 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 3 Jun 2018 23:36:19 +0000 (01:36 +0200)
This situation happens when one "updates" ReactOS by re-installing it on top of an existing installation.

dll/win32/syssetup/install.c

index 74b357d..63fa4a2 100644 (file)
@@ -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);