윈도우에서 시스템 Shutdown, Reboot, Log-Off는 ExitWindowsEx 함수로, Suspend는 SetSystemPowerState 함수로 가능합니다.
윈도우 NT를 베이스로 하는 2000, XP의 경우는 시스템을 컨트롤 하기 위해서는 권한을 변경하는 과정이 필요합니다.
 
BOOL IsWindowsNT()
{
    OSVERSIONINFO verInfo;
    verInfo.dwOSVersionInfoSize = sizeof(verInfo);
    GetVersionEx(&verInfo) ;
    switch(verInfo.dwPlatformId)
    {
        case VER_PLATFORM__WINDOWS:
              return FALSE;
        case VER_PLATFORM__NT:
              return TRUE;
     }
   return FALSE;
}

BOOL AdjustSystemForShutdown()
{
        if(IsWindowsNT() == FALSE)
               return FALSE ;

        HANDLE hTk;
        TOKEN_PRIVILEGES tp;

        /* Get a token for this process. */
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTk))
                return FALSE;

        /* Get the LUID for the shutdown privilege. */
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid);

        tkp.PrivilegeCount = 1; /* one privilege to set */
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

        /* Get the shutdown privilege for this process. */
        return AdjustTokenPrivileges(hTk, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
}
 


이렇게 해서, 권한 변경에 성공하면 ExitWindowsEx, SetSystemPowerState 함수로 자신이 원하는 대로 시스템을 컨트롤 할 수 있습니다.
 
     // Windows 2000, XP       
     // Log Off
      ExitWindowsEx(EWX_LOGOFF|EWX_FORCEIFHUNG , SHTDN_REASON_FLAG_PLANNED );  

       // Shutdown
       ExitWindowsEx(EWX_POWEROFF|EWX_FORCEIFHUNG , SHTDN_REASON_FLAG_PLANNED ); // NT
 
       // Reboot
       ExitWindowsEx(EWX_REBOOT|EWX_FORCEIFHUNG,SHTDN_REASON_FLAG_PLANNED );

       // Suspend
       SetSystemPowerState(TRUE, TRUE ); // force suspend
 
      // Windows 95, 98, ME
      // Log Off
      ExitWindowsEx(EWX_LOGOFF|EWX_FORCE , 0 );  

       // Shutdown
       ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE, 0 ); // Windows 98, Windows ME

       // Reboot
       ExitWindowsEx(EWX_REBOOT|EWX_FORCE, 0 );

       // Suspend
       SetSystemPowerState(TRUE, TRUE ); // force suspend

facebook posting twit

  • Starting an application as an icon in the system tray
  • 디렉토리 복사 루틴 (하부디렉토리까지 몽땅)
  • File Attribute 바꾸는 방법
  • wave 파일 mixing 하기. (웨이브 믹싱)
  • ATL/ActiveX 에서 자바스크립트로 데이터(문자열) 보내기
  • GDI+ 에서 이미지 반투명 처리하기..
  • 자기자신 IP알아내기(로칼컴퓨터)
  • 프로세스명으로 프로세스 죽이는 함수
  • 빈폴더 찾아내기
  • IE 패치에 따른 object, embed, applet 대처 방안
    Tagged on:     
  • Leave a Reply