MCPcopy Create free account
hub / github.com/LegacyUpdate/LegacyUpdate / Reboot

Function Reboot

LegacyUpdate/Utils.cpp:35–92  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

33}
34
35HRESULT Reboot(void) {
36 HRESULT hr = E_FAIL;
37
38 HANDLE token = NULL;
39 TOKEN_PRIVILEGES privileges;
40 LUID shutdownLuid;
41 _InitiateShutdownW $InitiateShutdownW = (_InitiateShutdownW)GetProcAddress(GetModuleHandle(L"advapi32.dll"), "InitiateShutdownW");
42
43 // Make sure we have permission to shut down
44 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) {
45 hr = HRESULT_FROM_WIN32(GetLastError());
46 CHECK_HR_OR_GOTO_END(L"OpenProcessToken");
47 }
48
49 if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &shutdownLuid)) {
50 hr = HRESULT_FROM_WIN32(GetLastError());
51 CHECK_HR_OR_GOTO_END(L"LookupPrivilegeValue");
52 }
53
54 // Ask the system nicely to give us shutdown privilege
55 privileges.PrivilegeCount = 1;
56 privileges.Privileges[0].Luid = shutdownLuid;
57 privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
58
59 if (!AdjustTokenPrivileges(token, FALSE, &privileges, 0, NULL, NULL)) {
60 hr = HRESULT_FROM_WIN32(GetLastError());
61 CHECK_HR_OR_GOTO_END(L"AdjustTokenPrivileges");
62 }
63
64 // Reboot with reason "Operating System: Security fix (Unplanned)", ensuring to install updates.
65 // Try InitiateShutdown first (Vista+)
66 if ($InitiateShutdownW) {
67 hr = HRESULT_FROM_WIN32($InitiateShutdownW(NULL, NULL, 0, SHUTDOWN_RESTART | SHUTDOWN_INSTALL_UPDATES, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_SECURITYFIX));
68 }
69
70 // Try InitiateSystemShutdownEx (2k/XP)
71 if (!SUCCEEDED(hr)) {
72 CHECK_HR(L"InitiateShutdown failed");
73
74 if (InitiateSystemShutdownEx(NULL, NULL, 0, FALSE, TRUE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_SECURITYFIX) == 0) {
75 hr = HRESULT_FROM_WIN32(GetLastError());
76 CHECK_HR_OR_GOTO_END(L"InitiateSystemShutdownEx");
77 }
78 }
79
80 // Last-ditch attempt ExitWindowsEx (only guaranteed to work for the current logged in user)
81 if (!SUCCEEDED(hr) && !ExitWindowsEx(EWX_REBOOT | EWX_FORCEIFHUNG, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_SECURITYFIX)) {
82 hr = HRESULT_FROM_WIN32(GetLastError());
83 CHECK_HR_OR_GOTO_END(L"ExitWindowsEx");
84 }
85
86end:
87 if (token) {
88 CloseHandle(token);
89 }
90
91 return hr;
92}

Callers 1

RebootMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected