//-------------------------------------------------------------------------- ea_t pc_debmod_t::is_hwbpt_triggered(thid_t id) { CONTEXT Context; Context.ContextFlags = CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL; HANDLE h = get_thread_handle(id); if ( GetThreadContext(h, &Context) ) { for ( int i=0; i < MAX_BPT; i++ ) { if ( (Context.Dr7 & uint32(1 << (i*2))) && (Context.Dr6 & uint32(1 << i)) ) // Local hardware breakpoint 'i' { ULONG_PTR *dr = NULL; switch ( i ) { case 0: dr = &Context.Dr0; break; case 1: dr = &Context.Dr1; break; case 2: dr = &Context.Dr2; break; case 3: dr = &Context.Dr3; break; } if ( dr == NULL ) break; if ( hwbpt_ea[i] == *dr ) { set_hwbpts(h); // Clear the status bits return hwbpt_ea[i]; } //? TRACING else // debdeb("System hardware breakpoint at %08X ???\n", *dr); //? // what to do ?: // reset it, and continue as if no event were received ? // send it to IDA, and let the user setup a "stop on non-debugger hardware breakpoint" option ? } } } return BADADDR; }
//-------------------------------------------------------------------------- bool wince_debmod_t::enable_hwbpts() { return set_hwbpts(NULL); }