From 43b181309e04a3a0764fa12f128700a5b58093ee Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 2 Apr 2024 21:49:52 +0300 Subject: [PATCH] [NTOS:KE] Fix calculation of timer expiration Both due-times and interrupt time are unsigned, but were treated as signed in KiInsertTimerTable, which led to very long (e.g. INFINITE) waits being interpreted as having a negative due-time and being completed instantly. Mostly fixes kernel32_apitest QueueUserAPC --- ntoskrnl/ke/timerobj.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ntoskrnl/ke/timerobj.c b/ntoskrnl/ke/timerobj.c index 35892c8875c..1c19d03b46e 100644 --- a/ntoskrnl/ke/timerobj.c +++ b/ntoskrnl/ke/timerobj.c @@ -63,8 +63,8 @@ FASTCALL KiInsertTimerTable(IN PKTIMER Timer, IN ULONG Hand) { - LARGE_INTEGER InterruptTime; - LONGLONG DueTime = Timer->DueTime.QuadPart; + ULONGLONG InterruptTime; + ULONGLONG DueTime = Timer->DueTime.QuadPart; BOOLEAN Expired = FALSE; PLIST_ENTRY ListHead, NextEntry; PKTIMER CurrentTimer; @@ -101,8 +101,8 @@ KiInsertTimerTable(IN PKTIMER Timer, KiTimerTableListHead[Hand].Time.QuadPart = DueTime; /* Make sure it hasn't expired already */ - InterruptTime.QuadPart = KeQueryInterruptTime(); - if (DueTime <= InterruptTime.QuadPart) Expired = TRUE; + InterruptTime = KeQueryInterruptTime(); + if (DueTime <= InterruptTime) Expired = TRUE; } /* Return expired state */