mirror of https://github.com/x64dbg/TitanEngine
Preserve debug registers in breakpoint step-over context
ContextControlFlags is used by the debug loop's SetThreadContext calls during breakpoint step-over. Under WoW64 (x64 debugger, 32-bit target) writing back with plain CONTEXT_CONTROL cleared the DR0..DR7 registers armed via hbreak. Include CONTEXT_DEBUG_REGISTERS so a breakpoint step never erases them.
This commit is contained in:
parent
f425de392c
commit
92cbf60a69
|
|
@ -43,7 +43,12 @@ CRITICAL_SECTION engineStepActiveCr;
|
||||||
// Workaround for a bug in the kernel with x64 emulation on ARM
|
// Workaround for a bug in the kernel with x64 emulation on ARM
|
||||||
DWORD ContextControlFlags = []
|
DWORD ContextControlFlags = []
|
||||||
{
|
{
|
||||||
DWORD flags = CONTEXT_CONTROL;
|
// CONTEXT_CONTROL alone reads/writes only the control registers. When the
|
||||||
|
// debugger (x64) cross-debugs a 32-bit target under WoW64, a SetThreadContext
|
||||||
|
// issued with plain CONTEXT_CONTROL clobbers the debug registers the user
|
||||||
|
// armed via hbreak (DR0..DR7) — Windows writes back the whole flagged set.
|
||||||
|
// Include CONTEXT_DEBUG_REGISTERS so breakpoint steps never erase them.
|
||||||
|
DWORD flags = CONTEXT_CONTROL | CONTEXT_DEBUG_REGISTERS;
|
||||||
typedef BOOL(WINAPI * type_IsWow64Process2)(HANDLE, USHORT*, USHORT*);
|
typedef BOOL(WINAPI * type_IsWow64Process2)(HANDLE, USHORT*, USHORT*);
|
||||||
auto p_IsWow64Process2 = (type_IsWow64Process2)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "IsWow64Process2");
|
auto p_IsWow64Process2 = (type_IsWow64Process2)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "IsWow64Process2");
|
||||||
if(p_IsWow64Process2)
|
if(p_IsWow64Process2)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue