From d1c98836044252a95206633c4241f532fa81e388 Mon Sep 17 00:00:00 2001 From: ergo720 <45463469+ergo720@users.noreply.github.com> Date: Fri, 10 Mar 2023 17:20:07 +0100 Subject: [PATCH] Make sure to hold the DPC lock until the DPC list has been emptied This fixes a crash in Lord of the rings: The fellowship of the ring --- src/core/kernel/exports/EmuKrnlKe.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/kernel/exports/EmuKrnlKe.cpp b/src/core/kernel/exports/EmuKrnlKe.cpp index 6d4355e14..41a36ca14 100644 --- a/src/core/kernel/exports/EmuKrnlKe.cpp +++ b/src/core/kernel/exports/EmuKrnlKe.cpp @@ -462,7 +462,7 @@ void ExecuteDpcQueue() // Set DpcRoutineActive to support KeIsExecutingDpc: g_DpcData.IsDpcActive.test_and_set(); KeGetCurrentPrcb()->DpcRoutineActive = TRUE; // Experimental - LeaveCriticalSection(&(g_DpcData.Lock)); + EmuLog(LOG_LEVEL::DEBUG, "Global DpcQueue, calling DPC object 0x%.8X at 0x%.8X", pkdpc, pkdpc->DeferredRoutine); // Call the Deferred Procedure : @@ -472,7 +472,6 @@ void ExecuteDpcQueue() pkdpc->SystemArgument1, pkdpc->SystemArgument2); - EnterCriticalSection(&(g_DpcData.Lock)); KeGetCurrentPrcb()->DpcRoutineActive = FALSE; // Experimental g_DpcData.IsDpcActive.clear(); }