#include #include // アクセス権の定数 #define OPEN_PROCESS_TOKEN (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY) // プロセスハンドルから特権名を有効/無効 BOOL ProcessPrivilegeName(HANDLE hProcess, LPCTSTR lpPrivilegeName, BOOL bEnable) { BOOL bSuccess = FALSE; // 戻り値(成功/失敗) HANDLE hToken; // アクセストークンのハンドル LUID Luid; // LUID(ローカル・ユニークID) DWORD dwSize; // 特権トークン容量(変更前の特権) TOKEN_PRIVILEGES OldPriv; // 特権トークン情報(変更前の特権) TOKEN_PRIVILEGES NewPriv; // 特権トークン情報(新しい特権) // アクセストークンのハンドルを取得 if (OpenProcessToken(hProcess, OPEN_PROCESS_TOKEN, &hToken)){ // 特権名のLUIDを取得 if (LookupPrivilegeValue(NULL, lpPrivilegeName, &Luid)){ NewPriv.PrivilegeCount = 1; // 特権数 NewPriv.Privileges[0].Luid = Luid; // 識別子 NewPriv.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0; // 特権トークン状態の有効/無効 if (AdjustTokenPrivileges(hToken, FALSE, &NewPriv, sizeof(TOKEN_PRIVILEGES), &OldPriv, &dwSize)){ if (GetLastError() == ERROR_SUCCESS){ bSuccess = TRUE; } } } CloseHandle(hToken); } return bSuccess; } void SystemStandby(void) { BOOL bFlag = FALSE; UINT uMenu; do { printf("\n"); printf("1...休止状態\n"); printf("2...スタンバイ\n"); scanf("%d", &uMenu); switch (uMenu){ case 1: bFlag = FALSE; break; case 2: bFlag = TRUE; break; default: uMenu = 0; break; } } while (uMenu == 0); // Windows NT 系のために SE_SHUTDOWN_NAME 特権を有効にする ProcessPrivilegeName(GetCurrentProcess(), SE_SHUTDOWN_NAME, TRUE); // 休止状態/スタンバイを実行する SetSystemPowerState(bFlag, FALSE); } int main(void) { SystemStandby(); return 0; }