#include
 <stdio.h>
#include <conio.h>
#include <windows.h>
// 시스템 종료
BOOL MySystemShutdown( LPTSTR lpMsg )
{
    HANDLE hToken;              // handle to process token
    TOKEN_PRIVILEGES tkp;       // pointer to token structure

    BOOL fResult;               // system shutdown flag

    // 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;  // one privilege to set    
    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; 

    // Display the shutdown dialog box and start the countdown.

    fResult = InitiateSystemShutdown( 
        NULL,    // shut down local computer
        lpMsg,   // message for user
        60,      // time-out period, in seconds
        FALSE,   // ask user to close apps
        TRUE);   // reboot after shutdown

    if (!fResult) 
        return FALSE; 

    // Disable shutdown privilege.

    tkp.Privileges[0].Attributes = 0
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0
        (PTOKEN_PRIVILEGES) NULL, 0); 

    return TRUE; 
}
// 시스템 종료 취소
BOOL PreventSystemShutdown()
{
    HANDLE hToken;              // handle to process token
    TOKEN_PRIVILEGES tkp;       // pointer to token structure

    // 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;  // one privilege to set    
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    // Get shutdown privilege for this process.

    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0
        (PTOKEN_PRIVILEGES)NULL, 0); 

    if (GetLastError() != ERROR_SUCCESS) 
        return FALSE; 

    // Prevent the system from shutting down.

    if ( !AbortSystemShutdown(NULL) ) 
        return FALSE; 

    // Disable shutdown privilege.

    tkp.Privileges[0].Attributes = 0
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0
        (PTOKEN_PRIVILEGES) NULL, 0); 

    return TRUE;
}

int main(void)
{
    // 시스템 종료 지시
    MySystemShutdown("시스템 종료를 취소하려면 콘솔 창에서 아무 키나 누르세요.");

    printf("시스템 종료를 취소하려면 아무 키나 누르세요 : ");
    getch();
    // 시스템 종료 취소
    PreventSystemShutdown();

    return 0;
}

출처 : C언어를배우자 네이버까페

Trackback Address :: http://couple.haruschool.com/tc/trackback/42

댓글을 달아 주세요