/* * DoTheScreenSaver * * Check if scrensaver should be started and sends message to SAS window */ VOID FASTCALL DoTheScreenSaver(VOID) { LARGE_INTEGER TickCount; DWORD Test, TO; if (gspv.iScrSaverTimeout > 0) // Zero means Off. { KeQueryTickCount(&TickCount); Test = MsqCalculateMessageTime(&TickCount); Test = Test - LastInputTick; TO = 1000 * gspv.iScrSaverTimeout; if (Test > TO) { TRACE("Screensaver Message Start! Tick %lu Timeout %d \n", Test, gspv.iScrSaverTimeout); if (ppiScrnSaver) // We are or we are not the screensaver, prevent reentry... { if (!(ppiScrnSaver->W32PF_flags & W32PF_IDLESCREENSAVER)) { ppiScrnSaver->W32PF_flags |= W32PF_IDLESCREENSAVER; ERR("Screensaver is Idle\n"); } } else { PUSER_MESSAGE_QUEUE ForegroundQueue = IntGetFocusMessageQueue(); if (ForegroundQueue && ForegroundQueue->spwndActive) UserPostMessage(hwndSAS, WM_LOGONNOTIFY, LN_START_SCREENSAVE, 1); // lParam 1 == Secure else UserPostMessage(hwndSAS, WM_LOGONNOTIFY, LN_START_SCREENSAVE, 0); } } } }
/* * IntLastInputTick * * Updates or gets last input tick count */ static DWORD FASTCALL IntLastInputTick(BOOL bUpdate) { if (bUpdate) { LARGE_INTEGER TickCount; KeQueryTickCount(&TickCount); LastInputTick = MsqCalculateMessageTime(&TickCount); if (gpsi) gpsi->dwLastRITEventTickCount = LastInputTick; } return LastInputTick; }
VOID FASTCALL ProcessTimers(VOID) { LARGE_INTEGER TickCount, DueTime; LONG Time; PLIST_ENTRY pLE; PTIMER pTmr; LONG TimerCount = 0; TimerEnterExclusive(); pLE = TimersListHead.Flink; KeQueryTickCount(&TickCount); Time = MsqCalculateMessageTime(&TickCount); DueTime.QuadPart = (LONGLONG)(-500000); while(pLE != &TimersListHead) { pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); TimerCount++; if (pTmr->flags & TMRF_WAITING) { pLE = pTmr->ptmrList.Flink; pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); continue; } if (pTmr->flags & TMRF_INIT) { pTmr->flags &= ~TMRF_INIT; // Skip this run. } else { if (pTmr->cmsCountdown < 0) { ASSERT(pTmr->pti); if ((!(pTmr->flags & TMRF_READY)) && (!(pTmr->pti->TIF_flags & TIF_INCLEANUP))) { if (pTmr->flags & TMRF_ONESHOT) pTmr->flags |= TMRF_WAITING; if (pTmr->flags & TMRF_RIT) { // Hard coded call here, inside raw input thread. pTmr->pfn(NULL, WM_SYSTIMER, pTmr->nID, (LPARAM)pTmr); } else { pTmr->flags |= TMRF_READY; // Set timer ready to be ran. // Set thread message queue for this timer. if (pTmr->pti->MessageQueue) { // Wakeup thread ASSERT(pTmr->pti->MessageQueue->NewMessages != NULL); KeSetEvent(pTmr->pti->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); } } } pTmr->cmsCountdown = pTmr->cmsRate; } else pTmr->cmsCountdown -= Time - TimeLast; } pLE = pLE->Flink; } // Restart the timer thread! ASSERT(MasterTimer != NULL); KeSetTimer(MasterTimer, DueTime, NULL); TimeLast = Time; TimerLeave(); TRACE("TimerCount = %d\n", TimerCount); }