ExitWindowsEx ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÄÄÇ»Å͸¦ Á¾·á, Àç½ÃÀÛ, ·Î±×¾Æ¿ô ½ÃŰ´Â ¹æ¹ýÀº ¸Å¿ì °£´ÜÇÕ´Ï´Ù.
ÀÌ ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ¿¡ ¾Æ·¡ ³ª¿µÈ °ªÁß¿¡¼ ¿øÇÏ´Â °ªÀ» Á¶ÇÕÇØ¼ ¸í½Ã¸¸ ÇØÁÖ¸é µÇ±â ¶§¹®ÀÔ´Ï´Ù.
1. EWX_LOGOFF : »ç¿ëÁßÀÎ ÇÁ·Î±×·¥À» Á¾·áÇÏ°í ½Ã½ºÅÛÀ» LOG OFF ½ÃŲ´Ù.
2. EWX_POWEROFF : ½Ã½ºÅÛÀ» Á¾·áÇϰí Àü¿øÀ» ²÷´Ù.
3. EWX_REBOOT : ½Ã½ºÅÛÀ» Á¾·á½ÃŲ ÈÄ ½Ã½ºÅÛÀ» Àç½ÃÀÛ ÇÑ´Ù.
4. EWX_SHUTDOWN : »ç¿ëÀÚ°¡ ½Ã½ºÅÛÀÇ Àü¿øÀ» ²ø ¼ö ÀÖµµ·Ï ½Ã½ºÅÛÀ» Á¾·áÇÑ´Ù.
5. EWX_FORCE : °Á¦·Î ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃŲ´Ù.
ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ¶§ ÁÖÀÇÇØ¾ßÇÒ Á¡Àº À©µµ¿ìÁî NT °è¿(Windows NT, Windows 2000, Windows XP..)ÀÇ
¿î¿µÃ¼Á¦¿¡¼´Â Á¾·á¸¦ À§Çؼ ExitWindowEx ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ÇÁ·Î¼¼½º°¡ SE_SHUTDOWN_NAME
À̶ó´Â ±ÇÇÑÀ» °¡Áö°í ÀÖ¾î¾ß Çϱ⠶§¹®¿¡ ÇØ´ç ±ÇÇÑÀ» ¾ò´Â ±â´ÉÀ» Ãß°¡ÇØÁÖ¿©¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
( À©µµ¿ìÁî 98, Me¿Í °°Àº ¿î¿µÃ¼Á¦¿¡¼´Â ±ÇÇÑÀÌ ÇÊ¿ä ¾ø½À´Ï´Ù. )
µû¶ó¼ ExitWindowsEx ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ¸ÕÀú ¿î¿µÃ¼Á¦ÀÇ ¹öÀüÀ» üũÇÏ´Â Äڵ尡 ÀÖ¾î¾ß ÇÕ´Ï´Ù.
// ÇöÀç ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í ÀÖ´Â À©µµ¿ìÁîÀÇ ¹öÀüÀ» ¹ÝȯÇϵµ·Ï ÀÛ¼ºµÈ ÇÔ¼öÀÔ´Ï´Ù.
// ------------------------------------------------------------------------------
// [ ¹Ýȯ°ª : ÀÇ¹Ì ]
// -1 : ¹öÀü¾ò±â ½ÇÆÐ, 1 : Windows 95, 2 : Windows 98, 3 : Windows ME, 4 : Windows NT,
// 5 : Windows 2000, 6 : Windows XP
char GetOSVersionType()
{
// °è»êµÈ À©µµ¿ìÁî ¹öÀüÀ» ÀúÀåÇÒ º¯¼ö
char version = -1;
// À©µµ¿ìÁî ¹öÀü¿¡ °ü·ÃµÈ Á¤º¸¸¦ ¾ò¾î¿Ã º¯¼ö
OSVERSIONINFOEX osvi;
// OSVERSIONINFOEX ±¸Á¶Ã¼ °ªÀ» ¾ò¾ú´ÂÁö OSVERSIONINFO ±¸Á¶Ã¼°ªÀ» ¾ò¾ú´ÂÁö¸¦
// ±¸ºÐÇÒ º¯¼ö ( 0 À̸é, OSVERSIONINFO ±¸Á¶Ã¼ Á¤º¸¸¦ ¾ò¾ú´Ù´Â ¶æÀÔ´Ï´Ù. )
BOOL version_ex_flag = 0;
// ¿î¿µÃ¼Á¦ÀÇ ¹öÀü°ú °ü·ÃµÈ Á¤º¸¸¦ ¾ò±â À§ÇØ ±¸Á¶Ã¼ º¯¼ö¸¦ ÃʱâÈÇÕ´Ï´Ù.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
// ÇöÀç ¿î¿µÃ¼Á¦ÀÇ ¹öÀüÀ» ¾Ë¼ö ¾ø±â ¶§¹®¿¡ OSVERSIONINFOEX ¼Ó¼ºÀ¸·Î ¹öÀüÁ¤º¸¸¦ ¾ò½À´Ï´Ù.
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
// GetVersionEx ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÇöÀçÀÇ ¿î¿µÃ¼Á¦ Á¤º¸¸¦ ¾ò½À´Ï´Ù.
// OSVERSIONINFOEX °ªÀ» ¼³Á¤Çϰí È£ÃâÇ߱⠴빮¿¡ À©µµ¿ì NT 4.0 SP6 ÀÌ»ó ¹× ±× ÀÌÈÄ ¹öÀüÀÇ
// À©µµ¿ì°¡ ¾Æ´Ï¶ó¸é ÀÌ ÇÔ¼ö´Â ½ÇÆÐÇÒ °ÍÀÔ´Ï´Ù.
if(!(version_ex_flag = GetVersionEx((OSVERSIONINFO *)&osvi))){
// À©µµ¿ìÁî ¹öÀüÀÌ ³·¾Æ¼ OSVERSIONINFOEX Çü½ÄÀ¸·Î °ªÀ» ¾òÀ»¼ö ¾ø´Â °æ¿ì...
// OSVERSIONINFO Çü½ÄÀ¸·Î Àç¼³Á¤ÇÏ°í °ªÀ» ¾ò½À´Ï´Ù.
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if(!GetVersionEx((OSVERSIONINFO *)&osvi)) return -1;
}
// ¾ò¾î¿Â OSVERSIONINFOEX ±¸Á¶Ã¼ º¯¼öÀÇ °ªÀ» ÀÌ¿ëÇÏ¿© ¹öÀüÀ» ±¸º°ÇÕ´Ï´Ù.
switch(osvi.dwPlatformId){
// NT ±â¼ú ±â¹ÝÀÇ ¿î¿µÃ¼Á¦ÀÎ °æ¿ì
case VER_PLATFORM_WIN32_NT:
if(osvi.dwMajorVersion <= 4) version = 4;
else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) version = 5;
else if(version_ex_flag) version = 6;
break;
// À©µµ¿ìÁî 9x ±â¹ÝÀÇ ¿î¿µÃ¼Á¦ÀÎ °æ¿ì
case VER_PLATFORM_WIN32_WINDOWS:
if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) version = 1;
else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) version = 2;
else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) version = 3;
break;
}
return version;
}
// ÇöÀç ¿î¿µÃ¼Á¦°¡ NT °è¿ÀÎ °æ¿ì, SE_SHUTDOWN_NAME ·¹º§ÀÇ ±ÇÇÑ µî±ÞÀ»
// °¡Áö°í ÀÖ¾î¾ß Çϱ⠶§¹®¿¡ ¾Æ·¡ÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ±ÇÇÑÀ» ¾ò½À´Ï´Ù.
char GetNtPrivilege()
{
HANDLE h_token;
TOKEN_PRIVILEGES privilege_info;
// ÇöÀç ÇÁ·Î¼¼½ºÀÇ ±ÇÇѰú °ü·ÃµÈ Á¤º¸¸¦ º¯°æÇϱâ À§ÇØ ÅäÅ«Á¤º¸¸¦ ¿±´Ï´Ù.
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY, &h_token)){
// ±ÇÇѰú °ü·ÃµÈ Á¤º¸ Á¢±Ù¿¡ ½ÇÆÐÇÔ..
return 0;
}
// ÇöÀç ÇÁ·Î¼¼½º°¡ SE_SHUTDOWN_NAME ±ÇÇÑÀ» »ç¿ëÇÒ¼ö ÀÖµµ·Ï ¼³Á¤ÇÑ´Ù.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &privilege_info.Privileges[0].Luid);
privilege_info.PrivilegeCount = 1;
privilege_info.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// ÁöÁ¤ÇÑ °ªÀ¸·Î ±ÇÇÑÀ» Á¶Á¤ÇÑ´Ù.
AdjustTokenPrivileges(h_token, FALSE, &privilege_info, 0, (PTOKEN_PRIVILEGES)NULL, 0);
if(GetLastError() != ERROR_SUCCESS){
// ±ÇÇÑ Á¶Á¤¿¡ ½ÇÆÐÇÑ °æ¿ì...
return 0;
}
return 1;
}
// ÄÄÇ»Å͸¦ ²ø¶§ »ç¿ëÇÒ ÇÔ¼ö
void PowerOff()
{
if(GetOSVersionType()) <= 3{
// ÇöÀç ¿î¿µÃ¼Á¦°¡ Windows 95, Windows 98, Windows ME ÀÎ °æ¿ì...
ExitWindowsEx(EWX_LOGOFF | EWX_POWEROFF | EWX_SHUTDOWN, 0);
ExitWindowsEx(EWX_FORCE, 0);
} else if(GetNtPrivilege()){
// ÇöÀç ¿î¿µÃ¼Á¦°¡ Windows NT, Windows 2000, Windows XP ÀÎ °æ¿ì...
ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);
}
}