diff --git a/src/core/kernel/exports/EmuKrnlKe.cpp b/src/core/kernel/exports/EmuKrnlKe.cpp index 29bcd02e6..5dbb13800 100644 --- a/src/core/kernel/exports/EmuKrnlKe.cpp +++ b/src/core/kernel/exports/EmuKrnlKe.cpp @@ -519,16 +519,26 @@ XBSYSAPI EXPORTNUM(96) xboxkrnl::BOOLEAN NTAPI xboxkrnl::KeCancelTimer IN PKTIMER Timer ) { - LOG_FUNC_ONE_ARG(Timer); - - BOOLEAN Inserted; - - Inserted = Timer->Header.Inserted; - if (Inserted != FALSE) { - // Do some unlinking if already inserted in the linked list - KiRemoveTreeTimer(Timer); - } - + LOG_FUNC_ONE_ARG(Timer); + + KIRQL OldIrql; + BOOLEAN Inserted; + + assert(Timer); + + /* Lock the Database and Raise IRQL */ + KiLockDispatcherDatabase(&OldIrql); + + /* Check if it's inserted, and remove it if it is */ + Inserted = Timer->Header.Inserted; + if (Inserted) { + KxRemoveTreeTimer(Timer); + } + + /* Release Dispatcher Lock */ + KiUnlockDispatcherDatabase(OldIrql); + + /* Return the old state */ RETURN(Inserted); } diff --git a/src/core/kernel/exports/EmuKrnlKi.h b/src/core/kernel/exports/EmuKrnlKi.h index 84de924ce..12cc07013 100644 --- a/src/core/kernel/exports/EmuKrnlKi.h +++ b/src/core/kernel/exports/EmuKrnlKi.h @@ -40,11 +40,7 @@ *(OldIrql) = KeRaiseIrqlToSynchLevel() #define KiUnlockApcQueue(Thread, OldIrql) \ - KfLowerIrql((OldIrql)) - -#define KiRemoveTreeTimer(Timer) \ - (Timer)->Header.Inserted = FALSE; \ - RemoveEntryList(&(Timer)->TimerListEntry) + KfLowerIrql((OldIrql)) namespace xboxkrnl {