mirror of https://github.com/x64dbg/TitanEngine
Remove a redundant GetThreadContext for synchronized breakpoints
This commit is contained in:
parent
8d833fb2e3
commit
d0b7e5addd
|
|
@ -8,6 +8,7 @@
|
||||||
#include "Global.Threader.h"
|
#include "Global.Threader.h"
|
||||||
#include "Global.Librarian.h"
|
#include "Global.Librarian.h"
|
||||||
#include "Global.TLS.h"
|
#include "Global.TLS.h"
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#define UE_MODULEx86 0x2000;
|
#define UE_MODULEx86 0x2000;
|
||||||
#define UE_MODULEx64 0x2000;
|
#define UE_MODULEx64 0x2000;
|
||||||
|
|
@ -67,7 +68,6 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
ULONG_PTR NumberOfBytesReadWritten = 0;
|
ULONG_PTR NumberOfBytesReadWritten = 0;
|
||||||
MEMORY_BASIC_INFORMATION MemInfo;
|
MEMORY_BASIC_INFORMATION MemInfo;
|
||||||
HANDLE hActiveThread;
|
HANDLE hActiveThread;
|
||||||
CONTEXT myDBGContext;
|
|
||||||
DWORD OldProtect;
|
DWORD OldProtect;
|
||||||
DWORD NewProtect;
|
DWORD NewProtect;
|
||||||
DWORD DebugRegisterXId = NULL;
|
DWORD DebugRegisterXId = NULL;
|
||||||
|
|
@ -80,7 +80,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
wchar_t* szTranslatedNativeName;
|
wchar_t* szTranslatedNativeName;
|
||||||
|
|
||||||
DWORD ThreadBeingProcessed = 0;
|
DWORD ThreadBeingProcessed = 0;
|
||||||
std::vector<THREAD_ITEM_DATA> SuspendedThreads;
|
std::unordered_map<DWORD, THREAD_ITEM_DATA> SuspendedThreads;
|
||||||
bool IsDbgReplyLaterSupported = false;
|
bool IsDbgReplyLaterSupported = false;
|
||||||
|
|
||||||
// Check if DBG_REPLY_LATER is supported based on Windows version (Windows 10, version 1507 or above)
|
// Check if DBG_REPLY_LATER is supported based on Windows version (Windows 10, version 1507 or above)
|
||||||
|
|
@ -112,6 +112,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
|
|
||||||
while(!BreakDBG) //actual debug loop
|
while(!BreakDBG) //actual debug loop
|
||||||
{
|
{
|
||||||
|
bool synchronizedStep = false;
|
||||||
// Fix based on work by https://github.com/number201724
|
// Fix based on work by https://github.com/number201724
|
||||||
if(!WaitForDebugEvent(&DBGEvent, 100))
|
if(!WaitForDebugEvent(&DBGEvent, 100))
|
||||||
{
|
{
|
||||||
|
|
@ -154,8 +155,8 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(ThreadBeingProcessed != 0 && DBGEvent.dwThreadId == ThreadBeingProcessed)
|
if(ThreadBeingProcessed != 0 && DBGEvent.dwThreadId == ThreadBeingProcessed)
|
||||||
{
|
{
|
||||||
// Resume the other threads since the thread being processed is exiting
|
// Resume the other threads since the thread being processed is exiting
|
||||||
for(auto & Thread : SuspendedThreads)
|
for(auto & itr : SuspendedThreads)
|
||||||
ResumeThread(Thread.hThread);
|
ResumeThread(itr.second.hThread);
|
||||||
|
|
||||||
SuspendedThreads.clear();
|
SuspendedThreads.clear();
|
||||||
ThreadBeingProcessed = 0;
|
ThreadBeingProcessed = 0;
|
||||||
|
|
@ -552,10 +553,14 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
||||||
|
CONTEXT myDBGContext;
|
||||||
myDBGContext.ContextFlags = ContextControlFlags;
|
myDBGContext.ContextFlags = ContextControlFlags;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
if(FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
if (FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
||||||
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
|
}
|
||||||
#if defined(_WIN64)
|
#if defined(_WIN64)
|
||||||
myDBGContext.Rip = myDBGContext.Rip - FoundBreakPoint.BreakPointSize;
|
myDBGContext.Rip = myDBGContext.Rip - FoundBreakPoint.BreakPointSize;
|
||||||
#else
|
#else
|
||||||
|
|
@ -642,8 +647,8 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(IsDbgReplyLaterSupported)
|
if(IsDbgReplyLaterSupported)
|
||||||
{
|
{
|
||||||
// Resume the other threads since we are done processing the single step
|
// Resume the other threads since we are done processing the single step
|
||||||
for(auto & Thread : SuspendedThreads)
|
for(auto & itr : SuspendedThreads)
|
||||||
ResumeThread(Thread.hThread);
|
ResumeThread(itr.second.hThread);
|
||||||
|
|
||||||
SuspendedThreads.clear();
|
SuspendedThreads.clear();
|
||||||
ThreadBeingProcessed = 0;
|
ThreadBeingProcessed = 0;
|
||||||
|
|
@ -672,15 +677,19 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
engineStep();
|
engineStep();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
{
|
{
|
||||||
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
||||||
|
CONTEXT myDBGContext;
|
||||||
myDBGContext.ContextFlags = ContextControlFlags;
|
myDBGContext.ContextFlags = ContextControlFlags;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
EngineCloseHandle(hActiveThread);
|
EngineCloseHandle(hActiveThread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if(ResetHwBPX) //restore hardware breakpoint
|
if(ResetHwBPX) //restore hardware breakpoint
|
||||||
{
|
{
|
||||||
ResetHwBPX = false;
|
ResetHwBPX = false;
|
||||||
|
|
@ -727,6 +736,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
{
|
{
|
||||||
//handle hardware breakpoints
|
//handle hardware breakpoints
|
||||||
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
||||||
|
CONTEXT myDBGContext;
|
||||||
myDBGContext.ContextFlags = CONTEXT_DEBUG_REGISTERS | ContextControlFlags;
|
myDBGContext.ContextFlags = CONTEXT_DEBUG_REGISTERS | ContextControlFlags;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
if((ULONG_PTR)DBGEvent.u.Exception.ExceptionRecord.ExceptionAddress == myDBGContext.Dr0 || (myDBGContext.Dr6 & 0x1))
|
if((ULONG_PTR)DBGEvent.u.Exception.ExceptionRecord.ExceptionAddress == myDBGContext.Dr0 || (myDBGContext.Dr6 & 0x1))
|
||||||
|
|
@ -734,8 +744,11 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(DebugRegister[0].DrxEnabled)
|
if(DebugRegister[0].DrxEnabled)
|
||||||
{
|
{
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
myCustomHandler = (fCustomHandler)(DebugRegister[0].DrxCallBack);
|
myCustomHandler = (fCustomHandler)(DebugRegister[0].DrxCallBack);
|
||||||
myCustomHandler((void*)myDBGContext.Dr0);
|
myCustomHandler((void*)myDBGContext.Dr0);
|
||||||
if(DebugRegister[0].DrxEnabled)
|
if(DebugRegister[0].DrxEnabled)
|
||||||
|
|
@ -762,8 +775,11 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(DebugRegister[1].DrxEnabled)
|
if(DebugRegister[1].DrxEnabled)
|
||||||
{
|
{
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
myCustomHandler = (fCustomHandler)(DebugRegister[1].DrxCallBack);
|
myCustomHandler = (fCustomHandler)(DebugRegister[1].DrxCallBack);
|
||||||
myCustomHandler((void*)myDBGContext.Dr1);
|
myCustomHandler((void*)myDBGContext.Dr1);
|
||||||
if(DebugRegister[1].DrxEnabled)
|
if(DebugRegister[1].DrxEnabled)
|
||||||
|
|
@ -790,8 +806,11 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(DebugRegister[2].DrxEnabled)
|
if(DebugRegister[2].DrxEnabled)
|
||||||
{
|
{
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
myCustomHandler = (fCustomHandler)(DebugRegister[2].DrxCallBack);
|
myCustomHandler = (fCustomHandler)(DebugRegister[2].DrxCallBack);
|
||||||
myCustomHandler((void*)myDBGContext.Dr2);
|
myCustomHandler((void*)myDBGContext.Dr2);
|
||||||
if(DebugRegister[2].DrxEnabled)
|
if(DebugRegister[2].DrxEnabled)
|
||||||
|
|
@ -818,8 +837,11 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(DebugRegister[3].DrxEnabled)
|
if(DebugRegister[3].DrxEnabled)
|
||||||
{
|
{
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
myCustomHandler = (fCustomHandler)(DebugRegister[3].DrxCallBack);
|
myCustomHandler = (fCustomHandler)(DebugRegister[3].DrxCallBack);
|
||||||
myCustomHandler((void*)myDBGContext.Dr3);
|
myCustomHandler((void*)myDBGContext.Dr3);
|
||||||
if(DebugRegister[3].DrxEnabled)
|
if(DebugRegister[3].DrxEnabled)
|
||||||
|
|
@ -893,6 +915,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(bFoundBreakPoint) //found memory breakpoint
|
if(bFoundBreakPoint) //found memory breakpoint
|
||||||
{
|
{
|
||||||
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
||||||
|
CONTEXT myDBGContext;
|
||||||
myDBGContext.ContextFlags = ContextControlFlags;
|
myDBGContext.ContextFlags = ContextControlFlags;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
DBGCode = DBG_CONTINUE; //debugger handled the exception
|
DBGCode = DBG_CONTINUE; //debugger handled the exception
|
||||||
|
|
@ -904,9 +927,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -922,9 +948,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else //restore the memory breakpoint
|
else //restore the memory breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -935,9 +964,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
myCustomHandler((void*)bpaddr);
|
myCustomHandler((void*)bpaddr);
|
||||||
}
|
}
|
||||||
else //no read operation, restore breakpoint
|
else //no read operation, restore breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -951,9 +983,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else //restore breakpoint after trap flag
|
else //restore breakpoint after trap flag
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -964,9 +999,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
myCustomHandler((void*)bpaddr);
|
myCustomHandler((void*)bpaddr);
|
||||||
}
|
}
|
||||||
else //no write operation, restore breakpoint
|
else //no write operation, restore breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -981,9 +1019,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -995,9 +1036,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
myCustomHandler((void*)bpaddr);
|
myCustomHandler((void*)bpaddr);
|
||||||
}
|
}
|
||||||
else //no execute operation, restore breakpoint
|
else //no execute operation, restore breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1062,6 +1106,7 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
if(bFoundBreakPoint && engineMembpAlt) //found memory breakpoint
|
if(bFoundBreakPoint && engineMembpAlt) //found memory breakpoint
|
||||||
{
|
{
|
||||||
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
||||||
|
CONTEXT myDBGContext;
|
||||||
myDBGContext.ContextFlags = ContextControlFlags;
|
myDBGContext.ContextFlags = ContextControlFlags;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
DBGCode = DBG_CONTINUE; //debugger handled the exception
|
DBGCode = DBG_CONTINUE; //debugger handled the exception
|
||||||
|
|
@ -1074,9 +1119,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1092,9 +1140,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else //restore the memory breakpoint
|
else //restore the memory breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1104,9 +1155,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
bCallCustomHandler = true;
|
bCallCustomHandler = true;
|
||||||
}
|
}
|
||||||
else //no read operation, restore breakpoint
|
else //no read operation, restore breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1120,9 +1174,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else //restore breakpoint after trap flag
|
else //restore breakpoint after trap flag
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1132,9 +1189,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
bCallCustomHandler = true;
|
bCallCustomHandler = true;
|
||||||
}
|
}
|
||||||
else //no write operation, restore breakpoint
|
else //no write operation, restore breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1149,9 +1209,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
RemoveMemoryBPX(FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1162,9 +1225,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
bCallCustomHandler = true;
|
bCallCustomHandler = true;
|
||||||
}
|
}
|
||||||
else //no execute operation, restore breakpoint
|
else //no execute operation, restore breakpoint
|
||||||
|
{
|
||||||
{
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
|
}
|
||||||
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
ResetMemBPXAddress = FoundBreakPoint.BreakPointAddress;
|
||||||
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
ResetMemBPXSize = FoundBreakPoint.BreakPointSize;
|
||||||
ResetMemBPX = true;
|
ResetMemBPX = true;
|
||||||
|
|
@ -1238,13 +1304,21 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
{
|
{
|
||||||
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
FlushInstructionCache(dbgProcessInformation.hProcess, NULL, 0);
|
||||||
DBGCode = DBG_CONTINUE;
|
DBGCode = DBG_CONTINUE;
|
||||||
|
|
||||||
|
{
|
||||||
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
||||||
|
CONTEXT myDBGContext;
|
||||||
myDBGContext.ContextFlags = ContextControlFlags;
|
myDBGContext.ContextFlags = ContextControlFlags;
|
||||||
GetThreadContext(hActiveThread, &myDBGContext);
|
GetThreadContext(hActiveThread, &myDBGContext);
|
||||||
if(FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
if (FoundBreakPoint.BreakPointType != UE_SINGLESHOOT)
|
||||||
|
{
|
||||||
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
myDBGContext.EFlags |= UE_TRAP_FLAG;
|
||||||
|
synchronizedStep = true;
|
||||||
|
}
|
||||||
SetThreadContext(hActiveThread, &myDBGContext);
|
SetThreadContext(hActiveThread, &myDBGContext);
|
||||||
EngineCloseHandle(hActiveThread);
|
EngineCloseHandle(hActiveThread);
|
||||||
|
}
|
||||||
|
|
||||||
VirtualProtectEx(dbgProcessInformation.hProcess, (LPVOID)FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize, OldProtect, &OldProtect);
|
VirtualProtectEx(dbgProcessInformation.hProcess, (LPVOID)FoundBreakPoint.BreakPointAddress, FoundBreakPoint.BreakPointSize, OldProtect, &OldProtect);
|
||||||
|
|
||||||
if(FoundBreakPoint.BreakPointType == UE_SINGLESHOOT)
|
if(FoundBreakPoint.BreakPointType == UE_SINGLESHOOT)
|
||||||
|
|
@ -1398,31 +1472,26 @@ __declspec(dllexport) void TITCALL DebugLoop()
|
||||||
|
|
||||||
if(IsDbgReplyLaterSupported && DBGEvent.dwDebugEventCode != EXIT_THREAD_DEBUG_EVENT)
|
if(IsDbgReplyLaterSupported && DBGEvent.dwDebugEventCode != EXIT_THREAD_DEBUG_EVENT)
|
||||||
{
|
{
|
||||||
CONTEXT DbgCtx;
|
|
||||||
|
|
||||||
DbgCtx.ContextFlags = ContextControlFlags;
|
|
||||||
|
|
||||||
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
hActiveThread = EngineOpenThread(THREAD_GETSETSUSPEND, false, DBGEvent.dwThreadId);
|
||||||
|
|
||||||
if(hActiveThread != NULL)
|
if(hActiveThread != NULL)
|
||||||
{
|
{
|
||||||
// If TF is set (single step), then suspend all the other threads
|
// If TF is set (single step), then suspend all the other threads
|
||||||
if(GetThreadContext(hActiveThread, &DbgCtx) && (DbgCtx.EFlags & UE_TRAP_FLAG))
|
if(synchronizedStep)
|
||||||
{
|
{
|
||||||
ThreadBeingProcessed = DBGEvent.dwThreadId;
|
ThreadBeingProcessed = DBGEvent.dwThreadId;
|
||||||
|
|
||||||
for(auto & Thread : hListThread)
|
for(auto & Thread : hListThread)
|
||||||
{
|
{
|
||||||
|
// Do not suspend the current thread
|
||||||
if(ThreadBeingProcessed == Thread.dwThreadId)
|
if(ThreadBeingProcessed == Thread.dwThreadId)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Check if the thread is already suspended
|
// Check if the thread is already suspended
|
||||||
for(auto & SuspendedThread : SuspendedThreads)
|
if (SuspendedThreads.count(Thread.dwThreadId) != 0)
|
||||||
if(SuspendedThread.dwThreadId == Thread.dwThreadId)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(SuspendThread(Thread.hThread) != -1)
|
if (SuspendThread(Thread.hThread) != -1)
|
||||||
SuspendedThreads.push_back(Thread);
|
SuspendedThreads.emplace(Thread.dwThreadId, Thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue