From 12f896c57ecdd9ab9450b1484049b7b55a967d3e Mon Sep 17 00:00:00 2001 From: micronn Date: Sat, 5 Jul 2025 21:17:19 +0200 Subject: [PATCH] Fix memory breakpoints when an access spans an extra page --- TitanEngine/TitanEngine.Debugger.DebugLoop.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp index 8ae71e2..0d2b39b 100644 --- a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp +++ b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp @@ -62,6 +62,7 @@ __declspec(dllexport) void TITCALL DebugLoop() SIZE_T ResetBPXSize = 0; ULONG_PTR ResetBPXAddressTo = 0; std::function ResetMemBpxCallback; + std::function ResetMemBpxExtraCallback = nullptr; ULONG_PTR NumberOfBytesReadWritten = 0; HANDLE hActiveThread; DWORD OldProtect; @@ -684,6 +685,11 @@ __declspec(dllexport) void TITCALL DebugLoop() { ResetMemBPX = false; ResetMemBpxCallback(); + if(ResetMemBpxExtraCallback != nullptr) + { + ResetMemBpxExtraCallback(); + ResetMemBpxExtraCallback = nullptr; + } engineStep(); } } @@ -859,7 +865,14 @@ __declspec(dllexport) void TITCALL DebugLoop() // - restore the protection if there are still our BPs on this page OR pass the exception to the debuggee DBGCode = DBG_EXCEPTION_NOT_HANDLED; - ResetMemBPX = false; + + // If the access is at page boundary, it can span an extra page before the internal step is run + if(ResetMemBPX) + { + ResetMemBpxExtraCallback = ResetMemBpxCallback; + ResetMemBPX = false; + } + bool bCallUserCallback = false; // when we hit a correct BP // Access Types: 0 - read, 1 - write, 8 - execute (dep violation)