25#if (_WIN32_WINNT < 0x0600)
35 DWORD dwMaxSubKeyNameLength;
36 DWORD dwSubKeyNameLength;
37 DWORD dwMaxValueNameLength;
38 DWORD dwValueNameLength;
39 DWORD dwMaxValueLength;
56 &dwMaxSubKeyNameLength,
59 &dwMaxValueNameLength,
65 DPRINT1(
"RegQueryInfoKey() failed (Error %lu)\n", dwError);
69 dwMaxSubKeyNameLength++;
70 dwMaxValueNameLength++;
72 DPRINT(
"dwSubKeys %lu\n", dwSubKeys);
73 DPRINT(
"dwMaxSubKeyNameLength %lu\n", dwMaxSubKeyNameLength);
74 DPRINT(
"dwValues %lu\n", dwValues);
75 DPRINT(
"dwMaxValueNameLength %lu\n", dwMaxValueNameLength);
76 DPRINT(
"dwMaxValueLength %lu\n", dwMaxValueLength);
83 dwMaxSubKeyNameLength *
sizeof(
WCHAR));
86 DPRINT1(
"Buffer allocation failed\n");
90 for (
i = 0;
i < dwSubKeys;
i++)
92 dwSubKeyNameLength = dwMaxSubKeyNameLength;
103 DPRINT1(
"Subkey enumeration failed (Error %lu)\n", dwError);
121 DPRINT1(
"Subkey creation failed (Error %lu)\n", dwError);
135 DPRINT1(
"Error: %lu\n", dwError);
147 DPRINT1(
"Error: %lu\n", dwError);
170 dwMaxValueNameLength *
sizeof(
WCHAR));
173 DPRINT1(
"Buffer allocation failed\n");
180 dwMaxValueLength +
sizeof(
WCHAR));
181 if (lpDataBuffer ==
NULL)
183 DPRINT1(
"Buffer allocation failed\n");
190 for (
i = 0;
i < dwValues;
i++)
192 dwValueNameLength = dwMaxValueNameLength;
193 dwValueLength = dwMaxValueLength;
204 DPRINT1(
"Error: %lu\n", dwError);
222 DPRINT1(
"Error: %lu\n", dwError);
242 DPRINT(
"ScmCopyTree() done\n");
253 DWORD dwMaxSubkeyLength, dwMaxValueLength;
259 if (pszSubKey !=
NULL)
288 dwMaxLength =
max(dwMaxSubkeyLength, dwMaxValueLength);
293 dwMaxLength *
sizeof(
WCHAR));
319 if (pszSubKey !=
NULL)
348 if (pszSubKey !=
NULL)
359 PDWORD pdwCurrentControlSet,
360 PDWORD pdwDefaultControlSet,
361 PDWORD pdwFailedControlSet,
362 PDWORD pdwLastKnownGoodControlSet)
369 DPRINT(
"ScmGetControlSetValues() called\n");
384 (
LPBYTE)pdwCurrentControlSet,
388 *pdwCurrentControlSet = 0;
396 (
LPBYTE)pdwDefaultControlSet,
400 *pdwDefaultControlSet = 0;
408 (
LPBYTE)pdwFailedControlSet,
412 *pdwFailedControlSet = 0;
420 (
LPBYTE)pdwLastKnownGoodControlSet,
424 *pdwLastKnownGoodControlSet = 0;
430 DPRINT(
"Current: %lu\n", *pdwCurrentControlSet);
431 DPRINT(
"Default: %lu\n", *pdwDefaultControlSet);
432 DPRINT(
"Failed: %lu\n", *pdwFailedControlSet);
433 DPRINT(
"LastKnownGood: %lu\n", *pdwLastKnownGoodControlSet);
460 sizeof(dwControlSet));
479 DPRINT(
"ScmGetSetupInProgress()\n");
492 L"SystemSetupInProgress",
495 (
LPBYTE)&dwSetupInProgress,
500 DPRINT(
"SetupInProgress: %lu\n", dwSetupInProgress);
501 return dwSetupInProgress;
508 DWORD dwSourceControlSet,
509 DWORD dwDestinationControlSet)
511 WCHAR szSourceControlSetName[32];
512 WCHAR szDestinationControlSetName[32];
514 HKEY hDestinationControlSetKey =
NULL;
519 swprintf(szSourceControlSetName,
L"SYSTEM\\ControlSet%03lu", dwSourceControlSet);
520 DPRINT(
"Source control set: %S\n", szSourceControlSetName);
523 swprintf(szDestinationControlSetName,
L"SYSTEM\\ControlSet%03lu", dwDestinationControlSet);
524 DPRINT(
"Destination control set: %S\n", szDestinationControlSetName);
528 szSourceControlSetName,
531 &hSourceControlSetKey);
537 szDestinationControlSetName,
543 &hDestinationControlSetKey,
549#if (_WIN32_WINNT >= 0x0600)
552 hDestinationControlSetKey);
555 hDestinationControlSetKey);
563 if (hDestinationControlSetKey !=
NULL)
566 if (hSourceControlSetKey !=
NULL)
578 WCHAR szControlSetName[32];
582 DPRINT(
"ScmDeleteControSet(%lu)\n", dwControlSet);
585 swprintf(szControlSetName,
L"SYSTEM\\ControlSet%03lu", dwControlSet);
586 DPRINT(
"Control set: %S\n", szControlSetName);
598#if (_WIN32_WINNT >= 0x0600)
616 DWORD dwCurrentControlSet, dwDefaultControlSet;
617 DWORD dwFailedControlSet, dwLastKnownGoodControlSet;
618 DWORD dwNewControlSet;
623 &dwDefaultControlSet,
625 &dwLastKnownGoodControlSet);
631 (dwCurrentControlSet == dwLastKnownGoodControlSet))
633 DPRINT(
"First boot after setup\n");
636 for (dwNewControlSet = 1; dwNewControlSet < 1000; dwNewControlSet++)
638 if ((dwNewControlSet != dwCurrentControlSet) &&
639 (dwNewControlSet != dwDefaultControlSet) &&
640 (dwNewControlSet != dwFailedControlSet) &&
641 (dwNewControlSet != dwLastKnownGoodControlSet))
646 if (dwNewControlSet >= 1000)
648 DPRINT1(
"Too many control sets\n");
677 DWORD dwCurrentControlSet, dwDefaultControlSet;
678 DWORD dwFailedControlSet, dwLastKnownGoodControlSet;
679 DWORD dwNewControlSet;
682 DPRINT(
"ScmAcceptBoot()\n");
686 DPRINT1(
"Boot has already been accepted\n");
692 &dwDefaultControlSet,
694 &dwLastKnownGoodControlSet);
699 for (dwNewControlSet = 1; dwNewControlSet < 1000; dwNewControlSet++)
701 if ((dwNewControlSet != dwCurrentControlSet) &&
702 (dwNewControlSet != dwDefaultControlSet) &&
703 (dwNewControlSet != dwFailedControlSet) &&
704 (dwNewControlSet != dwLastKnownGoodControlSet))
709 if (dwNewControlSet >= 1000)
711 DPRINT1(
"Too many control sets\n");
722 if ((dwLastKnownGoodControlSet != dwCurrentControlSet) &&
723 (dwLastKnownGoodControlSet != dwDefaultControlSet) &&
724 (dwLastKnownGoodControlSet != dwFailedControlSet))
743 DPRINT(
"ScmRunLastKnownGood()\n");
747 DPRINT1(
"Boot has already been accepted\n");
#define RegCloseKey(hKey)
DWORD ScmRunLastKnownGood(VOID)
DWORD ScmCreateLastKnownGoodControlSet(VOID)
DWORD ScmDeleteTree(HKEY hKey, PCWSTR pszSubKey)
static DWORD ScmSetLastKnownGoodControlSet(DWORD dwControlSet)
static DWORD ScmGetSetupInProgress(VOID)
static DWORD ScmDeleteControlSet(DWORD dwControlSet)
DWORD ScmAcceptBoot(VOID)
static DWORD ScmGetControlSetValues(PDWORD pdwCurrentControlSet, PDWORD pdwDefaultControlSet, PDWORD pdwFailedControlSet, PDWORD pdwLastKnownGoodControlSet)
static DWORD ScmCopyControlSet(DWORD dwSourceControlSet, DWORD dwDestinationControlSet)
static BOOL bBootAccepted
static DWORD ScmCopyTree(HKEY hSrcKey, HKEY hDstKey)
#define ERROR_NOT_ENOUGH_MEMORY
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegCopyTreeW(IN HKEY hKeySrc, IN LPCWSTR lpSubKey OPTIONAL, IN HKEY hKeyDest)
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
LONG WINAPI RegFlushKey(HKEY hKey)
LSTATUS WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
#define ERROR_NO_MORE_ITEMS
#define HeapFree(x, y, z)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
#define REG_OPTION_NON_VOLATILE
#define KEY_ENUMERATE_SUB_KEYS
static LPSTR lpNameBuffer
#define ERROR_BOOT_ALREADY_ACCEPTED
#define HKEY_LOCAL_MACHINE