https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8f939e057c23e1585acab…
commit 8f939e057c23e1585acab1b2f4d08bf7bf549a58
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sat Sep 29 01:31:02 2018 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sat Sep 29 01:31:58 2018 +0200
[SERVICES] Control set code clean-up
- Flush the new control set after the control set has been created.
- Make sure that we create a new control set only on the first boot after setup.
- Move the control set copy code to a separate function.
- Get rid of the global control set values.
---
base/system/services/controlset.c | 272 +++++++++++++++++++++-----------------
base/system/services/services.c | 7 +-
base/system/services/services.h | 4 +-
3 files changed, 157 insertions(+), 126 deletions(-)
diff --git a/base/system/services/controlset.c b/base/system/services/controlset.c
index 948f3ddc79..6cd74204c0 100644
--- a/base/system/services/controlset.c
+++ b/base/system/services/controlset.c
@@ -17,24 +17,16 @@
/* GLOBALS *******************************************************************/
-static DWORD dwCurrentControlSet;
-static DWORD dwDefaultControlSet;
-static DWORD dwFailedControlSet;
-static DWORD dwLastKnownGoodControlSet;
-
/* FUNCTIONS *****************************************************************/
+#if (_WIN32_WINNT < 0x0600)
static
DWORD
-ScmCopyKey(HKEY hDstKey,
- HKEY hSrcKey)
+ScmCopyTree(
+ HKEY hSrcKey,
+ HKEY hDstKey)
{
-#if (_WIN32_WINNT >= 0x0600)
- return RegCopyTreeW(hSrcKey,
- NULL,
- hDstKey);
-#else
FILETIME LastWrite;
DWORD dwSubKeys;
DWORD dwValues;
@@ -53,7 +45,7 @@ ScmCopyKey(HKEY hDstKey,
HKEY hSrcSubKey;
DWORD dwError;
- DPRINT("ScmCopyKey()\n");
+ DPRINT("ScmCopyTree()\n");
dwError = RegQueryInfoKey(hSrcKey,
NULL,
@@ -147,8 +139,8 @@ ScmCopyKey(HKEY hDstKey,
return dwError;
}
- dwError = ScmCopyKey(hDstSubKey,
- hSrcSubKey);
+ dwError = ScmCopyTree(hSrcSubKey,
+ hDstSubKey);
if (dwError != ERROR_SUCCESS)
{
DPRINT1("Error: %lu\n", dwError);
@@ -245,89 +237,93 @@ ScmCopyKey(HKEY hDstKey,
lpNameBuffer);
}
- DPRINT("ScmCopyKey() done \n");
+ DPRINT("ScmCopyTree() done \n");
return ERROR_SUCCESS;
-#endif
}
+#endif
static
-BOOL
-ScmGetControlSetValues(VOID)
+DWORD
+ScmGetControlSetValues(
+ PDWORD pdwCurrentControlSet,
+ PDWORD pdwDefaultControlSet,
+ PDWORD pdwFailedControlSet,
+ PDWORD pdwLastKnownGoodControlSet)
{
HKEY hSelectKey;
DWORD dwType;
DWORD dwSize;
- LONG lError;
+ DWORD dwError;
DPRINT("ScmGetControlSetValues() called\n");
- lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
- L"System\\Select",
- 0,
- KEY_READ,
- &hSelectKey);
- if (lError != ERROR_SUCCESS)
- return FALSE;
+ dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+ L"System\\Select",
+ 0,
+ KEY_READ,
+ &hSelectKey);
+ if (dwError != ERROR_SUCCESS)
+ return dwError;
dwSize = sizeof(DWORD);
- lError = RegQueryValueExW(hSelectKey,
- L"Current",
- 0,
- &dwType,
- (LPBYTE)&dwCurrentControlSet,
- &dwSize);
- if (lError != ERROR_SUCCESS)
+ dwError = RegQueryValueExW(hSelectKey,
+ L"Current",
+ 0,
+ &dwType,
+ (LPBYTE)pdwCurrentControlSet,
+ &dwSize);
+ if (dwError != ERROR_SUCCESS)
{
- dwCurrentControlSet = 0;
+ *pdwCurrentControlSet = 0;
}
dwSize = sizeof(DWORD);
- lError = RegQueryValueExW(hSelectKey,
- L"Default",
- 0,
- &dwType,
- (LPBYTE)&dwDefaultControlSet,
- &dwSize);
- if (lError != ERROR_SUCCESS)
+ dwError = RegQueryValueExW(hSelectKey,
+ L"Default",
+ 0,
+ &dwType,
+ (LPBYTE)pdwDefaultControlSet,
+ &dwSize);
+ if (dwError != ERROR_SUCCESS)
{
- dwDefaultControlSet = 0;
+ *pdwDefaultControlSet = 0;
}
dwSize = sizeof(DWORD);
- lError = RegQueryValueExW(hSelectKey,
- L"Failed",
- 0,
- &dwType,
- (LPBYTE)&dwFailedControlSet,
- &dwSize);
- if (lError != ERROR_SUCCESS)
+ dwError = RegQueryValueExW(hSelectKey,
+ L"Failed",
+ 0,
+ &dwType,
+ (LPBYTE)pdwFailedControlSet,
+ &dwSize);
+ if (dwError != ERROR_SUCCESS)
{
- dwFailedControlSet = 0;
+ *pdwFailedControlSet = 0;
}
dwSize = sizeof(DWORD);
- lError = RegQueryValueExW(hSelectKey,
- L"LastKnownGood",
- 0,
- &dwType,
- (LPBYTE)&dwLastKnownGoodControlSet,
- &dwSize);
- if (lError != ERROR_SUCCESS)
+ dwError = RegQueryValueExW(hSelectKey,
+ L"LastKnownGood",
+ 0,
+ &dwType,
+ (LPBYTE)pdwLastKnownGoodControlSet,
+ &dwSize);
+ if (dwError != ERROR_SUCCESS)
{
- dwLastKnownGoodControlSet = 0;
+ *pdwLastKnownGoodControlSet = 0;
}
RegCloseKey(hSelectKey);
DPRINT("ControlSets:\n");
- DPRINT("Current: %lu\n", dwCurrentControlSet);
- DPRINT("Default: %lu\n", dwDefaultControlSet);
- DPRINT("Failed: %lu\n", dwFailedControlSet);
- DPRINT("LastKnownGood: %lu\n", dwLastKnownGoodControlSet);
+ DPRINT("Current: %lu\n", *pdwCurrentControlSet);
+ DPRINT("Default: %lu\n", *pdwDefaultControlSet);
+ DPRINT("Failed: %lu\n", *pdwFailedControlSet);
+ DPRINT("LastKnownGood: %lu\n", *pdwLastKnownGoodControlSet);
- return TRUE;
+ return dwError;
}
@@ -354,6 +350,7 @@ ScmSetLastKnownGoodControlSet(
(LPBYTE)&dwControlSet,
sizeof(dwControlSet));
+ RegFlushKey(hSelectKey);
RegCloseKey(hSelectKey);
return dwError;
@@ -396,91 +393,124 @@ ScmGetSetupInProgress(VOID)
}
-BOOL
-ScmUpdateControlSets(VOID)
+static
+DWORD
+ScmCopyControlSet(
+ DWORD dwSourceControlSet,
+ DWORD dwDestinationControlSet)
{
- WCHAR szCurrentControlSetName[32];
- WCHAR szNewControlSetName[32];
- HKEY hCurrentControlSetKey = NULL;
- HKEY hNewControlSetKey = NULL;
- DWORD dwNewControlSet, dwDisposition;
+ WCHAR szSourceControlSetName[32];
+ WCHAR szDestinationControlSetName[32];
+ HKEY hSourceControlSetKey = NULL;
+ HKEY hDestinationControlSetKey = NULL;
+ DWORD dwDisposition;
DWORD dwError;
- /* Do not create a new control set when the system setup is running */
- if (ScmGetSetupInProgress() != 0)
- {
- DPRINT1("No new control set because we are in setup mode!\n");
- return TRUE;
- }
-
- /* Get the control set values */
- if (!ScmGetControlSetValues())
- return FALSE;
-
- /* Search for a new control set number */
- for (dwNewControlSet = 1; dwNewControlSet < 1000; dwNewControlSet++)
- {
- if ((dwNewControlSet != dwCurrentControlSet) &&
- (dwNewControlSet != dwDefaultControlSet) &&
- (dwNewControlSet != dwFailedControlSet) &&
- (dwNewControlSet != dwLastKnownGoodControlSet))
- break;
- }
-
- /* Fail if we did not find an unused control set!*/
- if (dwNewControlSet >= 1000)
- {
- DPRINT1("Too many control sets!\n");
- return FALSE;
- }
-
- /* Create the current control set name */
- swprintf(szCurrentControlSetName, L"SYSTEM\\ControlSet%03lu",
dwCurrentControlSet);
- DPRINT("Current control set: %S\n", szCurrentControlSetName);
+ /* Create the source control set name */
+ swprintf(szSourceControlSetName, L"SYSTEM\\ControlSet%03lu",
dwSourceControlSet);
+ DPRINT("Source control set: %S\n", szSourceControlSetName);
- /* Create the new control set name */
- swprintf(szNewControlSetName, L"SYSTEM\\ControlSet%03lu",
dwNewControlSet);
- DPRINT("New control set: %S\n", szNewControlSetName);
+ /* Create the destination control set name */
+ swprintf(szDestinationControlSetName, L"SYSTEM\\ControlSet%03lu",
dwDestinationControlSet);
+ DPRINT("Destination control set: %S\n", szDestinationControlSetName);
- /* Open the current control set key */
+ /* Open the source control set key */
dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
- szCurrentControlSetName,
+ szSourceControlSetName,
0,
KEY_READ,
- &hCurrentControlSetKey);
+ &hSourceControlSetKey);
if (dwError != ERROR_SUCCESS)
goto done;
- /* Create the new control set key */
+ /* Create the destination control set key */
dwError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
- szNewControlSetName,
+ szDestinationControlSetName,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
- &hNewControlSetKey,
+ &hDestinationControlSetKey,
&dwDisposition);
if (dwError != ERROR_SUCCESS)
goto done;
- /* Copy the current control set to the new control set */
- dwError = ScmCopyKey(hNewControlSetKey,
- hCurrentControlSetKey);
+ /* Copy the source control set to the destination control set */
+#if (_WIN32_WINNT >= 0x0600)
+ dwError = RegCopyTreeW(hSourceControlSetKey,
+ NULL,
+ hDestinationControlSetKey);
+#else
+ dwError = ScmCopyTree(hSourceControlSetKey,
+ hDestinationControlSetKey);
+#endif
if (dwError != ERROR_SUCCESS)
goto done;
- /* Set the new 'LastKnownGood' control set */
- dwError = ScmSetLastKnownGoodControlSet(dwNewControlSet);
+ RegFlushKey(hDestinationControlSetKey);
done:
- if (hNewControlSetKey != NULL)
- RegCloseKey(hNewControlSetKey);
+ if (hDestinationControlSetKey != NULL)
+ RegCloseKey(hDestinationControlSetKey);
+
+ if (hSourceControlSetKey != NULL)
+ RegCloseKey(hSourceControlSetKey);
+
+ return dwError;
+}
+
+
+DWORD
+ScmCreateLastKnownGoodControlSet(VOID)
+{
+ DWORD dwCurrentControlSet, dwDefaultControlSet;
+ DWORD dwFailedControlSet, dwLastKnownGoodControlSet;
+ DWORD dwNewControlSet;
+ DWORD dwError;
+
+ /* Get the control set values */
+ dwError = ScmGetControlSetValues(&dwCurrentControlSet,
+ &dwDefaultControlSet,
+ &dwFailedControlSet,
+ &dwLastKnownGoodControlSet);
+ if (dwError != ERROR_SUCCESS)
+ return dwError;
+
+ /* First boot after setup? */
+ if ((ScmGetSetupInProgress() == 0) &&
+ (dwCurrentControlSet == dwLastKnownGoodControlSet))
+ {
+ DPRINT("First boot after setup!\n");
+
+ /* Search for a new control set number */
+ for (dwNewControlSet = 1; dwNewControlSet < 1000; dwNewControlSet++)
+ {
+ if ((dwNewControlSet != dwCurrentControlSet) &&
+ (dwNewControlSet != dwDefaultControlSet) &&
+ (dwNewControlSet != dwFailedControlSet) &&
+ (dwNewControlSet != dwLastKnownGoodControlSet))
+ break;
+ }
+
+ /* Fail if we did not find an unused control set!*/
+ if (dwNewControlSet >= 1000)
+ {
+ DPRINT1("Too many control sets!\n");
+ return ERROR_NO_MORE_ITEMS;
+ }
+
+ /* Copy the current control set */
+ dwError = ScmCopyControlSet(dwCurrentControlSet,
+ dwNewControlSet);
+ if (dwError != ERROR_SUCCESS)
+ return dwError;
- if (hCurrentControlSetKey != NULL)
- RegCloseKey(hCurrentControlSetKey);
+ /* Set the new 'LastKnownGood' control set */
+ dwError = ScmSetLastKnownGoodControlSet(dwNewControlSet);
+ }
- return (dwError == ERROR_SUCCESS);
+ return dwError;
}
/* EOF */
diff --git a/base/system/services/services.c b/base/system/services/services.c
index 591c5a7062..75bfeeb195 100644
--- a/base/system/services/services.c
+++ b/base/system/services/services.c
@@ -178,10 +178,11 @@ wWinMain(HINSTANCE hInstance,
/* FIXME: more initialization */
- /* Update the control sets */
- if (!ScmUpdateControlSets())
+ /* Create the 'Last Known Good' control set */
+ dwError = ScmCreateLastKnownGoodControlSet();
+ if (dwError != ERROR_SUCCESS)
{
- DPRINT1("SERVICES: Failed to update the control sets\n");
+ DPRINT1("SERVICES: Failed to create the 'Last Known Good' control
set (Error %lu)\n", dwError);
goto done;
}
diff --git a/base/system/services/services.h b/base/system/services/services.h
index 57c873d670..74943372c6 100644
--- a/base/system/services/services.h
+++ b/base/system/services/services.h
@@ -159,8 +159,8 @@ ScmDecryptPassword(
/* controlset.c */
-BOOL
-ScmUpdateControlSets(VOID);
+DWORD
+ScmCreateLastKnownGoodControlSet(VOID);
/* database.c */