Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+----------------------------------------------------------------------------
//
// File: cmexitwin.cpp
//
// Module: Common Code
//
// Synopsis: Implements the function MyExitWindowsEx.
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// Author: quintinb Created Heaser 08/19/99
//
//+----------------------------------------------------------------------------
#include <windows.h>
BOOL MyExitWindowsEx(UINT uFlags, DWORD dwRsvd) { BOOL bRes;
//
// If platform is NT, we will have to adjust privileges before rebooting
//
if (OS_NT) { HANDLE hToken; // handle to process token
TOKEN_PRIVILEGES tkp; // ptr. to token structure
//
// Get the current process token handle
// so we can get shutdown privilege.
//
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { CMTRACE1(TEXT("MyExitWindowsEx() OpenThreadToken() failed, GLE=%u."), GetLastError()); return FALSE; } //
// Get the LUID for shutdown privilege
//
bRes = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); #ifdef DEBUG
if (!bRes) { CMTRACE1(TEXT("MyExitWindowsEx() LookupPrivilegeValue() failed, GLE=%u."), GetLastError()); } #endif
tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //
// Get shutdown privilege for this process
//
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); //
// Cannot reliably test the return value of AdjustTokenPrivileges
//
if (GetLastError() != ERROR_SUCCESS) { CMTRACE1(TEXT("MyExitWindowsEx() AdjustTokenPrivileges() failed, GLE=%u."), GetLastError());
CloseHandle(hToken); return FALSE; } CloseHandle(hToken); } bRes = ExitWindowsEx(uFlags,dwRsvd); #ifdef DEBUG
if (!bRes) { CMTRACE1(TEXT("MyExitWindowsEx() ExitWindowsEx() failed, GLE=%u."), GetLastError()); } #endif
return (bRes); }
|