From 3b7ffd32c4220c6785c5b49741b6b353c8cf1be0 Mon Sep 17 00:00:00 2001 From: ergo720 <45463469+ergo720@users.noreply.github.com> Date: Thu, 10 Jan 2019 19:32:15 +0100 Subject: [PATCH] Handle exceptions raised by the timer DPCs --- src/core/kernel/exports/EmuKrnlKi.cpp | 54 +++++++++++++++++++++------ 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/src/core/kernel/exports/EmuKrnlKi.cpp b/src/core/kernel/exports/EmuKrnlKi.cpp index 4fbde4fea..dea6bb8fc 100644 --- a/src/core/kernel/exports/EmuKrnlKi.cpp +++ b/src/core/kernel/exports/EmuKrnlKi.cpp @@ -594,10 +594,20 @@ VOID NTAPI xboxkrnl::KiTimerExpiration( for (i = 0; DpcCalls; DpcCalls--, i++) { /* Call the DPC */ - DpcEntry[i].Routine(DpcEntry[i].Dpc, - DpcEntry[i].Context, - UlongToPtr(SystemTime.u.LowPart), - UlongToPtr(SystemTime.u.HighPart)); + DBG_PRINTF("%s, calling DPC at 0x%.8X\n", __func__, DpcEntry[i].Routine); + __try { + // Call the Deferred Procedure : + DpcEntry[i].Routine( + DpcEntry[i].Dpc, + DpcEntry[i].Context, + UlongToPtr(SystemTime.u.LowPart), + UlongToPtr(SystemTime.u.HighPart) + ); + } + __except (EmuException(GetExceptionInformation())) + { + EmuLog(LOG_LEVEL::WARNING, "Problem with ExceptionFilter!"); + } } /* Reset accounting */ @@ -634,10 +644,20 @@ VOID NTAPI xboxkrnl::KiTimerExpiration( for (i = 0; DpcCalls; DpcCalls--, i++) { /* Call the DPC */ - DpcEntry[i].Routine(DpcEntry[i].Dpc, - DpcEntry[i].Context, - UlongToPtr(SystemTime.u.LowPart), - UlongToPtr(SystemTime.u.HighPart)); + DBG_PRINTF("%s, calling DPC at 0x%.8X\n", __func__, DpcEntry[i].Routine); + __try { + // Call the Deferred Procedure : + DpcEntry[i].Routine( + DpcEntry[i].Dpc, + DpcEntry[i].Context, + UlongToPtr(SystemTime.u.LowPart), + UlongToPtr(SystemTime.u.HighPart) + ); + } + __except (EmuException(GetExceptionInformation())) + { + EmuLog(LOG_LEVEL::WARNING, "Problem with ExceptionFilter!"); + } } /* Reset accounting */ @@ -671,10 +691,20 @@ VOID NTAPI xboxkrnl::KiTimerExpiration( for (i = 0; DpcCalls; DpcCalls--, i++) { /* Call the DPC */ - DpcEntry[i].Routine(DpcEntry[i].Dpc, - DpcEntry[i].Context, - UlongToPtr(SystemTime.u.LowPart), - UlongToPtr(SystemTime.u.HighPart)); + DBG_PRINTF("%s, calling DPC at 0x%.8X\n", __func__, DpcEntry[i].Routine); + __try { + // Call the Deferred Procedure : + DpcEntry[i].Routine( + DpcEntry[i].Dpc, + DpcEntry[i].Context, + UlongToPtr(SystemTime.u.LowPart), + UlongToPtr(SystemTime.u.HighPart) + ); + } + __except (EmuException(GetExceptionInformation())) + { + EmuLog(LOG_LEVEL::WARNING, "Problem with ExceptionFilter!"); + } } /* Lower IRQL if we need to */