2016년 7월 24일 일요일

Win32 윈도우 종료하기.(NtShutdownSystem, ExitWindowsEx)

보통 윈도우를 종료하려면 아래의 API를 사용한다.

ExitWindowsEx( EWX_SHUTDOWN|EWX_FORCE, 0 );

자세한 내용은 MSDN참고.

위 API를 이용해서 종료하면, 시작버튼->종료 를 누른것과 같다. 윈도우입장에서 보면 현재 상태를 저장하고 종료한다.

하지만 윈도우의 상태를 저장할 때, 시스템이 바로 종료되지 않을 수 있기 때문에 문제가 생기는 경우가 종종있다. 예를 들면, 종료 중...상태에서 멈춰있다거나.....

그냥 윈도우를 종료하려면 NtShutdownSystem을 사용하면 된다.

아마도 ExitWindowsEx API의 마지막에서는 NtShutdownSystem를 호출하는 거 같다.

NtShutdownSystem은 윈도우의 상태를 저장하지 않고 그냥 종료해버린다. 쉽게 얘기하면 '종료 중...' 이라는 메시지가 나오지 않는다. 그냥 퍽!하고 꺼진다.

사용은 다음과 같이 하면 된다.

typedef enum _SHUTDOWN_ACTION
{
ShutdownNoReboot,
ShutdownReboot,
ShutdownPowerOff
} SHUTDOWN_ACTION;
typedef DWORD (WINAPI* lpNtShutdownSystem)(SHUTDOWN_ACTION Action);

HINSTANCE hGetProcIDDLL = LoadLibrary( _T("ntdll.dll") );
lpNtShutdownSystem NtShutdownSystem = NULL;
NtShutdownSystem = ( lpNtShutdownSystem )GetProcAddress( hGetProcIDDLL, "NtShutdownSystem" );
if( !NtShutdownSystem )
{
AfxMessageBox( _T("기능을 수행할 수 없습니다.") );
FreeLibrary( hGetProcIDDLL );
return 1;
}

NtShutdownSystem( ShutdownPowerOff );

소스를 보면 알겠지만 재부팅도 된다.

댓글 없음: