Author: hbelusca Date: Sat Jan 26 23:16:34 2013 New Revision: 58234
URL: http://svn.reactos.org/svn/reactos?rev=58234&view=rev Log: [CONSRV] Modify driver acquiring/releasing privilege according to r58233. The corresponding modification in services.c will be done at the next synchronization.
Modified: branches/ros-csrss/win32ss/user/consrv/tuiconsole.c
Modified: branches/ros-csrss/win32ss/user/consrv/tuiconsole.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/tu... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/tuiconsole.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/tuiconsole.c [iso-8859-1] Sat Jan 26 23:16:34 2013 @@ -29,62 +29,19 @@ |** BlueScreen Driver management **| **/ /* Code taken and adapted from base/system/services/driver.c */ -static DWORD EnablePrivilege(LPCWSTR lpszPrivilegeName, BOOL bEnablePrivilege) -{ - DWORD dwRet = ERROR_SUCCESS; - HANDLE hToken = NULL; - - if (OpenProcessToken(GetCurrentProcess(), - TOKEN_ADJUST_PRIVILEGES, - &hToken)) - { - TOKEN_PRIVILEGES tp; - - tp.PrivilegeCount = 1; - tp.Privileges[0].Attributes = (bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0); - - if (LookupPrivilegeValueW(NULL, - lpszPrivilegeName, - &tp.Privileges[0].Luid)) - { - if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL)) - { - if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) - dwRet = ERROR_NOT_ALL_ASSIGNED; - } - else - { - dwRet = GetLastError(); - } - } - else - { - dwRet = GetLastError(); - } - - CloseHandle(hToken); - } - else - { - dwRet = GetLastError(); - } - - return dwRet; -} - static DWORD ScmLoadDriver(LPCWSTR lpServiceName) { + NTSTATUS Status = STATUS_SUCCESS; + BOOLEAN WasPrivilegeEnabled = FALSE; PWSTR pszDriverPath; UNICODE_STRING DriverPath; - NTSTATUS Status; - DWORD dwError = ERROR_SUCCESS;
/* Build the driver path */ /* 52 = wcslen(L"\Registry\Machine\System\CurrentControlSet\Services\") */ pszDriverPath = RtlAllocateHeap(ConSrvHeap, - HEAP_ZERO_MEMORY, - (52 + wcslen(lpServiceName) + 1) * sizeof(WCHAR)); + HEAP_ZERO_MEMORY, + (52 + wcslen(lpServiceName) + 1) * sizeof(WCHAR)); if (pszDriverPath == NULL) return ERROR_NOT_ENOUGH_MEMORY;
@@ -99,44 +56,44 @@ DPRINT(" Path: %wZ\n", &DriverPath);
/* Acquire driver-loading privilege */ - dwError = EnablePrivilege(SE_LOAD_DRIVER_NAME, TRUE); - if (dwError != ERROR_SUCCESS) + Status = RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, + TRUE, + FALSE, + &WasPrivilegeEnabled); + if (!NT_SUCCESS(Status)) { /* We encountered a failure, exit properly */ - DPRINT1("CONSRV: Cannot acquire driver-loading privilege, error = %lu\n", dwError); + DPRINT1("CONSRV: Cannot acquire driver-loading privilege, Status = 0x%08lx\n", Status); goto done; }
Status = NtLoadDriver(&DriverPath);
/* Release driver-loading privilege */ - EnablePrivilege(SE_LOAD_DRIVER_NAME, FALSE); - - if (!NT_SUCCESS(Status)) - { - dwError = RtlNtStatusToDosError(Status); - } + RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, + WasPrivilegeEnabled, + FALSE, + &WasPrivilegeEnabled);
done: RtlFreeHeap(ConSrvHeap, 0, pszDriverPath); - - return dwError; + return RtlNtStatusToDosError(Status); }
#ifdef BLUESCREEN_DRIVER_UNLOADING static DWORD ScmUnloadDriver(LPCWSTR lpServiceName) { + NTSTATUS Status = STATUS_SUCCESS; + BOOLEAN WasPrivilegeEnabled = FALSE; PWSTR pszDriverPath; UNICODE_STRING DriverPath; - NTSTATUS Status; - DWORD dwError = ERROR_SUCCESS;
/* Build the driver path */ /* 52 = wcslen(L"\Registry\Machine\System\CurrentControlSet\Services\") */ pszDriverPath = RtlAllocateHeap(ConSrvHeap, - HEAP_ZERO_MEMORY, - (52 + wcslen(lpServiceName) + 1) * sizeof(WCHAR)); + HEAP_ZERO_MEMORY, + (52 + wcslen(lpServiceName) + 1) * sizeof(WCHAR)); if (pszDriverPath == NULL) return ERROR_NOT_ENOUGH_MEMORY;
@@ -148,29 +105,31 @@ RtlInitUnicodeString(&DriverPath, pszDriverPath);
+ DPRINT(" Path: %wZ\n", &DriverPath); + /* Acquire driver-unloading privilege */ - dwError = EnablePrivilege(SE_LOAD_DRIVER_NAME, TRUE); - if (dwError != ERROR_SUCCESS) + Status = RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, + TRUE, + FALSE, + &WasPrivilegeEnabled); + if (!NT_SUCCESS(Status)) { /* We encountered a failure, exit properly */ - DPRINT1("CONSRV: Cannot acquire driver-unloading privilege, error = %lu\n", dwError); + DPRINT1("CONSRV: Cannot acquire driver-unloading privilege, Status = 0x%08lx\n", Status); goto done; }
Status = NtUnloadDriver(&DriverPath);
/* Release driver-unloading privilege */ - EnablePrivilege(SE_LOAD_DRIVER_NAME, FALSE); - - if (!NT_SUCCESS(Status)) - { - dwError = RtlNtStatusToDosError(Status); - } + RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, + WasPrivilegeEnabled, + FALSE, + &WasPrivilegeEnabled);
done: RtlFreeHeap(ConSrvHeap, 0, pszDriverPath); - - return dwError; + return RtlNtStatusToDosError(Status); } #endif /**\