Author: ekohl
Date: Wed May 15 21:26:07 2013
New Revision: 59020

URL: http://svn.reactos.org/svn/reactos?rev=59020&view=rev
Log:
[SYSSETUP]
- Move set privilege code into a separate function.
- Set the restore privilege to make NtUnloadKey work properly.

Modified:
    trunk/reactos/dll/win32/syssetup/install.c

Modified: trunk/reactos/dll/win32/syssetup/install.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/syssetup/install.c?rev=59020&r1=59019&r2=59020&view=diff
==============================================================================
--- trunk/reactos/dll/win32/syssetup/install.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/syssetup/install.c  [iso-8859-1] Wed May 15 
21:26:07 2013
@@ -806,12 +806,58 @@
     return TRUE;
 }
 
+
+static
+BOOL
+SetPrivilege(IN LPTSTR lpPrivilegeName,
+             IN DWORD dwAttribute)
+{
+    TOKEN_PRIVILEGES privs;
+    HANDLE hToken = NULL;
+    BOOL bResult = TRUE;
+
+    if (!OpenProcessToken(GetCurrentProcess(),
+                          TOKEN_ADJUST_PRIVILEGES,
+                          &hToken))
+    {
+        FatalError("OpenProcessToken() failed!");
+        return FALSE;
+    }
+
+    if (!LookupPrivilegeValue(NULL,
+                              lpPrivilegeName,
+                              &privs.Privileges[0].Luid))
+    {
+        FatalError("LookupPrivilegeValue() failed!");
+        bResult = FALSE;
+        goto done;
+    }
+
+    privs.PrivilegeCount = 1;
+    privs.Privileges[0].Attributes = dwAttribute;
+    if (AdjustTokenPrivileges(hToken,
+                              FALSE,
+                              &privs,
+                              0,
+                              (PTOKEN_PRIVILEGES)NULL,
+                              NULL) == 0)
+    {
+        FatalError("AdjustTokenPrivileges() failed!");
+        bResult = FALSE;
+    }
+
+done:
+    if (hToken != NULL)
+        CloseHandle(hToken);
+
+    return bResult;
+}
+
+
 DWORD WINAPI
 InstallReactOS(HINSTANCE hInstance)
 {
     TCHAR szBuffer[MAX_PATH];
-    HANDLE token;
-    TOKEN_PRIVILEGES privs;
     HKEY hKey;
 
     InitializeSetupActionLog(FALSE);
@@ -868,6 +914,8 @@
         FatalError("CreateShortcuts() failed");
         return 0;
     }
+
+    SetPrivilege(SE_RESTORE_NAME, SE_PRIVILEGE_ENABLED);
 
     /* ROS HACK, as long as NtUnloadKey is not implemented */
     {
@@ -899,39 +947,15 @@
     }
     /* END OF ROS HACK */
 
+    SetPrivilege(SE_RESTORE_NAME, 0);
+
     SetupCloseInfFile(hSysSetupInf);
     SetSetupType(0);
 
     LogItem(SYSSETUP_SEVERITY_INFORMATION, L"Installing ReactOS done");
     TerminateSetupActionLog();
 
-    /* Get shutdown privilege */
-    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, 
&token))
-    {
-        FatalError("OpenProcessToken() failed!");
-        return 0;
-    }
-    if (!LookupPrivilegeValue(
-        NULL,
-        SE_SHUTDOWN_NAME,
-        &privs.Privileges[0].Luid))
-    {
-        FatalError("LookupPrivilegeValue() failed!");
-        return 0;
-    }
-    privs.PrivilegeCount = 1;
-    privs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-    if (AdjustTokenPrivileges(
-        token,
-        FALSE,
-        &privs,
-        0,
-        (PTOKEN_PRIVILEGES)NULL,
-        NULL) == 0)
-    {
-        FatalError("AdjustTokenPrivileges() failed!");
-        return 0;
-    }
+    SetPrivilege(SE_SHUTDOWN_NAME, SE_PRIVILEGE_ENABLED);
 
     ExitWindowsEx(EWX_REBOOT, 0);
     return 0;


Reply via email to