https://git.reactos.org/?p=reactos.git;a=commitdiff;h=fd327db20ffd249bcdb3900a9806e379b5998f16

commit fd327db20ffd249bcdb3900a9806e379b5998f16
Author:     Tomáš Veselý <turic...@gmail.com>
AuthorDate: Tue Aug 27 08:14:51 2024 +0200
Commit:     GitHub <nore...@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.he...@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();

Reply via email to