From c441de22325a85decc0375cb2e75fbc1ddf4ac27 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 4 Jun 2018 01:36:19 +0200 Subject: [PATCH] [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 74b357d4442..63fa4a28e9b 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); -- 2.17.1