size_t DisCliValueString( void *d, dis_dec_ins *ins, unsigned op_num, char *buff, size_t buff_len ) { struct pass2 *pd = d; size_t len; dis_operand *op; ref_flags rf; buff_len = buff_len; buff[0] = '\0'; rf = RFLAG_DEFAULT; op = &ins->op[op_num]; switch( op->type & DO_MASK ) { case DO_RELATIVE: case DO_MEMORY_REL: case DO_ABSOLUTE: case DO_MEMORY_ABS: if( pd->r_entry != NULL ) { /* if there is an override we must avoid the frame */ if( ( ins->flags.u.x86 & DIS_X86_SEG_OR ) && IsIntelx86() ) { rf |= RFLAG_NO_FRAME; } len = HandleAReference( op->value, ins->size, rf, pd->loop + op->op_position, pd->size, &pd->r_entry, buff ); if( len != 0 ) { return( len ); } } switch( op->type & DO_MASK ) { case DO_RELATIVE: case DO_MEMORY_REL: op->value += pd->loop; break; } if( op->base == DR_NONE && op->index == DR_NONE ) { FmtSizedHexNum( buff, ins, op_num ); } else if( op->value > 0 ) { FmtHexNum( buff, 0, op->value, FALSE ); } else if( op->value < 0 ) { buff[0] = '-'; FmtHexNum( &buff[1], 0, -op->value, FALSE ); } break; case DO_IMMED: if( pd->r_entry != NULL ) { rf |= RFLAG_IS_IMMED; len = HandleAReference( op->value, ins->size, rf, pd->loop + op->op_position, pd->size, &pd->r_entry, buff ); if( len != 0 ) { return( len ); } } FmtSizedHexNum( buff, ins, op_num ); break; } return( strlen( buff ) ); }
unsigned HandleRefInData( ref_entry r_entry, void *data, bool asmLabels ) { unsigned rv; const char * const *types; char buff[MAX_SYM_LEN]; // fixme: should be TS_MAX_OBJNAME or something dis_value value; if( IsMasmOutput() ) { types = masmTypes; } else { types = unixTypes; } rv = RelocSize( r_entry ); value.u._32[I64HI32] = 0; switch( rv ) { case 6: value.u._32[I64LO32] = *(unsigned_32 *)data; break; case 4: value.u._32[I64LO32] = *(unsigned_32 *)data; break; case 2: value.u._32[I64LO32] = *(unsigned_16 *)data; break; case 1: value.u._32[I64LO32] = *(unsigned_8 *)data; break; case 8: value.u._32[I64LO32] = 0; break; default: value.u._32[I64LO32] = 0; break; } if( asmLabels && types[rv] != NULL ) { BufferConcat( types[rv] ); } HandleAReference( value, 0, RFLAG_DEFAULT | RFLAG_IS_IMMED, r_entry->offset, r_entry->offset + rv, &r_entry, buff ); BufferConcat( buff ); switch( rv ) { case 8: value.u._32[I64LO32] = *(unsigned_32 *)data; value.u._32[I64HI32] = *((unsigned_32 *)data + 1); if( value.u._32[I64LO32] != 0 || value.u._32[I64HI32] != 0 ) { BufferConcat( "+" ); if( value.u._32[I64HI32] != 0 ) { BufferStore( "0x%x", value.u._32[I64HI32] ); BufferStore( "%08x", value.u._32[I64LO32] ); } else { BufferStore( "0x%x", value.u._32[I64LO32] ); } } break; } return( rv ); }
orl_sec_offset HandleRefInData( ref_entry r_entry, void *data, bool asmLabels ) { orl_sec_offset rv; const char * const *types; char buff[MAX_SYM_LEN]; // fixme: should be TS_MAX_OBJNAME or something if( IsMasmOutput() ) { types = masmTypes; } else { types = unixTypes; } rv = RelocSize( r_entry ); switch( rv ) { case 6: if( asmLabels && types[rv] ) { BufferConcat( types[rv] ); } HandleAReference(*((unsigned_32 *)data), 0, RFLAG_DEFAULT | RFLAG_IS_IMMED, r_entry->offset, r_entry->offset + rv, &r_entry, buff ); BufferConcat( buff ); break; case 4: if( asmLabels ) { BufferConcat( types[rv] ); } HandleAReference(*((unsigned_32 *)data), 0, RFLAG_DEFAULT | RFLAG_IS_IMMED, r_entry->offset, r_entry->offset + rv, &r_entry, buff ); BufferConcat( buff ); break; case 2: if( asmLabels ) { BufferConcat( types[rv] ); } HandleAReference(*((unsigned_16 *)data), 0, RFLAG_DEFAULT | RFLAG_IS_IMMED, r_entry->offset, r_entry->offset + rv, &r_entry, buff ); BufferConcat( buff ); break; case 1: if( asmLabels ) { BufferConcat( types[rv] ); } HandleAReference(*((unsigned_8 *)data), 0, RFLAG_DEFAULT | RFLAG_IS_IMMED, r_entry->offset, r_entry->offset + rv, &r_entry, buff ); BufferConcat( buff ); break; case 8: if( asmLabels ) { BufferConcat( types[rv] ); } HandleAReference( 0, 0, RFLAG_DEFAULT | RFLAG_IS_IMMED, r_entry->offset, r_entry->offset + rv, &r_entry, buff ); BufferConcat( buff ); if( *((long *)data)!=0 || *((long *)data+4)!=0 ) { BufferConcat("+"); if( *((long *)data+4)!=0 ) { BufferStore("0x%x", *((long *)data+4) ); BufferStore("%08x", *((long *)data) ); } else { BufferStore("0x%x", *((long *)data) ); } } break; } return( rv ); }