walk_result DIGENTRY MIDisasmMemRefWalk( mad_disasm_data *dd, MI_MEMREF_WALKER *wk, const mad_registers *mr, void *d ) { struct memref_glue glue; glue.wk = wk; glue.d = d; return( DoDisasmMemRefWalk( dd, MemRefGlue, mr, &glue ) ); }
mad_trace_how DIGENTRY MITraceOne( mad_trace_data *td, mad_disasm_data *dd, mad_trace_kind tk, const mad_registers *mr, address *brk ) { mad_trace_how th; th = DoTraceOne( td, dd, tk, mr ); th = CheckSpecial( td, dd, mr, th ); switch( MCSystemConfig()->os ) { case OS_OS2: case OS_NW386: case OS_QNX: case OS_WINDOWS: case OS_NT: break; default: DoDisasmMemRefWalk( dd, TouchesScreenBuff, mr, (void *)mr ); break; } td->prev_ins_type = dd->ins.type; td->prev_ins_flags.u.x86 = dd->ins.flags.u.x86; switch( th ) { case MTRH_BREAK: switch( td->prev_ins_type ) { case DI_X86_call: case DI_X86_call2: case DI_X86_call3: case DI_X86_call4: case DI_X86_int: case DI_X86_into: MCNotify( MNT_EXECUTE_LONG, NULL ); break; default: break; } /* fall through */ case MTRH_STEPBREAK: *brk = td->brk; break; } return( th ); }
mad_status DIGENTRY MIDisasmInsNext( mad_disasm_data *dd, const mad_registers *mr, address *next ) { mad_disasm_control dc; *next = GetRegIP( mr ); next->mach.offset += dd->ins.size; dc = DisasmControl( dd, mr ); if( (dc & MDC_TAKEN_MASK) == MDC_TAKEN_NOT ) { return( MS_OK ); } switch( dc & MDC_TYPE_MASK ) { case MDC_SYSCALL: return( MS_FAIL ); case MDC_JUMP: case MDC_CALL: switch( dd->ins.op[ OP_1 ].type & DO_MASK ) { case DO_ABSOLUTE: next->mach.segment = dd->ins.op[ OP_1 ].extra; /* fall through */ case DO_RELATIVE: next->mach.offset = dd->ins.op[ OP_1 ].value; break; case DO_REG: next->mach.offset = RegValue( mr, dd->ins.op[ OP_1 ].base ); break; default: /* memory indirect jump/call */ DoDisasmMemRefWalk( dd, FindCallTarget, mr, &DbgAddr ); if( dd->ins.flags.u.x86 & DIF_X86_OPND_LONG ) { next->mach.offset = GetDataLong(); if( dd->ins.op[ OP_1 ].ref_type == DRT_X86_FARPTR48 ) { next->mach.segment = (unsigned_16)GetDataWord(); } } else { next->mach.offset = (unsigned_16)GetDataWord(); if( dd->ins.op[ OP_1 ].ref_type == DRT_X86_FARPTR32 ) { next->mach.segment = (unsigned_16)GetDataWord(); } } break; } break; case MDC_SYSRET: case MDC_RET: DbgAddr = GetRegSP( mr ); if( dd->ins.flags.u.x86 & DIF_X86_OPND_LONG ) { next->mach.offset = GetDataLong(); } else { next->mach.offset = (unsigned_16)GetDataWord(); } switch( dd->ins.type ) { case DI_X86_retf: case DI_X86_retf2: next->mach.segment = (unsigned_16)GetDataWord(); break; default: break; } break; } return( MS_OK ); }