From fd327db20ffd249bcdb3900a9806e379b5998f16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Vesel=C3=BD?= Date: Tue, 27 Aug 2024 08:14:51 +0200 Subject: [PATCH] [NTUSER] IntSetTimer: Update HintIndex on each call (#7087) * fix CORE-9141 - adding a change to IDEvent after each pass If the first index is 0 the first returned ID will be 0x8000, which is fine. Co-authored-by: Joachim Henze --- win32ss/user/ntuser/timer.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/win32ss/user/ntuser/timer.c b/win32ss/user/ntuser/timer.c index 4a9fd3c44ae..6d4a4e983be 100644 --- a/win32ss/user/ntuser/timer.c +++ b/win32ss/user/ntuser/timer.c @@ -19,10 +19,12 @@ static LONG TimeLast = 0; /* Windows 2000 has room for 32768 window-less timers */ #define NUM_WINDOW_LESS_TIMERS 32768 +#define HINTINDEX_BEGIN_VALUE 0 + static PFAST_MUTEX Mutex; static RTL_BITMAP WindowLessTimersBitMap; static PVOID WindowLessTimersBitMapBuffer; -static ULONG HintIndex = 1; +static ULONG HintIndex = HINTINDEX_BEGIN_VALUE; ERESOURCE TimerLock; @@ -219,8 +221,12 @@ IntSetTimer( PWND Window, { IntLockWindowlessTimerBitmap(); - IDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex); - + IDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex++); + if (IDEvent == (UINT_PTR)-1) + { + HintIndex = HINTINDEX_BEGIN_VALUE; + IDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex++); + } if (IDEvent == (UINT_PTR) -1) { IntUnlockWindowlessTimerBitmap();