ExitDlg.cpp
上传用户:ynjin1970
上传日期:2014-10-13
资源大小:6438k
文件大小:3k
源码类别:

中间件编程

开发平台:

Visual C++

  1. // ExitDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "test.h"
  5. #include "ExitDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CExitDlg dialog
  13. CExitDlg::CExitDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CExitDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CExitDlg)
  17. m_bShutDown = FALSE;
  18. //}}AFX_DATA_INIT
  19. }
  20. void CExitDlg::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDialog::DoDataExchange(pDX);
  23. //{{AFX_DATA_MAP(CExitDlg)
  24. DDX_Check(pDX, IDC_SHUTDOWN, m_bShutDown);
  25. //}}AFX_DATA_MAP
  26. }
  27. BEGIN_MESSAGE_MAP(CExitDlg, CDialog)
  28. //{{AFX_MSG_MAP(CExitDlg)
  29. ON_BN_CLICKED(IDC_OK, OnClickedOk)
  30. ON_BN_CLICKED(IDC_CANCEL, OnClickedCancel)
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CExitDlg message handlers
  35. void CExitDlg::OnOK() 
  36. {
  37. // TODO: Add extra validation here
  38. }
  39. void CExitDlg::OnCancel() 
  40. {
  41. // TODO: Add extra cleanup here
  42. }
  43. void CExitDlg::OnClickedOk() 
  44. {
  45. // TODO: Add your control notification handler code here
  46. UpdateData(TRUE);
  47. if(m_bShutDown)
  48. {
  49.    //  此处所调用的函数大多为API函数;
  50.    HANDLE processHandle =  NULL;
  51.    DWORD thisProcessID = 0;
  52.    thisProcessID = GetCurrentProcessId();     //  得到当前进程的ID;
  53.    if(!thisProcessID)
  54.           return;
  55.        processHandle = OpenProcess(PROCESS_ALL_ACCESS|STANDARD_RIGHTS_REQUIRED,FALSE,thisProcessID);  //  得到当前进程的句柄;
  56.        if(!processHandle)
  57.       return;
  58.        HANDLE tokenHandle = NULL;
  59.    OpenProcessToken(processHandle,TOKEN_ADJUST_PRIVILEGES,&tokenHandle);  //  得到accessToken的句柄;
  60.      if(!tokenHandle)
  61.       return;
  62.        CloseHandle(processHandle);  //  进程句柄使用结束后关闭;
  63.        TOKEN_PRIVILEGES tp; 
  64.        LUID luid;
  65.        if(!LookupPrivilegeValue(NULL,"SeShutdownPrivilege",&luid))   //  给luid赋制值;
  66.           return;
  67.    tp.PrivilegeCount = 1;
  68.        tp.Privileges[0].Luid = luid;
  69.        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  70.        AdjustTokenPrivileges(tokenHandle,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL); 
  71.        if(GetLastError() != ERROR_SUCCESS)
  72.           return; 
  73.   
  74.        if(!ExitWindowsEx(EWX_POWEROFF,0))
  75.           return;
  76. }
  77. CDialog::OnOK();
  78. }
  79. void CExitDlg::OnClickedCancel() 
  80. {
  81. // TODO: Add your control notification handler code here
  82. CDialog::OnCancel();
  83. }