windows-nt/Source/XPSP1/NT/base/cluster/mgmt/cluscfg/basecluster/cenablethreadprivilege.cpp
2020-09-26 16:20:57 +08:00

213 lines
6.6 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2000 Microsoft Corporation
//
// Module Name:
// CEnableThreadPrivilege.cpp
//
// Description:
// Contains the definition of the CEnableThreadPrivilege class.
//
// Maintained By:
// Vij Vasu (Vvasu) 08-MAR-2000
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
// The precompiled header.
#include "pch.h"
// The header for this file
#include "CEnableThreadPrivilege.h"
//////////////////////////////////////////////////////////////////////////////
//++
//
// CEnableThreadPrivilege::CEnableThreadPrivilege
//
// Description:
// Constructor of the CEnableThreadPrivilege class. Enables the specified
// privilege.
//
// Arguments:
// pcszPrivilegeNameIn
// Name of the privilege to be enabled.
//
// Return Value:
// None.
//
// Exceptions Thrown:
// CRuntimeError
// If any of the APIs fail.
//
//--
//////////////////////////////////////////////////////////////////////////////
CEnableThreadPrivilege::CEnableThreadPrivilege( const WCHAR * pcszPrivilegeNameIn )
: m_hThreadToken( NULL )
, m_fPrivilegeEnabled( false )
{
BCATraceScope1( "pcszPrivilegeNameIn = '%ws'", pcszPrivilegeNameIn );
DWORD dwError = ERROR_SUCCESS;
do
{
TOKEN_PRIVILEGES tpPrivilege;
DWORD dwReturnLength = sizeof( m_tpPreviousState );
DWORD dwBufferLength = sizeof( tpPrivilege );
// Open the current thread token.
if ( OpenThreadToken(
GetCurrentThread()
, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
, TRUE
, &m_hThreadToken
)
== FALSE
)
{
dwError = GetLastError();
// If the thread has no token, then default to the process token.
if ( dwError == ERROR_NO_TOKEN )
{
BCATraceMsg( "The thread has no token. Trying to open the process token." );
if ( OpenProcessToken(
GetCurrentProcess()
, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
, &m_hThreadToken
)
== FALSE
)
{
dwError = TW32( GetLastError() );
BCATraceMsg1( "Error %#08x occurred trying to open the process token.", dwError );
break;
} // if: OpenProcessToken() failed.
// The process token was opened. All is well.
dwError = ERROR_SUCCESS;
} // if: the thread has no token
else
{
TW32( dwError );
BCATraceMsg1( "Error %#08x occurred trying to open the thread token.", dwError );
break;
} // if: some other error occurred
} // if: OpenThreadToken() failed
//
// Initialize the TOKEN_PRIVILEGES structure.
//
tpPrivilege.PrivilegeCount = 1;
if ( LookupPrivilegeValue( NULL, pcszPrivilegeNameIn, &tpPrivilege.Privileges[0].Luid ) == FALSE )
{
dwError = TW32( GetLastError() );
BCATraceMsg1( "Error %#08x occurred trying to lookup privilege value.", dwError );
break;
} // if: LookupPrivilegeValue() failed
tpPrivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Enable the desired privilege.
if ( AdjustTokenPrivileges(
m_hThreadToken
, FALSE
, &tpPrivilege
, dwBufferLength
, &m_tpPreviousState
, &dwReturnLength
)
== FALSE
)
{
dwError = TW32( GetLastError() );
BCATraceMsg1( "Error %#08x occurred trying to enable the privilege.", dwError );
break;
} // if: AdjustTokenPrivileges() failed
LogMsg( "Privilege '%ws' enabled for the current thread.", pcszPrivilegeNameIn );
// Set a flag if the privilege was not already enabled.
m_fPrivilegeEnabled = ( m_tpPreviousState.Privileges[0].Attributes != SE_PRIVILEGE_ENABLED );
}
while( false ); // dummy do-while loop to avoid gotos
if ( dwError != ERROR_SUCCESS )
{
LogMsg( "Error %#08x occurred trying to enable privilege '%ws'.", dwError, pcszPrivilegeNameIn );
BCATraceMsg2( "Error %#08x occurred trying to enable privilege '%ws'. Throwing exception.", dwError, pcszPrivilegeNameIn );
THROW_RUNTIME_ERROR( HRESULT_FROM_WIN32( dwError ), IDS_ERROR_ENABLE_THREAD_PRIVILEGE );
} // if:something went wrong
} //*** CEnableThreadPrivilege::CEnableThreadPrivilege()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CEnableThreadPrivilege::~CEnableThreadPrivilege
//
// Description:
// Destructor of the CEnableThreadPrivilege class. Restores the specified
// privilege to its original state.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
// Exceptions Thrown:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CEnableThreadPrivilege::~CEnableThreadPrivilege( void ) throw()
{
BCATraceScope( "" );
DWORD dwError = ERROR_SUCCESS;
if ( m_fPrivilegeEnabled )
{
if ( AdjustTokenPrivileges(
m_hThreadToken
, FALSE
, &m_tpPreviousState
, sizeof( m_tpPreviousState )
, NULL
, NULL
)
== FALSE
)
{
dwError = TW32( GetLastError() );
LogMsg( "Error %#08x occurred trying to restore privilege.", dwError );
BCATraceMsg1( "Error %#08x occurred trying to restore privilege.", dwError );
} // if: AdjustTokenPrivileges() failed
else
{
LogMsg( "Privilege restored.", dwError );
} // else: no errors
} // if: the privilege was successfully enabled in the constructor
else
{
LogMsg( "Privilege was enabled to begin with. Doing nothing.", dwError );
}
if ( m_hThreadToken != NULL )
{
CloseHandle( m_hThreadToken );
} // if: the thread handle was opened
} //*** CEnableThreadPrivilege::~CEnableThreadPrivilege()