关机代码分析
给你一段代码吧,下面是我的关机程序的部分代码
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; }