スリープから指定時間に復帰するプログラム(32/64bit)

WaitableTimerをセット後、スリープし、指定時間後に復帰するプログラムです。
Visual C++ 2008 Standard Edition 32/64bit対応


#include <windows.h>
#include <tchar.h>

int WINAPI _tWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,TCHAR* lpsCmdLine, int nCmdShow){

        MessageBox(0,TEXT("60秒後に冬眠から目覚めます"),TEXT("メッセージ"),MB_YESNO | MB_ICONQUESTION);

        HANDLE timeH = CreateWaitableTimer(NULL, FALSE, NULL);
        LARGE_INTEGER ltime;
        ltime.QuadPart = -10000000*60;          //指定時刻までのタイマー時間を100ns単位で取得 負で指定するのがミソ

        SetWaitableTimer(timeH, &ltime, 0, 0, 0, TRUE);

        
        DWORD ret;
    HANDLE hToken;
    LUID    Luid;
    TOKEN_PRIVILEGES    tNew,tPre;

    HANDLE hProcess = GetCurrentProcess();
    OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken);
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Luid);
    tNew.PrivilegeCount = 1;
    tNew.Privileges[0].Luid = Luid;
    tNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tNew, sizeof(tPre), &tPre, &ret);
        SetSystemPowerState(FALSE, FALSE);      //      サスペンド

        MessageBox(0,TEXT("おはよう"),TEXT("メッセージ"),MB_YESNO | MB_ICONQUESTION);

        CancelWaitableTimer(timeH);
        CloseHandle(timeH);

return 0;

}