ReactOS  0.4.14-dev-49-gfb4591c
timer.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS kernel
4  * PURPOSE: Window timers messages
5  * FILE: win32ss/user/ntuser/timer.c
6  * PROGRAMER: Gunnar
7  * Thomas Weidenmueller (w3seek@users.sourceforge.net)
8  * Michael Martin (michael.martin@reactos.org)
9  */
10 
11 #include <win32k.h>
12 DBG_DEFAULT_CHANNEL(UserTimer);
13 
14 /* GLOBALS *******************************************************************/
15 
17 static LONG TimeLast = 0;
18 
19 /* Windows 2000 has room for 32768 window-less timers */
20 #define NUM_WINDOW_LESS_TIMERS 32768
21 
25 static ULONG HintIndex = 1;
26 
28 
29 #define IntLockWindowlessTimerBitmap() \
30  ExEnterCriticalRegionAndAcquireFastMutexUnsafe(Mutex)
31 
32 #define IntUnlockWindowlessTimerBitmap() \
33  ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(Mutex)
34 
35 #define TimerEnterExclusive() \
36 { \
37  KeEnterCriticalRegion(); \
38  ExAcquireResourceExclusiveLite(&TimerLock, TRUE); \
39 }
40 
41 #define TimerLeave() \
42 { \
43  ExReleaseResourceLite(&TimerLock); \
44  KeLeaveCriticalRegion(); \
45 }
46 
47 
48 /* FUNCTIONS *****************************************************************/
49 static
50 PTIMER
53 {
54  HANDLE Handle;
55  PTIMER Ret = NULL;
56 
58  if (Ret)
59  {
60  Ret->head.h = Handle;
62  }
63 
64  return Ret;
65 }
66 
67 static
68 BOOL
71 {
72  BOOL Ret = FALSE;
73  if (pTmr)
74  {
75  /* Set the flag, it will be removed when ready */
76  RemoveEntryList(&pTmr->ptmrList);
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 }
93 
94 PTIMER
97  UINT_PTR nID,
98  UINT flags)
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 }
123 
124 PTIMER
125 FASTCALL
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 }
147 
148 BOOL
149 FASTCALL
151  LPARAM lParam)
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 }
175 
178  UINT_PTR IDEvent,
179  UINT Elapse,
180  TIMERPROC TimerFunc,
181  INT Type)
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 }
274 
275 //
276 // Process win32k system timers.
277 //
278 VOID
279 CALLBACK
281  UINT uMsg,
282  UINT_PTR idEvent,
283  DWORD dwTime)
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 }
365 
366 VOID
367 FASTCALL
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 }
376 
377 UINT_PTR
378 FASTCALL
380  UINT_PTR nIDEvent,
381  UINT uElapse,
382  TIMERPROC lpTimerFunc)
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 }
392 
393 BOOL
394 FASTCALL
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 }
443 
444 VOID
445 FASTCALL
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 }
520 
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 }
547 
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 }
571 
573 IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
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 }
590 
591 INIT_FUNCTION
592 NTSTATUS
593 NTAPI
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 }
626 
627 UINT_PTR
628 APIENTRY
630 (
631  HWND hWnd,
632  UINT_PTR nIDEvent,
633  UINT uElapse,
634  TIMERPROC lpTimerFunc
635 )
636 {
637  PWND Window = NULL;
639 
640  TRACE("Enter NtUserSetTimer\n");
643  UserLeave();
644 
645  RETURN(IntSetTimer(Window, nIDEvent, uElapse, lpTimerFunc, TMRF_TIFROMWND));
646 
647 CLEANUP:
648  TRACE("Leave NtUserSetTimer, ret=%u\n", _ret_);
649 
650  END_CLEANUP;
651 }
652 
653 
654 BOOL
655 APIENTRY
657 (
658  HWND hWnd,
659  UINT_PTR uIDEvent
660 )
661 {
662  PWND Window = NULL;
664 
665  TRACE("Enter NtUserKillTimer\n");
668  UserLeave();
669 
670  RETURN(IntKillTimer(Window, uIDEvent, FALSE));
671 
672 CLEANUP:
673  TRACE("Leave NtUserKillTimer, ret=%i\n", _ret_);
674  END_CLEANUP;
675 }
676 
677 
678 UINT_PTR
679 APIENTRY
681  HWND hWnd,
682  UINT_PTR nIDEvent,
683  UINT uElapse,
684  TIMERPROC lpTimerFunc
685 )
686 {
688 
689  TRACE("Enter NtUserSetSystemTimer\n");
690 
691  RETURN(IntSetTimer(UserGetWindowObject(hWnd), nIDEvent, uElapse, NULL, TMRF_SYSTEM));
692 
693 CLEANUP:
694  TRACE("Leave NtUserSetSystemTimer, ret=%u\n", _ret_);
695  END_CLEANUP;
696 }
697 
698 BOOL
699 APIENTRY
701  LPARAM lParam)
702 {
703  BOOL Ret = FALSE;
704 
705  UserEnterShared();
706 
708 
709  UserLeave();
710  return Ret;
711 }
712 
713 /* EOF */
UINT_PTR FASTCALL IntSetTimer(PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
Definition: timer.c:177
BOOL FASTCALL IntFlashWindowEx(PWND pWnd, PFLASHWINFO pfwi)
Definition: painting.c:1292
UINT_PTR APIENTRY NtUserSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
Definition: timer.c:630
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
PWND pWnd
Definition: timer.h:8
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:241
UINT_PTR APIENTRY NtUserSetSystemTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
Definition: timer.c:680
static ULONG HintIndex
Definition: timer.c:25
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1181
VOID FASTCALL MsqWakeQueue(PTHREADINFO pti, DWORD MessageBits, BOOL KeyEvent)
Definition: msgqueue.c:412
DWORD ExStyle
Definition: ntuser.h:668
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:683
DWORD htEx
Definition: desktop.h:32
#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
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define CLEANUP
Definition: ntuser.h:5
#define TMRF_WAITING
Definition: timer.h:24
struct _DESKTOP * rpdesk
Definition: ntuser.h:189
PWND spwndTrack
Definition: desktop.h:31
#define ID_EVENT_SYSTIMER_MOUSEHOVER
Definition: timer.h:27
Type
Definition: Type.h:6
PKTIMER MasterTimer
Definition: input.c:16
#define USER_TIMER_MINIMUM
Definition: winuser.h:896
#define WM_SYSTIMER
Definition: comctl32.h:111
WPARAM FASTCALL MsqGetDownKeyState(PUSER_MESSAGE_QUEUE MessageQueue)
Definition: msgqueue.c:338
#define QS_ALLPOSTMESSAGE
Definition: winuser.h:876
_In_ LARGE_INTEGER DueTime
Definition: kefuncs.h:524
VOID FASTCALL StartTheTimers(VOID)
Definition: timer.c:368
struct _LIST_ENTRY * Blink
Definition: typedefs.h:120
#define EngGetTickCount32()
Definition: eng.h:43
#define WM_MOUSEHOVER
Definition: commctrl.h:4945
INT cmsCountdown
Definition: timer.h:10
#define IntUnlockWindowlessTimerBitmap()
Definition: timer.c:32
HANDLE h
Definition: ntuser.h:176
FLONG TIF_flags
Definition: win32.h:94
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define MAKELPARAM(l, h)
Definition: winuser.h:3947
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
BOOL FASTCALL IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
Definition: timer.c:573
LONG NTSTATUS
Definition: precomp.h:26
#define CALLBACK
Definition: compat.h:27
HWND hWnd
Definition: settings.c:17
#define FLASHW_SYSTIMER
Definition: painting.h:4
LONG top
Definition: windef.h:292
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
BOOL FASTCALL DestroyTimersForThread(PTHREADINFO pti)
Definition: timer.c:549
#define QS_TIMER
Definition: winuser.h:893
#define TMRF_RIT
Definition: timer.h:21
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
UINT_PTR WPARAM
Definition: windef.h:207
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:291
UINT_PTR FASTCALL SystemTimerSet(PWND Window, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
Definition: timer.c:379
#define InsertTailList(ListHead, Entry)
LONG right
Definition: windef.h:293
#define FASTCALL
Definition: nt_native.h:50
HEAD head
Definition: timer.h:5
PSERVERINFO gpsi
Definition: main.c:27
int32_t INT
Definition: typedefs.h:56
WPARAM wParam
Definition: combotst.c:138
#define ERROR_NO_SYSTEM_RESOURCES
Definition: winerror.h:931
PTIMER FASTCALL FindTimer(PWND Window, UINT_PTR nID, UINT flags)
Definition: timer.c:96
Definition: Mutex.h:15
RECT rcMouseHover
Definition: desktop.h:33
VOID(CALLBACK * TIMERPROC)(HWND, UINT, UINT_PTR, DWORD)
Definition: winuser.h:2871
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
Definition: object.c:535
ERESOURCE TimerLock
Definition: timer.c:27
UINT cTimersReady
Definition: win32.h:109
PPROCESSINFO ppi
Definition: win32.h:87
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
#define NUM_WINDOW_LESS_TIMERS
Definition: timer.c:20
BOOL FASTCALL DestroyTimersForWindow(PTHREADINFO pti, PWND Window)
Definition: timer.c:522
Definition: window.c:29
struct @1576 Msg[]
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
UINT_PTR nID
Definition: timer.h:9
DWORD dwDTFlags
Definition: desktop.h:12
BOOL FASTCALL ValidateTimerCallback(PTHREADINFO pti, LPARAM lParam)
Definition: timer.c:150
static LIST_ENTRY TimersListHead
Definition: timer.c:16
#define PsGetCurrentProcess
Definition: psfuncs.h:17
Definition: timer.h:3
THRDESKHEAD head
Definition: ntuser.h:659
#define TimerLeave()
Definition: timer.c:41
#define TAG_TIMERBMP
Definition: tags.h:10
VOID CALLBACK SystemTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Definition: timer.c:280
smooth NULL
Definition: ftsmooth.c:416
LPARAM lParam
Definition: winuser.h:3091
LONG_PTR LPARAM
Definition: windef.h:208
#define TMRF_INIT
Definition: timer.h:22
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
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
static PVOID WindowLessTimersBitMapBuffer
Definition: timer.c:24
PTHREADINFO ptiRawInput
Definition: input.c:15
DWORD dwTime
Definition: solitaire.cpp:25
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
FAST_MUTEX
Definition: extypes.h:17
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
int64_t LONGLONG
Definition: typedefs.h:66
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
_In_ HANDLE Handle
Definition: extypes.h:390
PTIMER FASTCALL FindSystemTimer(PMSG pMsg)
Definition: timer.c:126
#define TRACE(s)
Definition: solgame.cpp:4
#define TMRF_TIFROMWND
Definition: timer.h:25
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
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
PKEVENT pEventQueueServer
Definition: win32.h:124
VOID NTAPI RtlClearBit(_In_ PRTL_BITMAP BitMapHeader, _In_ BITMAP_INDEX BitNumber)
Definition: bitmap.c:294
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DECLARE_RETURN(type)
Definition: ntuser.h:3
VOID FASTCALL MsqPostMessage(PTHREADINFO pti, MSG *Msg, BOOLEAN HardwareMessage, DWORD MessageBits, DWORD dwQEvent, LONG_PTR ExtraInfo)
Definition: msgqueue.c:1338
DBG_DEFAULT_CHANNEL(UserTimer)
PTHREADINFO pti
Definition: timer.h:7
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
int Window
Definition: x11stubs.h:26
BOOL FASTCALL PostTimerMessages(PWND Window)
Definition: timer.c:395
GLbitfield flags
Definition: glext.h:7161
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#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 USER_TIMER_MAXIMUM
Definition: winuser.h:895
#define TAG_INTERNAL_SYNC
Definition: tags.h:18
INT cmsRate
Definition: timer.h:11
Definition: typedefs.h:117
NTSYSAPI ULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG)
#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
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
FLONG flags
Definition: timer.h:12
* PFAST_MUTEX
Definition: extypes.h:17
BOOL APIENTRY NtUserValidateTimerCallback(LPARAM lParam)
Definition: timer.c:700
VOID FASTCALL ProcessTimers(VOID)
Definition: timer.c:446
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
static PFAST_MUTEX Mutex
Definition: timer.c:22
#define QS_POSTMESSAGE
Definition: winuser.h:888
unsigned int UINT
Definition: ndis.h:50
static BOOL FASTCALL RemoveTimer(PTIMER pTmr)
Definition: timer.c:70
#define TMRF_READY
Definition: timer.h:19
#define IntLockWindowlessTimerBitmap()
Definition: timer.c:29
TIMERPROC pfn
Definition: timer.h:13
LIST_ENTRY ptmrList
Definition: timer.h:6
INIT_FUNCTION NTSTATUS NTAPI InitTimerImpl(VOID)
Definition: timer.c:594
VOID CALLBACK HungAppSysTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Definition: msgqueue.c:2219
ULONG ERESOURCE
Definition: env_spec_w32.h:594
unsigned int ULONG
Definition: retypes.h:1
#define TimerEnterExclusive()
Definition: timer.c:35
#define ALIGN_UP_BY(size, align)
#define HTCLIENT
Definition: winuser.h:2450
return STATUS_SUCCESS
Definition: btrfs.c:2966
BOOL APIENTRY NtUserKillTimer(HWND hWnd, UINT_PTR uIDEvent)
Definition: timer.c:657
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
static PTIMER FASTCALL CreateTimer(VOID)
Definition: timer.c:52
static LONG TimeLast
Definition: timer.c:17
LPARAM lParam
Definition: combotst.c:139
#define TIF_INCLEANUP
Definition: ntuser.h:240
static PLARGE_INTEGER Time
Definition: time.c:105
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define RETURN(rrr)
Definition: decompress.c:40
#define APIENTRY
Definition: api.h:79
#define END_CLEANUP
Definition: ntuser.h:6
LONGLONG QuadPart
Definition: typedefs.h:112
static RTL_BITMAP WindowLessTimersBitMap
Definition: timer.c:23