ReactOS 0.4.15-dev-8191-gbc6c731
timer.c File Reference
#include <win32k.h>
Include dependency graph for timer.c:

Go to the source code of this file.

Macros

#define NUM_WINDOW_LESS_TIMERS   32768
 
#define IntLockWindowlessTimerBitmap()    ExEnterCriticalRegionAndAcquireFastMutexUnsafe(Mutex)
 
#define IntUnlockWindowlessTimerBitmap()    ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(Mutex)
 
#define TimerEnterExclusive()
 
#define TimerLeave()
 

Functions

 DBG_DEFAULT_CHANNEL (UserTimer)
 
static PTIMER FASTCALL CreateTimer (VOID)
 
static BOOL FASTCALL RemoveTimer (PTIMER pTmr)
 
PTIMER FASTCALL FindTimer (PWND Window, UINT_PTR nID, UINT flags)
 
PTIMER FASTCALL FindSystemTimer (PMSG pMsg)
 
BOOL FASTCALL ValidateTimerCallback (PTHREADINFO pti, LPARAM lParam)
 
UINT_PTR FASTCALL IntSetTimer (PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
 
VOID CALLBACK SystemTimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
 
VOID FASTCALL StartTheTimers (VOID)
 
UINT_PTR FASTCALL SystemTimerSet (PWND Window, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
 
BOOL FASTCALL PostTimerMessages (PWND Window)
 
VOID FASTCALL ProcessTimers (VOID)
 
BOOL FASTCALL DestroyTimersForWindow (PTHREADINFO pti, PWND Window)
 
BOOL FASTCALL DestroyTimersForThread (PTHREADINFO pti)
 
BOOL FASTCALL IntKillTimer (PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
 
NTSTATUS NTAPI InitTimerImpl (VOID)
 
UINT_PTR APIENTRY NtUserSetTimer (HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
 
BOOL APIENTRY NtUserKillTimer (HWND hWnd, UINT_PTR uIDEvent)
 
UINT_PTR APIENTRY NtUserSetSystemTimer (HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
 
BOOL APIENTRY NtUserValidateTimerCallback (LPARAM lParam)
 

Variables

static LIST_ENTRY TimersListHead
 
static LONG TimeLast = 0
 
static PFAST_MUTEX Mutex
 
static RTL_BITMAP WindowLessTimersBitMap
 
static PVOID WindowLessTimersBitMapBuffer
 
static ULONG HintIndex = 1
 
ERESOURCE TimerLock
 

Macro Definition Documentation

◆ IntLockWindowlessTimerBitmap

#define IntLockWindowlessTimerBitmap ( )     ExEnterCriticalRegionAndAcquireFastMutexUnsafe(Mutex)

Definition at line 29 of file timer.c.

◆ IntUnlockWindowlessTimerBitmap

#define IntUnlockWindowlessTimerBitmap ( )     ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(Mutex)

Definition at line 32 of file timer.c.

◆ NUM_WINDOW_LESS_TIMERS

#define NUM_WINDOW_LESS_TIMERS   32768

Definition at line 20 of file timer.c.

◆ TimerEnterExclusive

#define TimerEnterExclusive ( )
Value:
{ \
KeEnterCriticalRegion(); \
ExAcquireResourceExclusiveLite(&TimerLock, TRUE); \
}
#define TRUE
Definition: types.h:120
ERESOURCE TimerLock
Definition: timer.c:27

Definition at line 35 of file timer.c.

◆ TimerLeave

#define TimerLeave ( )
Value:
{ \
ExReleaseResourceLite(&TimerLock); \
KeLeaveCriticalRegion(); \
}

Definition at line 41 of file timer.c.

Function Documentation

◆ CreateTimer()

static PTIMER FASTCALL CreateTimer ( VOID  )
static

Definition at line 52 of file timer.c.

53{
55 PTIMER Ret = NULL;
56
58 if (Ret)
59 {
62 }
63
64 return Ret;
65}
#define NULL
Definition: types.h:112
#define InsertTailList(ListHead, Entry)
ULONG Handle
Definition: gdb_input.c:15
@ TYPE_TIMER
Definition: ntuser.h:56
#define UserHMSetHandle(obj, handle)
Definition: ntuser.h:231
Definition: timer.h:4
LIST_ENTRY ptmrList
Definition: timer.h:6
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
Definition: object.c:568
static LIST_ENTRY TimersListHead
Definition: timer.c:16

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserTimer  )

◆ DestroyTimersForThread()

BOOL FASTCALL DestroyTimersForThread ( PTHREADINFO  pti)

Definition at line 549 of file timer.c.

550{
552 PTIMER pTmr;
553 BOOL TimersRemoved = FALSE;
554
556
557 while(pLE != &TimersListHead)
558 {
559 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
560 pLE = pLE->Flink; /* get next timer list entry before current timer is removed */
561 if ((pTmr) && (pTmr->pti == pti))
562 {
563 TimersRemoved = RemoveTimer(pTmr);
564 }
565 }
566
567 TimerLeave();
568
569 return TimersRemoved;
570}
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
PTHREADINFO pti
Definition: timer.h:7
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define TimerLeave()
Definition: timer.c:41
static BOOL FASTCALL RemoveTimer(PTIMER pTmr)
Definition: timer.c:70
#define TimerEnterExclusive()
Definition: timer.c:35

Referenced by ExitThreadCallback().

◆ DestroyTimersForWindow()

BOOL FASTCALL DestroyTimersForWindow ( PTHREADINFO  pti,
PWND  Window 
)

Definition at line 522 of file timer.c.

523{
524 PLIST_ENTRY pLE;
525 PTIMER pTmr;
526 BOOL TimersRemoved = FALSE;
527
528 if (Window == NULL)
529 return FALSE;
530
532 pLE = TimersListHead.Flink;
533 while(pLE != &TimersListHead)
534 {
535 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
536 pLE = pLE->Flink; /* get next timer list entry before current timer is removed */
537 if ((pTmr) && (pTmr->pti == pti) && (pTmr->pWnd == Window))
538 {
539 TimersRemoved = RemoveTimer(pTmr);
540 }
541 }
542
543 TimerLeave();
544
545 return TimersRemoved;
546}
Definition: window.c:28
PWND pWnd
Definition: timer.h:8

Referenced by co_UserFreeWindow(), and IntClientShutdown().

◆ FindSystemTimer()

PTIMER FASTCALL FindSystemTimer ( PMSG  pMsg)

Definition at line 126 of file timer.c.

127{
128 PLIST_ENTRY pLE;
129 PTIMER pTmr = NULL;
130
132 pLE = TimersListHead.Flink;
133 while (pLE != &TimersListHead)
134 {
135 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
136
137 if ( pMsg->lParam == (LPARAM)pTmr->pfn &&
138 (pTmr->flags & TMRF_SYSTEM) )
139 break;
140
141 pLE = pLE->Flink;
142 }
143 TimerLeave();
144
145 return pTmr;
146}
TIMERPROC pfn
Definition: timer.h:13
FLONG flags
Definition: timer.h:12
LPARAM lParam
Definition: winuser.h:3117
#define TMRF_SYSTEM
Definition: timer.h:20
LONG_PTR LPARAM
Definition: windef.h:208

Referenced by IntDispatchMessage().

◆ FindTimer()

PTIMER FASTCALL FindTimer ( PWND  Window,
UINT_PTR  nID,
UINT  flags 
)

Definition at line 96 of file timer.c.

99{
100 PLIST_ENTRY pLE;
101 PTIMER pTmr, RetTmr = NULL;
102
104 pLE = TimersListHead.Flink;
105 while (pLE != &TimersListHead)
106 {
107 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
108
109 if ( pTmr->nID == nID &&
110 pTmr->pWnd == Window &&
111 (pTmr->flags & (TMRF_SYSTEM|TMRF_RIT)) == (flags & (TMRF_SYSTEM|TMRF_RIT)))
112 {
113 RetTmr = pTmr;
114 break;
115 }
116
117 pLE = pLE->Flink;
118 }
119 TimerLeave();
120
121 return RetTmr;
122}
GLbitfield flags
Definition: glext.h:7161
UINT_PTR nID
Definition: timer.h:9
#define TMRF_RIT
Definition: timer.h:21

Referenced by IntKillTimer(), and IntSetTimer().

◆ InitTimerImpl()

NTSTATUS NTAPI InitTimerImpl ( VOID  )

Definition at line 594 of file timer.c.

595{
596 ULONG BitmapBytes;
597
598 /* Allocate FAST_MUTEX from non paged pool */
600 if (!Mutex)
601 {
603 }
604
606
607 BitmapBytes = ALIGN_UP_BY(NUM_WINDOW_LESS_TIMERS, sizeof(ULONG) * 8) / 8;
610 {
611 return STATUS_UNSUCCESSFUL;
612 }
613
616 BitmapBytes * 8);
617
618 /* Yes we need this, since ExAllocatePoolWithTag isn't supposed to zero out allocated memory */
620
623
624 return STATUS_SUCCESS;
625}
#define ALIGN_UP_BY(size, align)
Definition: Mutex.h:16
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
#define STATUS_SUCCESS
Definition: shellext.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define TAG_INTERNAL_SYNC
Definition: tags.h:18
#define TAG_TIMERBMP
Definition: tags.h:10
#define NUM_WINDOW_LESS_TIMERS
Definition: timer.c:20
static RTL_BITMAP WindowLessTimersBitMap
Definition: timer.c:23
static PVOID WindowLessTimersBitMapBuffer
Definition: timer.c:24
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
FAST_MUTEX
Definition: extypes.h:17

Referenced by DriverEntry().

◆ IntKillTimer()

BOOL FASTCALL IntKillTimer ( PWND  Window,
UINT_PTR  IDEvent,
BOOL  SystemTimer 
)

Definition at line 573 of file timer.c.

574{
575 PTIMER pTmr = NULL;
576 TRACE("IntKillTimer Window %p id %uI systemtimer %s\n",
577 Window, IDEvent, SystemTimer ? "TRUE" : "FALSE");
578
580 pTmr = FindTimer(Window, IDEvent, SystemTimer ? TMRF_SYSTEM : 0);
581
582 if (pTmr)
583 {
584 RemoveTimer(pTmr);
585 }
586 TimerLeave();
587
588 return pTmr ? TRUE : FALSE;
589}
#define TRACE(s)
Definition: solgame.cpp:4
PTIMER FASTCALL FindTimer(PWND Window, UINT_PTR nID, UINT flags)
Definition: timer.c:96

Referenced by co_UserHideCaret(), IntFlashWindowEx(), IntRemoveTrackMouseEvent(), IntTrackMouseEvent(), IntTrackMouseMove(), NtUserCallHwndParam(), NtUserCreateCaret(), NtUserKillTimer(), and SystemTimerProc().

◆ IntSetTimer()

UINT_PTR FASTCALL IntSetTimer ( PWND  Window,
UINT_PTR  IDEvent,
UINT  Elapse,
TIMERPROC  TimerFunc,
INT  Type 
)

Definition at line 177 of file timer.c.

182{
183 PTIMER pTmr;
184 UINT Ret = IDEvent;
186 DueTime.QuadPart = (LONGLONG)(-97656); // 1024hz .9765625 ms set to 10.0 ms
187
188#if 0
189 /* Windows NT/2k/XP behaviour */
190 if (Elapse > USER_TIMER_MAXIMUM)
191 {
192 TRACE("Adjusting uElapse\n");
193 Elapse = 1;
194 }
195#else
196 /* Windows XP SP2 and Windows Server 2003 behaviour */
197 if (Elapse > USER_TIMER_MAXIMUM)
198 {
199 TRACE("Adjusting uElapse\n");
200 Elapse = USER_TIMER_MAXIMUM;
201 }
202#endif
203
204 /* Windows 2k/XP and Windows Server 2003 SP1 behaviour */
205 if (Elapse < USER_TIMER_MINIMUM)
206 {
207 TRACE("Adjusting uElapse\n");
208 Elapse = USER_TIMER_MINIMUM; // 1024hz .9765625 ms, set to 10.0 ms (+/-)1 ms
209 }
210
211 /* Passing an IDEvent of 0 and the SetTimer returns 1.
212 It will create the timer with an ID of 0 */
213 if ((Window) && (IDEvent == 0))
214 Ret = 1;
215
216 pTmr = FindTimer(Window, IDEvent, Type);
217
218 if ((!pTmr) && (Window == NULL) && (!(Type & TMRF_SYSTEM)))
219 {
221
223
224 if (IDEvent == (UINT_PTR) -1)
225 {
227 ERR("Unable to find a free window-less timer id\n");
229 ASSERT(FALSE);
230 return 0;
231 }
232
233 IDEvent = NUM_WINDOW_LESS_TIMERS - IDEvent;
234 Ret = IDEvent;
235
237 }
238
239 if (!pTmr)
240 {
241 pTmr = CreateTimer();
242 if (!pTmr) return 0;
243
244 if (Window && (Type & TMRF_TIFROMWND))
245 pTmr->pti = Window->head.pti->pEThread->Tcb.Win32Thread;
246 else
247 {
248 if (Type & TMRF_RIT)
249 pTmr->pti = ptiRawInput;
250 else
252 }
253
254 pTmr->pWnd = Window;
255 pTmr->cmsCountdown = Elapse;
256 pTmr->cmsRate = Elapse;
257 pTmr->pfn = TimerFunc;
258 pTmr->nID = IDEvent;
259 pTmr->flags = Type|TMRF_INIT;
260 }
261 else
262 {
263 pTmr->cmsCountdown = Elapse;
264 pTmr->cmsRate = Elapse;
265 }
266
268 // Start the timer thread!
269 if (TimersListHead.Flink == TimersListHead.Blink) // There is only one timer
271
272 return Ret;
273}
Type
Definition: Type.h:7
#define ERR(fmt,...)
Definition: debug.h:113
return pRequest CreateTimer()
NTSYSAPI ULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG)
#define ASSERT(a)
Definition: mode.c:44
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
struct _LIST_ENTRY * Blink
Definition: typedefs.h:122
INT cmsRate
Definition: timer.h:11
INT cmsCountdown
Definition: timer.h:10
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
int64_t LONGLONG
Definition: typedefs.h:68
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190
PTHREADINFO ptiRawInput
Definition: input.c:15
PKTIMER MasterTimer
Definition: input.c:16
#define IntLockWindowlessTimerBitmap()
Definition: timer.c:29
#define IntUnlockWindowlessTimerBitmap()
Definition: timer.c:32
static ULONG HintIndex
Definition: timer.c:25
#define TMRF_INIT
Definition: timer.h:22
#define TMRF_TIFROMWND
Definition: timer.h:25
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22
#define ERROR_NO_SYSTEM_RESOURCES
Definition: winerror.h:931
#define USER_TIMER_MAXIMUM
Definition: winuser.h:905
#define USER_TIMER_MINIMUM
Definition: winuser.h:906

Referenced by co_IntSetCaretPos(), co_UserShowCaret(), IntFlashWindowEx(), IntTrackMouseEvent(), IntTrackMouseMove(), NtUserCreateCaret(), NtUserSetSystemTimer(), NtUserSetTimer(), StartTheTimers(), and SystemTimerSet().

◆ NtUserKillTimer()

BOOL APIENTRY NtUserKillTimer ( HWND  hWnd,
UINT_PTR  uIDEvent 
)

Definition at line 655 of file timer.c.

660{
661 PWND Window = NULL;
662 BOOL ret;
663
664 TRACE("Enter NtUserKillTimer\n");
667
668 ret = IntKillTimer(Window, uIDEvent, FALSE);
669
670 UserLeave();
671
672 TRACE("Leave NtUserKillTimer, ret=%i\n", ret);
673 return ret;
674}
HWND hWnd
Definition: settings.c:17
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:251
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:242
Definition: ntuser.h:694
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:122
int ret
BOOL FASTCALL IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
Definition: timer.c:573

Referenced by KillTimer().

◆ NtUserSetSystemTimer()

UINT_PTR APIENTRY NtUserSetSystemTimer ( HWND  hWnd,
UINT_PTR  nIDEvent,
UINT  uElapse,
TIMERPROC  lpTimerFunc 
)

Definition at line 679 of file timer.c.

685{
687
689 TRACE("Enter NtUserSetSystemTimer\n");
690
691 ret = IntSetTimer(UserGetWindowObject(hWnd), nIDEvent, uElapse, NULL, TMRF_SYSTEM);
692
693 UserLeave();
694
695 TRACE("Leave NtUserSetSystemTimer, ret=%u\n", ret);
696 return ret;
697}
UINT_PTR FASTCALL IntSetTimer(PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
Definition: timer.c:177

Referenced by SetSystemTimer().

◆ NtUserSetTimer()

UINT_PTR APIENTRY NtUserSetTimer ( HWND  hWnd,
UINT_PTR  nIDEvent,
UINT  uElapse,
TIMERPROC  lpTimerFunc 
)

Definition at line 629 of file timer.c.

636{
637 PWND Window = NULL;
639
640 TRACE("Enter NtUserSetTimer\n");
643
644 ret = IntSetTimer(Window, nIDEvent, uElapse, lpTimerFunc, TMRF_TIFROMWND);
645
646 UserLeave();
647 TRACE("Leave NtUserSetTimer, ret=%u\n", ret);
648
649 return ret;
650}

Referenced by SetTimer().

◆ NtUserValidateTimerCallback()

BOOL APIENTRY NtUserValidateTimerCallback ( LPARAM  lParam)

Definition at line 701 of file timer.c.

703{
704 BOOL Ret = FALSE;
705
707
709
710 UserLeave();
711 return Ret;
712}
LPARAM lParam
Definition: combotst.c:139
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:235
BOOL FASTCALL ValidateTimerCallback(PTHREADINFO pti, LPARAM lParam)
Definition: timer.c:150

Referenced by DispatchMessageA(), and DispatchMessageW().

◆ PostTimerMessages()

BOOL FASTCALL PostTimerMessages ( PWND  Window)

Definition at line 395 of file timer.c.

396{
397 PLIST_ENTRY pLE;
398 MSG Msg;
399 PTHREADINFO pti;
400 BOOL Hit = FALSE;
401 PTIMER pTmr;
402
404
406 pLE = TimersListHead.Flink;
407 while(pLE != &TimersListHead)
408 {
409 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
410 if ( (pTmr->flags & TMRF_READY) &&
411 (pTmr->pti == pti) &&
412 ((pTmr->pWnd == Window) || (Window == NULL)) )
413 {
414 Msg.hwnd = (pTmr->pWnd ? UserHMGetHandle(pTmr->pWnd) : NULL);
415 Msg.message = (pTmr->flags & TMRF_SYSTEM) ? WM_SYSTIMER : WM_TIMER;
416 Msg.wParam = (WPARAM) pTmr->nID;
417 Msg.lParam = (LPARAM) pTmr->pfn;
418 Msg.time = EngGetTickCount32();
419 // Fix all wine win:test_GetMessagePos WM_TIMER tests. See CORE-10867.
420 Msg.pt = gpsi->ptCursor;
421
423 pTmr->flags &= ~TMRF_READY;
425 Hit = TRUE;
426 // Now move this entry to the end of the list so it will not be
427 // called again in the next msg loop.
428 if (pLE != &TimersListHead)
429 {
432 }
433 break;
434 }
435
436 pLE = pLE->Flink;
437 }
438
439 TimerLeave();
440
441 return Hit;
442}
struct @1641 Msg[]
#define WM_SYSTIMER
Definition: comctl32.h:119
PSERVERINFO gpsi
Definition: imm.c:18
#define EngGetTickCount32()
Definition: eng.h:43
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
VOID FASTCALL ClearMsgBitsMask(PTHREADINFO pti, UINT MessageBits)
Definition: msgqueue.c:445
VOID FASTCALL MsqPostMessage(PTHREADINFO pti, MSG *Msg, BOOLEAN HardwareMessage, DWORD MessageBits, DWORD dwQEvent, LONG_PTR ExtraInfo)
Definition: msgqueue.c:1337
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define TMRF_READY
Definition: timer.h:19
UINT_PTR WPARAM
Definition: windef.h:207
#define QS_TIMER
Definition: winuser.h:878
#define QS_ALLPOSTMESSAGE
Definition: winuser.h:882
#define WM_TIMER
Definition: winuser.h:1742
#define QS_POSTMESSAGE
Definition: winuser.h:877

Referenced by co_IntPeekMessage().

◆ ProcessTimers()

VOID FASTCALL ProcessTimers ( VOID  )

Definition at line 446 of file timer.c.

447{
449 LONG Time;
450 PLIST_ENTRY pLE;
451 PTIMER pTmr;
452 LONG TimerCount = 0;
453
455 pLE = TimersListHead.Flink;
457
458 DueTime.QuadPart = (LONGLONG)(-97656); // 1024hz .9765625 ms set to 10.0 ms
459
460 while(pLE != &TimersListHead)
461 {
462 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
463 TimerCount++;
464 if (pTmr->flags & TMRF_WAITING)
465 {
466 pLE = pTmr->ptmrList.Flink;
467 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
468 continue;
469 }
470
471 if (pTmr->flags & TMRF_INIT)
472 {
473 pTmr->flags &= ~TMRF_INIT; // Skip this run.
474 }
475 else
476 {
477 if (pTmr->cmsCountdown < 0)
478 {
479 ASSERT(pTmr->pti);
480 if ((!(pTmr->flags & TMRF_READY)) && (!(pTmr->pti->TIF_flags & TIF_INCLEANUP)))
481 {
482 if (pTmr->flags & TMRF_ONESHOT)
483 pTmr->flags |= TMRF_WAITING;
484
485 if (pTmr->flags & TMRF_RIT)
486 {
487 // Hard coded call here, inside raw input thread.
488 pTmr->pfn(NULL, WM_SYSTIMER, pTmr->nID, (LPARAM)pTmr);
489 }
490 else
491 {
492 pTmr->flags |= TMRF_READY; // Set timer ready to be ran.
493 // Set thread message queue for this timer.
494 if (pTmr->pti)
495 { // Wakeup thread
496 pTmr->pti->cTimersReady++;
497 ASSERT(pTmr->pti->pEventQueueServer != NULL);
498 MsqWakeQueue(pTmr->pti, QS_TIMER, TRUE);
499 }
500 }
501 }
502 pTmr->cmsCountdown = pTmr->cmsRate;
503 }
504 else
505 pTmr->cmsCountdown -= Time - TimeLast;
506 }
507
508 pLE = pLE->Flink;
509 }
510
511 // Restart the timer thread!
514
515 TimeLast = Time;
516
517 TimerLeave();
518 TRACE("TimerCount = %d\n", TimerCount);
519}
#define TIF_INCLEANUP
Definition: ntuser.h:263
static PLARGE_INTEGER Time
Definition: time.c:105
VOID FASTCALL MsqWakeQueue(PTHREADINFO pti, DWORD MessageBits, BOOL KeyEvent)
Definition: msgqueue.c:412
long LONG
Definition: pedump.c:60
PKEVENT pEventQueueServer
Definition: win32.h:125
UINT cTimersReady
Definition: win32.h:110
FLONG TIF_flags
Definition: win32.h:95
static LONG TimeLast
Definition: timer.c:17
#define TMRF_WAITING
Definition: timer.h:24
#define TMRF_ONESHOT
Definition: timer.h:23

Referenced by RawInputThreadMain().

◆ RemoveTimer()

static BOOL FASTCALL RemoveTimer ( PTIMER  pTmr)
static

Definition at line 70 of file timer.c.

71{
72 BOOL Ret = FALSE;
73 if (pTmr)
74 {
75 /* Set the flag, it will be removed when ready */
77 if ((pTmr->pWnd == NULL) && (!(pTmr->flags & TMRF_SYSTEM))) // System timers are reusable.
78 {
79 UINT_PTR IDEvent;
80
81 IDEvent = NUM_WINDOW_LESS_TIMERS - pTmr->nID;
85 }
88 }
89 if (!Ret) ERR("Warning: Unable to delete timer\n");
90
91 return Ret;
92}
VOID NTAPI RtlClearBit(_In_ PRTL_BITMAP BitMapHeader, _In_ BITMAP_INDEX BitNumber)
Definition: bitmap.c:294
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:717

Referenced by DestroyTimersForThread(), DestroyTimersForWindow(), and IntKillTimer().

◆ StartTheTimers()

VOID FASTCALL StartTheTimers ( VOID  )

Definition at line 368 of file timer.c.

369{
370 // Need to start gdi syncro timers then start timer with Hang App proc
371 // that calles Idle process so the screen savers will know to run......
373// Test Timers
374// IntSetTimer(NULL, 0, 1000, SystemTimerProc, TMRF_RIT);
375}
VOID CALLBACK HungAppSysTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Definition: msgqueue.c:2187

Referenced by RawInputThreadMain().

◆ SystemTimerProc()

VOID CALLBACK SystemTimerProc ( HWND  hwnd,
UINT  uMsg,
UINT_PTR  idEvent,
DWORD  dwTime 
)

Definition at line 280 of file timer.c.

284{
285 PDESKTOP pDesk;
286 PWND pWnd = NULL;
287
288 if (hwnd)
289 {
291 if (!pWnd)
292 {
293 ERR("System Timer Proc has invalid window handle! %p Id: %u\n", hwnd, idEvent);
294 return;
295 }
296 }
297 else
298 {
299 TRACE( "Windowless Timer Running!\n" );
300 return;
301 }
302
303 switch (idEvent)
304 {
305/*
306 Used in NtUserTrackMouseEvent.
307 */
309 {
310 POINT Point;
311 UINT Msg;
313
314 pDesk = pWnd->head.rpdesk;
315 if ( pDesk->dwDTFlags & DF_TME_HOVER &&
316 pWnd == pDesk->spwndTrack )
317 {
318 Point = gpsi->ptCursor;
319 if ( RECTL_bPointInRect(&pDesk->rcMouseHover, Point.x, Point.y) )
320 {
321 if (pDesk->htEx == HTCLIENT) // In a client area.
322 {
323 wParam = MsqGetDownKeyState(pWnd->head.pti->MessageQueue);
325
326 if (pWnd->ExStyle & WS_EX_LAYOUTRTL)
327 {
328 Point.x = pWnd->rcClient.right - Point.x - 1;
329 }
330 else
331 Point.x -= pWnd->rcClient.left;
332 Point.y -= pWnd->rcClient.top;
333 }
334 else
335 {
336 wParam = pDesk->htEx; // Need to support all HTXYZ hits.
338 }
339 TRACE("Generating WM_NCMOUSEHOVER\n");
341 pDesk->dwDTFlags &= ~DF_TME_HOVER;
342 break; // Kill this timer.
343 }
344 }
345 }
346 return; // Not this window so just return.
347
349 {
350 FLASHWINFO fwi =
351 {sizeof(FLASHWINFO),
352 UserHMGetHandle(pWnd),
353 FLASHW_SYSTIMER,0,0};
354
355 IntFlashWindowEx(pWnd, &fwi);
356 }
357 return;
358
359 default:
360 ERR("System Timer Proc invalid id %u!\n", idEvent);
361 break;
362 }
363 IntKillTimer(pWnd, idEvent, TRUE);
364}
WPARAM wParam
Definition: combotst.c:138
WPARAM FASTCALL MsqGetDownKeyState(PUSER_MESSAGE_QUEUE MessageQueue)
Definition: msgqueue.c:338
#define FLASHW_SYSTIMER
Definition: painting.h:4
#define WM_MOUSEHOVER
Definition: commctrl.h:4974
PWND spwndTrack
Definition: desktop.h:31
DWORD htEx
Definition: desktop.h:32
RECT rcMouseHover
Definition: desktop.h:33
DWORD dwDTFlags
Definition: desktop.h:12
struct _DESKTOP * rpdesk
Definition: ntuser.h:194
DWORD ExStyle
Definition: ntuser.h:704
THRDESKHEAD head
Definition: ntuser.h:695
RECT rcClient
Definition: ntuser.h:717
LONG right
Definition: windef.h:308
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
BOOL FASTCALL IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
Definition: painting.c:1310
FORCEINLINE BOOL RECTL_bPointInRect(_In_ const RECTL *prcl, _In_ INT x, _In_ INT y)
Definition: rect.h:52
#define DF_TME_HOVER
Definition: desktop.h:47
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1345
#define ID_EVENT_SYSTIMER_MOUSEHOVER
Definition: timer.h:27
#define ID_EVENT_SYSTIMER_FLASHWIN
Definition: timer.h:28
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
#define MAKELPARAM(l, h)
Definition: winuser.h:4008
#define HTCLIENT
Definition: winuser.h:2475
#define WM_NCMOUSEHOVER
Definition: winuser.h:1841

Referenced by IntFlashWindowEx(), IntTrackMouseEvent(), and IntTrackMouseMove().

◆ SystemTimerSet()

UINT_PTR FASTCALL SystemTimerSet ( PWND  Window,
UINT_PTR  nIDEvent,
UINT  uElapse,
TIMERPROC  lpTimerFunc 
)

Definition at line 379 of file timer.c.

383{
384 if (Window && Window->head.pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
385 {
387 TRACE("SysemTimerSet: Access Denied!\n");
388 return 0;
389 }
390 return IntSetTimer( Window, nIDEvent, uElapse, lpTimerFunc, TMRF_SYSTEM);
391}
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
#define PsGetCurrentProcess
Definition: psfuncs.h:17

◆ ValidateTimerCallback()

BOOL FASTCALL ValidateTimerCallback ( PTHREADINFO  pti,
LPARAM  lParam 
)

Definition at line 150 of file timer.c.

152{
153 PLIST_ENTRY pLE;
154 BOOL Ret = FALSE;
155 PTIMER pTmr;
156
158 pLE = TimersListHead.Flink;
159 while (pLE != &TimersListHead)
160 {
161 pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList);
162 if ( (lParam == (LPARAM)pTmr->pfn) &&
163 !(pTmr->flags & (TMRF_SYSTEM|TMRF_RIT)) &&
164 (pTmr->pti->ppi == pti->ppi) )
165 {
166 Ret = TRUE;
167 break;
168 }
169 pLE = pLE->Flink;
170 }
171 TimerLeave();
172
173 return Ret;
174}
PPROCESSINFO ppi
Definition: win32.h:88

Referenced by IntDispatchMessage(), and NtUserValidateTimerCallback().

Variable Documentation

◆ HintIndex

ULONG HintIndex = 1
static

Definition at line 25 of file timer.c.

Referenced by IntSetTimer().

◆ Mutex

Definition at line 22 of file timer.c.

◆ TimeLast

LONG TimeLast = 0
static

Definition at line 17 of file timer.c.

Referenced by ProcessTimers().

◆ TimerLock

ERESOURCE TimerLock

Definition at line 27 of file timer.c.

Referenced by InitTimerImpl().

◆ TimersListHead

◆ WindowLessTimersBitMap

RTL_BITMAP WindowLessTimersBitMap
static

Definition at line 23 of file timer.c.

Referenced by InitTimerImpl(), IntSetTimer(), and RemoveTimer().

◆ WindowLessTimersBitMapBuffer

PVOID WindowLessTimersBitMapBuffer
static

Definition at line 24 of file timer.c.

Referenced by InitTimerImpl().