https://git.reactos.org/?p=reactos.git;a=commitdiff;h=fd327db20ffd249bcdb39…
commit fd327db20ffd249bcdb3900a9806e379b5998f16
Author: Tomáš Veselý <turican0(a)gmail.com>
AuthorDate: Tue Aug 27 08:14:51 2024 +0200
Commit: GitHub <noreply(a)github.com>
CommitDate: Tue Aug 27 01:14:51 2024 -0500
[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 <joachim.henze(a)reactos.org>
---
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();