From 47144dde757ab832f502db02c43f81f22de49209 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Wed, 29 Oct 2008 16:24:36 +0000 Subject: [PATCH] - KeSetTimerEx: When canceling the insertion of an expired timer, don't forget to exit the dispatcher and return. Fixes crashes exposed by kernel32 Winetest "timer", caused by KiTimerTableListHead suddenly having broken entries. - Also fix a comment -- KiExitDispatcher doesn't release the dispatcher lock, it is done in KxInsertTimer svn path=/trunk/; revision=37068 --- reactos/ntoskrnl/ke/timerobj.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ke/timerobj.c b/reactos/ntoskrnl/ke/timerobj.c index 77f9038976a..5f6aeb94aa0 100644 --- a/reactos/ntoskrnl/ke/timerobj.c +++ b/reactos/ntoskrnl/ke/timerobj.c @@ -398,6 +398,10 @@ KeSetTimerEx(IN OUT PKTIMER Timer, /* Check if we need to do an interrupt */ if (RequestInterrupt) HalRequestSoftwareInterrupt(DISPATCH_LEVEL); + + /* Exit the dispatcher and return the old state */ + KiExitDispatcher(OldIrql); + return Inserted; } /* Set the time as Absolute */ @@ -419,7 +423,7 @@ KeSetTimerEx(IN OUT PKTIMER Timer, Timer->Header.SignalState = FALSE; KxInsertTimer(Timer, Hand); - /* Release Dispatcher Lock */ + /* Exit the dispatcher */ KiExitDispatcher(OldIrql); /* Return old state */