Changeset 39729 in vbox for trunk/src/VBox/Runtime
- Timestamp:
- Jan 8, 2012 5:29:43 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 75590
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/win/RTSystemShutdown-win.cpp
r39728 r39729 43 43 AssertPtrReturn(pszLogMsg, VERR_INVALID_POINTER); 44 44 AssertReturn(!(fFlags & ~RTSYSTEM_SHUTDOWN_VALID_MASK), VERR_INVALID_PARAMETER); 45 45 46 46 PRTUTF16 pwszLogMsg; 47 47 int rc = RTStrToUtf16(pszLogMsg, &pwszLogMsg); … … 52 52 ? TRUE : FALSE; 53 53 BOOL fForceAppsClosed = fFlags & RTSYSTEM_SHUTDOWN_FORCE ? TRUE : FALSE; 54 55 /* 56 * Do the 57 */ 54 58 if (InitiateSystemShutdownW(NULL /*pwszMachineName = NULL = localhost*/, 55 59 pwszLogMsg, … … 57 61 fForceAppsClosed, 58 62 fRebootAfterShutdown)) 59 return (fFlags & RTSYSTEM_SHUTDOWN_ACTION_MASK) == RTSYSTEM_SHUTDOWN_HALT ? VINF_SYS_MAY_POWER_OFF : VINF_SUCCESS; 60 return RTErrConvertFromWin32(GetLastError()); 63 rc = (fFlags & RTSYSTEM_SHUTDOWN_ACTION_MASK) == RTSYSTEM_SHUTDOWN_HALT ? VINF_SYS_MAY_POWER_OFF : VINF_SUCCESS; 64 else 65 { 66 /* If we failed because of missing privileges, try get the right to 67 shut down the system and call the api again. */ 68 DWORD dwErr = GetLastError(); 69 rc = RTErrConvertFromWin32(dwErr); 70 if (dwErr == ERROR_ACCESS_DENIED) 71 { 72 HANDLE hToken = NULL; 73 if (OpenThreadToken(GetCurrentThread(), 74 TOKEN_ADJUST_PRIVILEGES, 75 TRUE /*OpenAsSelf*/, 76 &hToken)) 77 dwErr = NO_ERROR; 78 else 79 { 80 dwErr = GetLastError(); 81 if (dwErr == ERROR_NO_TOKEN) 82 { 83 if (OpenProcessToken(GetCurrentProcess(), 84 TOKEN_ADJUST_PRIVILEGES, 85 &hToken)) 86 dwErr = NO_ERROR; 87 else 88 dwErr = GetLastError(); 89 } 90 } 91 92 if (dwErr == NO_ERROR) 93 { 94 union 95 { 96 TOKEN_PRIVILEGES TokenPriv; 97 char ab[sizeof(TOKEN_PRIVILEGES) + sizeof(LUID_AND_ATTRIBUTES)]; 98 } u; 99 u.TokenPriv.PrivilegeCount = 1; 100 u.TokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 101 if (LookupPrivilegeValue(NULL /*localhost*/, SE_SHUTDOWN_NAME, &u.TokenPriv.Privileges[0].Luid)) 102 { 103 if (AdjustTokenPrivileges(hToken, 104 FALSE /*DisableAllPrivileges*/, 105 &u.TokenPriv, 106 RT_OFFSETOF(TOKEN_PRIVILEGES, Privileges[1]), 107 NULL, 108 NULL) ) 109 { 110 if (InitiateSystemShutdownW(NULL /*pwszMachineName = NULL = localhost*/, 111 pwszLogMsg, 112 cSecsTimeout, 113 fForceAppsClosed, 114 fRebootAfterShutdown)) 115 rc = (fFlags & RTSYSTEM_SHUTDOWN_ACTION_MASK) == RTSYSTEM_SHUTDOWN_HALT ? VINF_SYS_MAY_POWER_OFF : VINF_SUCCESS; 116 else 117 { 118 dwErr = GetLastError(); 119 rc = RTErrConvertFromWin32(dwErr); 120 } 121 } 122 CloseHandle(hToken); 123 } 124 } 125 } 126 } 127 128 RTUtf16Free(pwszLogMsg); 129 return rc; 61 130 } 62 131 RT_EXPORT_SYMBOL(RTSystemShutdown);
Note:
See TracChangeset
for help on using the changeset viewer.