https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c441de22325a85decc0375cb2e75fbc1ddf4ac27

commit c441de22325a85decc0375cb2e75fbc1ddf4ac27
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Mon Jun 4 01:36:19 2018 +0200
Commit:     Hermès Bélusca-Maïto <[email protected]>
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);

Reply via email to