ReactOS  0.4.14-dev-815-ge410a12
timer.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _TIMER
 

Macros

#define TMRF_READY   0x0001
 
#define TMRF_SYSTEM   0x0002
 
#define TMRF_RIT   0x0004
 
#define TMRF_INIT   0x0008
 
#define TMRF_ONESHOT   0x0010
 
#define TMRF_WAITING   0x0020
 
#define TMRF_TIFROMWND   0x0040
 
#define ID_EVENT_SYSTIMER_MOUSEHOVER   ID_TME_TIMER
 
#define ID_EVENT_SYSTIMER_FLASHWIN   (0xFFF8)
 
#define ID_EVENT_SYSTIMER_TRACKWIN   (0xFFF7)
 
#define ID_EVENT_SYSTIMER_ANIMATEDFADE   (0xFFF6)
 
#define ID_EVENT_SYSTIMER_INVALIDATEDCES   (0xFFF5)
 

Typedefs

typedef struct _TIMER TIMER
 
typedef struct _TIMERPTIMER
 

Functions

INIT_FUNCTION NTSTATUS NTAPI InitTimerImpl (VOID)
 
BOOL FASTCALL DestroyTimersForThread (PTHREADINFO pti)
 
BOOL FASTCALL DestroyTimersForWindow (PTHREADINFO pti, PWND Window)
 
BOOL FASTCALL IntKillTimer (PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
 
UINT_PTR FASTCALL IntSetTimer (PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
 
PTIMER FASTCALL FindSystemTimer (PMSG)
 
BOOL FASTCALL ValidateTimerCallback (PTHREADINFO, LPARAM)
 
VOID CALLBACK SystemTimerProc (HWND, UINT, UINT_PTR, DWORD)
 
UINT_PTR FASTCALL SystemTimerSet (PWND, UINT_PTR, UINT, TIMERPROC)
 
BOOL FASTCALL PostTimerMessages (PWND)
 
VOID FASTCALL ProcessTimers (VOID)
 
VOID FASTCALL StartTheTimers (VOID)
 

Variables

PKTIMER MasterTimer
 

Macro Definition Documentation

◆ ID_EVENT_SYSTIMER_ANIMATEDFADE

#define ID_EVENT_SYSTIMER_ANIMATEDFADE   (0xFFF6)

Definition at line 30 of file timer.h.

◆ ID_EVENT_SYSTIMER_FLASHWIN

#define ID_EVENT_SYSTIMER_FLASHWIN   (0xFFF8)

Definition at line 28 of file timer.h.

◆ ID_EVENT_SYSTIMER_INVALIDATEDCES

#define ID_EVENT_SYSTIMER_INVALIDATEDCES   (0xFFF5)

Definition at line 31 of file timer.h.

◆ ID_EVENT_SYSTIMER_MOUSEHOVER

#define ID_EVENT_SYSTIMER_MOUSEHOVER   ID_TME_TIMER

Definition at line 27 of file timer.h.

◆ ID_EVENT_SYSTIMER_TRACKWIN

#define ID_EVENT_SYSTIMER_TRACKWIN   (0xFFF7)

Definition at line 29 of file timer.h.

◆ TMRF_INIT

#define TMRF_INIT   0x0008

Definition at line 22 of file timer.h.

◆ TMRF_ONESHOT

#define TMRF_ONESHOT   0x0010

Definition at line 23 of file timer.h.

◆ TMRF_READY

#define TMRF_READY   0x0001

Definition at line 19 of file timer.h.

◆ TMRF_RIT

#define TMRF_RIT   0x0004

Definition at line 21 of file timer.h.

◆ TMRF_SYSTEM

#define TMRF_SYSTEM   0x0002

Definition at line 20 of file timer.h.

◆ TMRF_TIFROMWND

#define TMRF_TIFROMWND   0x0040

Definition at line 25 of file timer.h.

◆ TMRF_WAITING

#define TMRF_WAITING   0x0020

Definition at line 24 of file timer.h.

Typedef Documentation

◆ PTIMER

typedef struct _TIMER * PTIMER

◆ TIMER

typedef struct _TIMER TIMER

Function Documentation

◆ 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 }
unsigned int BOOL
Definition: ntddk_ex.h:94
static LIST_ENTRY TimersListHead
Definition: timer.c:16
Definition: timer.h:3
#define TimerLeave()
Definition: timer.c:41
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
PTHREADINFO pti
Definition: timer.h:7
Definition: typedefs.h:117
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 }
PWND pWnd
Definition: timer.h:8
Definition: window.c:28
unsigned int BOOL
Definition: ntddk_ex.h:94
static LIST_ENTRY TimersListHead
Definition: timer.c:16
Definition: timer.h:3
#define TimerLeave()
Definition: timer.c:41
smooth NULL
Definition: ftsmooth.c:416
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
PTHREADINFO pti
Definition: timer.h:7
Definition: typedefs.h:117
static BOOL FASTCALL RemoveTimer(PTIMER pTmr)
Definition: timer.c:70
#define TimerEnterExclusive()
Definition: timer.c:35

Referenced by co_UserFreeWindow(), and IntClientShutdown().

◆ FindSystemTimer()

PTIMER FASTCALL FindSystemTimer ( 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 }
static LIST_ENTRY TimersListHead
Definition: timer.c:16
Definition: timer.h:3
#define TimerLeave()
Definition: timer.c:41
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define TMRF_SYSTEM
Definition: timer.h:20
Definition: typedefs.h:117
FLONG flags
Definition: timer.h:12
TIMERPROC pfn
Definition: timer.h:13
#define TimerEnterExclusive()
Definition: timer.c:35

Referenced by IntDispatchMessage().

◆ InitTimerImpl()

INIT_FUNCTION 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 }
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
Definition: Mutex.h:15
ERESOURCE TimerLock
Definition: timer.c:27
#define NUM_WINDOW_LESS_TIMERS
Definition: timer.c:20
static LIST_ENTRY TimersListHead
Definition: timer.c:16
#define TAG_TIMERBMP
Definition: tags.h:10
smooth NULL
Definition: ftsmooth.c:416
static PVOID WindowLessTimersBitMapBuffer
Definition: timer.c:24
FAST_MUTEX
Definition: extypes.h:17
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define TAG_INTERNAL_SYNC
Definition: tags.h:18
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
unsigned int ULONG
Definition: retypes.h:1
#define ALIGN_UP_BY(size, align)
return STATUS_SUCCESS
Definition: btrfs.c:2938
static RTL_BITMAP WindowLessTimersBitMap
Definition: timer.c:23

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 TRUE
Definition: types.h:120
PTIMER FASTCALL FindTimer(PWND Window, UINT_PTR nID, UINT flags)
Definition: timer.c:96
Definition: window.c:28
Definition: timer.h:3
#define TimerLeave()
Definition: timer.c:41
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
#define TMRF_SYSTEM
Definition: timer.h:20
static BOOL FASTCALL RemoveTimer(PTIMER pTmr)
Definition: timer.c:70
#define TimerEnterExclusive()
Definition: timer.c:35

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 
267  ASSERT(MasterTimer != NULL);
268  // Start the timer thread!
269  if (TimersListHead.Flink == TimersListHead.Blink) // There is only one timer
271 
272  return Ret;
273 }
PWND pWnd
Definition: timer.h:8
static ULONG HintIndex
Definition: timer.c:25
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
Type
Definition: Type.h:6
PKTIMER MasterTimer
Definition: input.c:16
#define USER_TIMER_MINIMUM
Definition: winuser.h:896
_In_ LARGE_INTEGER DueTime
Definition: kefuncs.h:524
struct _LIST_ENTRY * Blink
Definition: typedefs.h:120
INT cmsCountdown
Definition: timer.h:10
#define IntUnlockWindowlessTimerBitmap()
Definition: timer.c:32
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define TMRF_RIT
Definition: timer.h:21
#define ERROR_NO_SYSTEM_RESOURCES
Definition: winerror.h:931
PTIMER FASTCALL FindTimer(PWND Window, UINT_PTR nID, UINT flags)
Definition: timer.c:96
#define NUM_WINDOW_LESS_TIMERS
Definition: timer.c:20
Definition: window.c:28
UINT_PTR nID
Definition: timer.h:9
static LIST_ENTRY TimersListHead
Definition: timer.c:16
Definition: timer.h:3
smooth NULL
Definition: ftsmooth.c:416
#define TMRF_INIT
Definition: timer.h:22
PTHREADINFO ptiRawInput
Definition: input.c:15
int64_t LONGLONG
Definition: typedefs.h:66
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define TRACE(s)
Definition: solgame.cpp:4
#define TMRF_TIFROMWND
Definition: timer.h:25
#define TMRF_SYSTEM
Definition: timer.h:20
PTHREADINFO pti
Definition: timer.h:7
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
int Window
Definition: x11stubs.h:26
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define USER_TIMER_MAXIMUM
Definition: winuser.h:895
INT cmsRate
Definition: timer.h:11
NTSYSAPI ULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG)
#define ERR(fmt,...)
Definition: debug.h:109
FLONG flags
Definition: timer.h:12
unsigned int UINT
Definition: ndis.h:50
#define IntLockWindowlessTimerBitmap()
Definition: timer.c:29
TIMERPROC pfn
Definition: timer.h:13
static PTIMER FASTCALL CreateTimer(VOID)
Definition: timer.c:52
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
LONGLONG QuadPart
Definition: typedefs.h:112
static RTL_BITMAP WindowLessTimersBitMap
Definition: timer.c:23

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

◆ PostTimerMessages()

BOOL FASTCALL PostTimerMessages ( PWND  )

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) ? pTmr->pWnd->head.h : 0;
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  {
430  RemoveEntryList(&pTmr->ptmrList);
432  }
433  break;
434  }
435 
436  pLE = pLE->Flink;
437  }
438 
439  TimerLeave();
440 
441  return Hit;
442 }
PWND pWnd
Definition: timer.h:8
#define TRUE
Definition: types.h:120
#define WM_SYSTIMER
Definition: comctl32.h:112
#define QS_ALLPOSTMESSAGE
Definition: winuser.h:876
#define EngGetTickCount32()
Definition: eng.h:43
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define QS_TIMER
Definition: winuser.h:893
UINT_PTR WPARAM
Definition: windef.h:207
#define InsertTailList(ListHead, Entry)
PSERVERINFO gpsi
Definition: main.c:27
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
Definition: window.c:28
unsigned int BOOL
Definition: ntddk_ex.h:94
UINT_PTR nID
Definition: timer.h:9
static LIST_ENTRY TimersListHead
Definition: timer.c:16
Definition: timer.h:3
THRDESKHEAD head
Definition: ntuser.h:659
#define TimerLeave()
Definition: timer.c:41
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
VOID FASTCALL ClearMsgBitsMask(PTHREADINFO pti, UINT MessageBits)
Definition: msgqueue.c:445
#define TMRF_SYSTEM
Definition: timer.h:20
#define WM_TIMER
Definition: winuser.h:1724
VOID FASTCALL MsqPostMessage(PTHREADINFO pti, MSG *Msg, BOOLEAN HardwareMessage, DWORD MessageBits, DWORD dwQEvent, LONG_PTR ExtraInfo)
Definition: msgqueue.c:1338
PTHREADINFO pti
Definition: timer.h:7
Definition: typedefs.h:117
FLONG flags
Definition: timer.h:12
#define QS_POSTMESSAGE
Definition: winuser.h:888
#define TMRF_READY
Definition: timer.h:19
TIMERPROC pfn
Definition: timer.h:13
LIST_ENTRY ptmrList
Definition: timer.h:6
struct @1587 Msg[]
#define TimerEnterExclusive()
Definition: timer.c:35

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!
512  ASSERT(MasterTimer != NULL);
514 
515  TimeLast = Time;
516 
517  TimerLeave();
518  TRACE("TimerCount = %d\n", TimerCount);
519 }
VOID FASTCALL MsqWakeQueue(PTHREADINFO pti, DWORD MessageBits, BOOL KeyEvent)
Definition: msgqueue.c:412
#define TRUE
Definition: types.h:120
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
#define TMRF_WAITING
Definition: timer.h:24
PKTIMER MasterTimer
Definition: input.c:16
#define WM_SYSTIMER
Definition: comctl32.h:112
_In_ LARGE_INTEGER DueTime
Definition: kefuncs.h:524
#define EngGetTickCount32()
Definition: eng.h:43
INT cmsCountdown
Definition: timer.h:10
FLONG TIF_flags
Definition: win32.h:94
#define QS_TIMER
Definition: winuser.h:893
#define TMRF_RIT
Definition: timer.h:21
UINT cTimersReady
Definition: win32.h:109
long LONG
Definition: pedump.c:60
UINT_PTR nID
Definition: timer.h:9
static LIST_ENTRY TimersListHead
Definition: timer.c:16
Definition: timer.h:3
#define TimerLeave()
Definition: timer.c:41
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
#define TMRF_INIT
Definition: timer.h:22
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define TMRF_ONESHOT
Definition: timer.h:23
int64_t LONGLONG
Definition: typedefs.h:66
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define TRACE(s)
Definition: solgame.cpp:4
PKEVENT pEventQueueServer
Definition: win32.h:124
PTHREADINFO pti
Definition: timer.h:7
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
INT cmsRate
Definition: timer.h:11
Definition: typedefs.h:117
FLONG flags
Definition: timer.h:12
#define TMRF_READY
Definition: timer.h:19
TIMERPROC pfn
Definition: timer.h:13
LIST_ENTRY ptmrList
Definition: timer.h:6
#define TimerEnterExclusive()
Definition: timer.c:35
static LONG TimeLast
Definition: timer.c:17
#define TIF_INCLEANUP
Definition: ntuser.h:240
static PLARGE_INTEGER Time
Definition: time.c:105
LONGLONG QuadPart
Definition: typedefs.h:112

Referenced by RawInputThreadMain().

◆ 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 }
UINT_PTR FASTCALL IntSetTimer(PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
Definition: timer.c:177
#define TMRF_RIT
Definition: timer.h:21
smooth NULL
Definition: ftsmooth.c:416
VOID CALLBACK HungAppSysTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Definition: msgqueue.c:2238

Referenced by RawInputThreadMain().

◆ SystemTimerProc()

VOID CALLBACK SystemTimerProc ( HWND  ,
UINT  ,
UINT_PTR  ,
DWORD   
)

Definition at line 280 of file timer.c.

284 {
285  PDESKTOP pDesk;
286  PWND pWnd = NULL;
287 
288  if (hwnd)
289  {
290  pWnd = UserGetWindowObject(hwnd);
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;
312  WPARAM wParam;
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);
324  Msg = WM_MOUSEHOVER;
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 }
BOOL FASTCALL IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
Definition: painting.c:1292
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1184
DWORD ExStyle
Definition: ntuser.h:668
DWORD htEx
Definition: desktop.h:32
#define TRUE
Definition: types.h:120
struct _DESKTOP * rpdesk
Definition: ntuser.h:189
PWND spwndTrack
Definition: desktop.h:31
#define ID_EVENT_SYSTIMER_MOUSEHOVER
Definition: timer.h:27
WPARAM FASTCALL MsqGetDownKeyState(PUSER_MESSAGE_QUEUE MessageQueue)
Definition: msgqueue.c:338
#define WM_MOUSEHOVER
Definition: commctrl.h:4970
#define MAKELPARAM(l, h)
Definition: winuser.h:3983
BOOL FASTCALL IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
Definition: timer.c:573
#define FLASHW_SYSTIMER
Definition: painting.h:4
LONG top
Definition: windef.h:307
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
UINT_PTR WPARAM
Definition: windef.h:207
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
PSERVERINFO gpsi
Definition: main.c:27
WPARAM wParam
Definition: combotst.c:138
RECT rcMouseHover
Definition: desktop.h:33
DWORD dwDTFlags
Definition: desktop.h:12
THRDESKHEAD head
Definition: ntuser.h:659
smooth NULL
Definition: ftsmooth.c:416
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define TRACE(s)
Definition: solgame.cpp:4
#define ID_EVENT_SYSTIMER_FLASHWIN
Definition: timer.h:28
FORCEINLINE BOOL RECTL_bPointInRect(_In_ const RECTL *prcl, _In_ INT x, _In_ INT y)
Definition: rect.h:52
struct Point Point
#define DF_TME_HOVER
Definition: desktop.h:47
#define WM_NCMOUSEHOVER
Definition: winuser.h:1823
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
unsigned int UINT
Definition: ndis.h:50
struct @1587 Msg[]
#define HTCLIENT
Definition: winuser.h:2450

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

◆ SystemTimerSet()

UINT_PTR FASTCALL SystemTimerSet ( PWND  ,
UINT_PTR  ,
UINT  ,
TIMERPROC   
)

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 }
UINT_PTR FASTCALL IntSetTimer(PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
Definition: timer.c:177
Definition: window.c:28
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
#define PsGetCurrentProcess
Definition: psfuncs.h:17
#define TRACE(s)
Definition: solgame.cpp:4
#define TMRF_SYSTEM
Definition: timer.h:20
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

◆ ValidateTimerCallback()

BOOL FASTCALL ValidateTimerCallback ( PTHREADINFO  ,
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 }
#define TRUE
Definition: types.h:120
#define TMRF_RIT
Definition: timer.h:21
PPROCESSINFO ppi
Definition: win32.h:87
unsigned int BOOL
Definition: ntddk_ex.h:94
static LIST_ENTRY TimersListHead
Definition: timer.c:16
Definition: timer.h:3
#define TimerLeave()
Definition: timer.c:41
LONG_PTR LPARAM
Definition: windef.h:208
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define TMRF_SYSTEM
Definition: timer.h:20
PTHREADINFO pti
Definition: timer.h:7
Definition: typedefs.h:117
FLONG flags
Definition: timer.h:12
TIMERPROC pfn
Definition: timer.h:13
#define TimerEnterExclusive()
Definition: timer.c:35
LPARAM lParam
Definition: combotst.c:139

Referenced by IntDispatchMessage(), and NtUserValidateTimerCallback().

Variable Documentation

◆ MasterTimer

PKTIMER MasterTimer

Definition at line 16 of file input.c.

Referenced by InitInputImpl(), IntSetTimer(), ProcessTimers(), and RawInputThreadMain().