关机代码分析

关机代码分析

给你一段代码吧,下面是我的关机程序的部分代码

 

void CShutDownView::OnLogoff()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{
if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_LOGOFF,0L))
AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。


}

void CShutDownView::OnExit()
{


CWnd* pMainWindow = AfxGetMainWnd();

::PostMessage(pMainWindow->m_hWnd,WM_CLOSE,0,0);
}

void CShutDownView::OnRestart()
{
/*
步骤:
1、opens the access token associated with a process.
*/

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{
if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
/* The LookupPrivilegeValue function retrieves the locally unique identifier (LUID)
used on a specified system to locally represent the specified privilege name.
BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName,// address of string specifying the system

LPCTSTR lpName, // address of string specifying the privilege
PLUID lpLuid // address of locally unique identifier
);
*/
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
/*
The AdjustTokenPrivileges function enables or disables privileges in the specified access token. Enabling or disabling privileges in an access token requires TOKEN_ADJUST_PRIVILEGES access.
TokenPrivileges(
HANDLE TokenHandle, // handle to token that contains privileges
BOOL DisableAllPrivileges,// flag for disabling all privileges
PTOKEN_PRIVILEGES NewState,// pointer to new privilege information
DWORD BufferLength, // size, in bytes, of the PreviousState buffer
PTOKEN_PRIVILEGES PreviousState, // receives original state of changed privileges
PDWORD ReturnLength // receives required size of the PreviousState buffer
);*/

AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_REBOOT,0L))
AfxMessageBox("重新启动失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。


}

void CShutDownView::OnShutdown()
{

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{
if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_SHUTDOWN,0L))
AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。

}


void CShutDownView::OnPoweroff()
{

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{

if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_POWEROFF,0L))
AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。

}

BOOL CShutDownView::IsWin98()
{
DWORD dwVersionNum = GetVersion();
if(dwVersionNum<0x80000000)//NT
return FALSE;
else //WIN98
return TRUE;
}

这段代码应该也是可以的,先获取特权然后再.....

BOOL CMainFrame::shutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
BOOL fResult; // Get the current process token handle so we can get shutdown privilege.
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return FALSE; // Get the LUID for shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
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 test the return value of AdjustTokenPrivileges.
if(GetLastError() != ERROR_SUCCESS)
return FALSE;
// Actually shutdown
fResult = InitiateSystemShutdown(NULL, NULL, 0, TRUE, FALSE);
// to shutdown
//fResult = InitiateSystemShutdown(NULL, NULL, 0, TRUE, TRUE);
// to reboot
if(!fResult)
return FALSE; // Disable shutdown privilege.
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
if(GetLastError() != ERROR_SUCCESS)
return FALSE;
return TRUE;
}