7,655
社区成员
发帖
与我相关
我的任务
分享
DWORD ResumeMonThread(LPVOID)
{
MSGQUEUEOPTIONS msgOptions = {0};
while(!IsAPIReady(SH_SHELL) || !IsAPIReady(SH_WMGR) || !IsAPIReady(SH_GDI))
{
Sleep(250);
}
wprintf(_T("ResumeMonThread TID = 0x%x\r\n"), GetCurrentThreadId());
// Create a message queue for Power Manager notifications.
msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);
msgOptions.dwFlags = 0;
msgOptions.dwMaxMessages = 0;
msgOptions.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;
msgOptions.bReadAccess = TRUE;
g_hPMReadMsgQ = CreateMsgQueue(NULL, &msgOptions);
if ( g_hPMReadMsgQ == NULL )
{
DEBUGMSG(1, (TEXT("PWM: CreateMsgQueue(Read): error %d\r\n"), GetLastError()));
g_FlagExitThrd = TRUE;
}
// Request Power notifications
g_hPMNotifications = RequestPowerNotifications(g_hPMReadMsgQ, POWER_NOTIFY_ALL);
if ( ! g_hPMNotifications )
{
DEBUGMSG(1, (TEXT("PWM: RequestPowerNotifications: error %d\r\n"), GetLastError()));
g_FlagExitThrd = TRUE;
}
DebugOut(TEXT("ResumeMonThread: create thread success!!!"));
while(!g_FlagExitThrd)
{
DWORD iBytesInQueue = 0;
DWORD dwFlags;
UCHAR buf[QUEUE_SIZE];
PPOWER_BROADCAST pB = (PPOWER_BROADCAST) buf;
memset(buf, 0, QUEUE_SIZE);
DEBUGMSG(0, (TEXT("PWM: Waiting for PM state transition notification\r\n")));
// Read message from queue.
if ( ! ReadMsgQueue(g_hPMReadMsgQ, buf, QUEUE_SIZE, &iBytesInQueue, INFINITE, &dwFlags) )
{
DEBUGMSG(1, (TEXT("PWM: ReadMsgQueue: ERROR:%d\r\n"), GetLastError()));
}
else if ( iBytesInQueue < sizeof(POWER_BROADCAST) )
{
DEBUGMSG(1, (TEXT("PWM: Received short message: %d bytes, expected: %d\r\n"),
iBytesInQueue, sizeof(POWER_BROADCAST)));
}
else
{
switch ( pB->Message )
{
case PBT_TRANSITION:
//RETAILMSG(1, (TEXT("PWM: PBT_TRANSITION to system power state [Flags: 0x%x]: '%s'\r\n"), pB->Flags, pB->SystemPowerState));
switch ( POWER_STATE(pB->Flags) )
{
case POWER_STATE_ON:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_ON\r\n")));
break;
case POWER_STATE_OFF:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_OFF\r\n")));
break;
case POWER_STATE_CRITICAL:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_CRITICAL\r\n")));
break;
case POWER_STATE_BOOT:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_BOOT\r\n")));
break;
case POWER_STATE_IDLE:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_IDLE\r\n")));
break;
case POWER_STATE_SUSPEND:
DebugOut(TEXT("POWER_STATE_SUSPEND for resume mon\r\n"));
break;
case POWER_STATE_RESET:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_RESET\r\n")));
break;
case POWER_STATE_PASSWORD:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_PASSWORD\r\n")));
break;
case POWER_STATE_UNATTENDED:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_UNATTENDED\r\n")));
break;
case 0:
//DEBUGMSG(1,(TEXT("PWM: Power State Flags:0x%x\r\n"),pB->Flags));
break;
default:
//DEBUGMSG(1,(TEXT("PWM: Unknown Power State Flags:0x%x\r\n"),pB->Flags));
break;
}
break;
case PBT_RESUME:
{
DebugOut(TEXT("PBT_RESUME\r\n"));
if(g_hMainWnd != NULL)
{
ShowWindow(g_hMainWnd, SW_SHOWNORMAL);
SetForegroundWindow((HWND)((ULONG) g_hMainWnd | 0x00000001));
SendMessage(g_hMainWnd, WM_REFRESH_TIME, 0, 0);
}
break;
}
case PBT_POWERSTATUSCHANGE:
//DebugOut(TEXT("PWM: PBT_POWERSTATUSCHANGE\r\n"));
break;
case PBT_POWERINFOCHANGE:
{
PPOWER_BROADCAST_POWER_INFO ppbpi = (PPOWER_BROADCAST_POWER_INFO) pB->SystemPowerState;
// RETAILMSG(1, (TEXT("PWM: PBT_POWERINFOCHANGE\r\n")));
// RETAILMSG(1, (TEXT("PWM: \tAC line status %u, battery flag %u, backup flag %u, %d levels\r\n"),
// ppbpi->bACLineStatus, ppbpi->bBatteryFlag,
// ppbpi->bBackupBatteryFlag, ppbpi->dwNumLevels));
break;
}
default:
//DEBUGMSG(1, (TEXT("PWM: Unknown Message:%d\r\n"), pB->Message));
break;
}
}
}
// We shouldn't be here
if ( g_hPMNotifications )
{
StopPowerNotifications(g_hPMNotifications);
g_hPMNotifications = NULL;
}
if ( g_hPMReadMsgQ )
{
CloseMsgQueue(g_hPMReadMsgQ);
g_hPMReadMsgQ = NULL;
}
DebugOut(_T("ResumeMonThread Exit\r\n"));
return 0;
}
VOID ReleasePMThread(VOID)
{
g_FlagExitThrd = TRUE;
if ( g_hPMNotifications )
{
StopPowerNotifications(g_hPMNotifications);
g_hPMNotifications = NULL;
}
if ( g_hPMReadMsgQ )
{
CloseMsgQueue(g_hPMReadMsgQ);
g_hPMReadMsgQ = NULL;
}
return;
}