I’m trying to have my PC sleep at a certain time (00:05) and wake up at 07:00.
<code> SYSTEMTIME sT;
GetLocalTime(&sT);
if (sT.wHour == 0)
{
if (sT.wMinute >= 5)
{
SYSTEMTIME sT = {};
GetLocalTime(&sT);
sT.wHour = 5; // UTC+2 I am
sT.wMinute = 0;
sT.wSecond = 0;
sT.wMilliseconds = 0;
LARGE_INTEGER WaitTime = {};
SystemTimeToFileTime(&sT, (LPFILETIME)&WaitTime);
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
if (hTimer)
{
if (SetWaitableTimer(hTimer, &WaitTime, 0, NULL, NULL, TRUE))
{
if (SetSuspendState(FALSE, FALSE, FALSE))
{
}
}
CloseHandle(hTimer);
}
}
}
}
</code>
<code> SYSTEMTIME sT;
GetLocalTime(&sT);
if (sT.wHour == 0)
{
if (sT.wMinute >= 5)
{
SYSTEMTIME sT = {};
GetLocalTime(&sT);
sT.wHour = 5; // UTC+2 I am
sT.wMinute = 0;
sT.wSecond = 0;
sT.wMilliseconds = 0;
LARGE_INTEGER WaitTime = {};
SystemTimeToFileTime(&sT, (LPFILETIME)&WaitTime);
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
if (hTimer)
{
if (SetWaitableTimer(hTimer, &WaitTime, 0, NULL, NULL, TRUE))
{
if (SetSuspendState(FALSE, FALSE, FALSE))
{
}
}
CloseHandle(hTimer);
}
}
}
}
</code>
SYSTEMTIME sT;
GetLocalTime(&sT);
if (sT.wHour == 0)
{
if (sT.wMinute >= 5)
{
SYSTEMTIME sT = {};
GetLocalTime(&sT);
sT.wHour = 5; // UTC+2 I am
sT.wMinute = 0;
sT.wSecond = 0;
sT.wMilliseconds = 0;
LARGE_INTEGER WaitTime = {};
SystemTimeToFileTime(&sT, (LPFILETIME)&WaitTime);
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
if (hTimer)
{
if (SetWaitableTimer(hTimer, &WaitTime, 0, NULL, NULL, TRUE))
{
if (SetSuspendState(FALSE, FALSE, FALSE))
{
}
}
CloseHandle(hTimer);
}
}
}
}
Before that I ‘ve enabled the shutdown token:
<code> SYSTEM_POWER_CAPABILITIES sysPowCab = { 0 };
if (CallNtPowerInformation(SystemPowerCapabilities, NULL, 0, &sysPowCab, sizeof(SYSTEM_POWER_CAPABILITIES)) == 0)
{
HANDLE hToken = 0;
TOKEN_PRIVILEGES tkp = {};
if (OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
//Enable allow wake up timer
GUID* pPwrGUID;
GUID subGUID = GUID_SLEEP_SUBGROUP;
GUID BriGUID = GUID_ALLOW_RTC_WAKE;
DWORD ret = PowerGetActiveScheme(NULL, &pPwrGUID);
if (ret == ERROR_SUCCESS)
{
ret = PowerWriteACValueIndex(NULL, pPwrGUID, &subGUID, &BriGUID, 1);
if (ret == ERROR_SUCCESS)
{
}
}
}
}
</code>
<code> SYSTEM_POWER_CAPABILITIES sysPowCab = { 0 };
if (CallNtPowerInformation(SystemPowerCapabilities, NULL, 0, &sysPowCab, sizeof(SYSTEM_POWER_CAPABILITIES)) == 0)
{
HANDLE hToken = 0;
TOKEN_PRIVILEGES tkp = {};
if (OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
//Enable allow wake up timer
GUID* pPwrGUID;
GUID subGUID = GUID_SLEEP_SUBGROUP;
GUID BriGUID = GUID_ALLOW_RTC_WAKE;
DWORD ret = PowerGetActiveScheme(NULL, &pPwrGUID);
if (ret == ERROR_SUCCESS)
{
ret = PowerWriteACValueIndex(NULL, pPwrGUID, &subGUID, &BriGUID, 1);
if (ret == ERROR_SUCCESS)
{
}
}
}
}
</code>
SYSTEM_POWER_CAPABILITIES sysPowCab = { 0 };
if (CallNtPowerInformation(SystemPowerCapabilities, NULL, 0, &sysPowCab, sizeof(SYSTEM_POWER_CAPABILITIES)) == 0)
{
HANDLE hToken = 0;
TOKEN_PRIVILEGES tkp = {};
if (OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
//Enable allow wake up timer
GUID* pPwrGUID;
GUID subGUID = GUID_SLEEP_SUBGROUP;
GUID BriGUID = GUID_ALLOW_RTC_WAKE;
DWORD ret = PowerGetActiveScheme(NULL, &pPwrGUID);
if (ret == ERROR_SUCCESS)
{
ret = PowerWriteACValueIndex(NULL, pPwrGUID, &subGUID, &BriGUID, 1);
if (ret == ERROR_SUCCESS)
{
}
}
}
}
This only works if I set it to very close time, like 5 minutes after sleep. Otherwise it doesn’t work.
What could be the issue? Power Options -> Wake Timers = enabled already.