void handle_BPM(process *p, thread *t, int bp_no, CONTEXT *ctx, MemoryCache *mc) { BP *bp=breakpoints[bp_no]; BPM *bpm=bp->u.bpm; address a=bp->a->abs_address; bool b; REG val; const char* v_type; switch (bpm->width) { case 1: { v_type="BYTE"; byte tmp; b=MC_ReadByte (mc, a, &tmp); oassert(b); val=tmp; }; break; case 2: { v_type="WORD"; wyde tmp; b=MC_ReadWyde (mc, a, &tmp); oassert(b); val=tmp; }; break; case 4: { v_type="DWORD"; DWORD tmp; b=MC_ReadTetrabyte (mc, a, &tmp); oassert(b); val=tmp; }; break; case 8: { #ifdef _WIN64 v_type="QWORD"; DWORD64 tmp; b=MC_ReadOctabyte (mc, a, &tmp); oassert(b); val=tmp; #else oassert (0); #endif }; break; default: oassert(0); fatal_error(); }; strbuf sb_sym=STRBUF_INIT, sb_bp_adr=STRBUF_INIT; address PC=CONTEXT_get_PC(ctx); process_get_sym (p, PC, true, true, &sb_sym); address_to_string(bp->a, &sb_bp_adr); dump_PID_if_need(p); dump_TID_if_need(p, t); L ("(%d) some code at %s (0x" PRI_ADR_HEX ") %s %s variable at %s (it contain 0x" PRI_REG_HEX " after execution of that instruction)\n", bp_no, sb_sym.buf, PC, bpm->t==BPM_type_RW ? "reading or writting" : "writting", v_type, sb_bp_adr.buf, val); //MC_WriteOctabyte(mc, bp->a->abs_address, 0); // can be option? strbuf_deinit(&sb_bp_adr); strbuf_deinit(&sb_sym); };
bool Da_op_get_value_of_op (struct Da_op *op, address * rt_adr, const CONTEXT * ctx, struct MemoryCache *mem, const char *fname, unsigned fileline, obj *result, unsigned ins_prefixes, address FS) { bool b; if (op->type==DA_OP_TYPE_REGISTER) { oassert (op->reg != R_ABSENT); // get from ctx X86_register_get_value (op->reg, ctx, result); return true; }; if (op->type==DA_OP_TYPE_VALUE) { obj_copy2 (result, &op->val._v); return true; }; if (op->type==DA_OP_TYPE_VALUE_IN_MEMORY) { *rt_adr=(REG)Da_op_calc_adr_of_op (op, ctx, mem, ins_prefixes, FS); //if ((*rt_adr)&(~0x7fffff0f000) == 0x7fffffd0000+2) if(0) { printf ("%s() line %d adr=0x"PRI_REG_HEX"\n", __FUNCTION__, __LINE__, *rt_adr); }; switch (op->value_width_in_bits) { case 8: { BYTE out; b=MC_ReadByte (mem, *rt_adr, &out); if (b) { obj_byte2((uint8_t)out, result); return true; } else return false; }; case 16: { WORD out; b=MC_ReadWyde (mem, *rt_adr, &out); if (b) { obj_wyde2((uint16_t)out, result); return true; } else return false; }; case 32: { DWORD out; b=MC_ReadTetrabyte (mem, *rt_adr, &out); if (b) { obj_tetra2((uint32_t)out, result); return true; } else return false; }; case 64: { DWORD64 out; b=MC_ReadOctabyte (mem, *rt_adr, &out); if (b) { obj_octa2((uint64_t)out, result); return true; } else return false; }; case 128: { M128A xmm; if (MC_ReadBuffer (mem, *rt_adr, sizeof (M128A), (BYTE*)&xmm)==false) return false; obj_xmm2 ((uint8_t*)&xmm, result); return true; }; default: oassert(!"unknown value_width_in_bits"); fatal_error(); break; }; oassert(0); }; #if 0 L ("%s(): type=%d!\n", __FUNCTION__, type); #endif oassert(0); // should not be here fatal_error(); };