HL_API bool hl_debug_write_register( int pid, int thread, int reg, void *value, bool is64 ) { # if defined(HL_WIN) # ifdef HL_64 if( !is64 ) { WOW64_CONTEXT c; c.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; if( !Wow64GetThreadContext(OpenTID(thread),&c) ) return false; if( reg == 3 ) c.EFlags = (int)(int_val)value; else *GetContextReg32(&c,reg) = (DWORD)(int_val)value; return (bool)Wow64SetThreadContext(OpenTID(thread),&c); } # else if( is64 ) return false; # endif CONTEXT c; c.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; if( !GetThreadContext(OpenTID(thread),&c) ) return false; if( reg == 3 ) c.EFlags = (int)(int_val)value; else *GetContextReg(&c,reg) = (REGDATA)value; return (bool)SetThreadContext(OpenTID(thread),&c); # elif defined(USE_PTRACE) return ptrace(PTRACE_POKEUSER,thread,get_reg(reg),value) >= 0; # else return false; # endif }
HL_API void *hl_debug_read_register( int pid, int thread, int reg, bool is64 ) { # if defined(HL_WIN) # ifdef HL_64 if( !is64 ) { WOW64_CONTEXT c; c.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; if( !Wow64GetThreadContext(OpenTID(thread),&c) ) return NULL; if( reg == 3 ) return (void*)(int_val)c.EFlags; return (void*)(int_val)*GetContextReg32(&c,reg); } # else if( is64 ) return NULL; # endif CONTEXT c; c.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; if( !GetThreadContext(OpenTID(thread),&c) ) return NULL; if( reg == 3 ) return (void*)(int_val)c.EFlags; return (void*)*GetContextReg(&c,reg); # elif defined(USE_PTRACE) return (void*)ptrace(PTRACE_PEEKUSER,thread,get_reg(reg),0); # else return NULL; # endif }
_WCRTLINK void _InitExcInfo( _EXCINFO *info ) { RtlCaptureContext( &info->ContextRecord ); info->InFunction = 1; info->ControlPC = GetContextReg( &info->ContextRecord, Ra ); _SetPData( info ); _NextExcInfo( info ); }