IDA SDK

- Main Page
- Header Files
- Classes
- Modules

- File List
- File Members

Functions
offset.hpp File Reference

## Detailed Description

Functions that deal with offsets.

"Being an offset" is a characteristic of an operand. This means that operand or its part represent offset from some address in the program. This linear address is called "offset base". Some operands may have 2 offsets simultaneously. Generally, IDA doesn't handle this except for Motorola outer offsets. Thus there may be two offset values in an operand: simple offset and outer offset.

Outer offsets are handled by specifying special operand number: it should be ORed with OPND_OUTER value.

See bytes.hpp for further explanation of operand numbers.

## Functions
idaman bool ida_export | set_offset (ea_t ea, int n, ea_t base)
| Convert operand to offset - OBSOLETE FUNCTION, use op_offset() instead. More...
idaman int ida_export | op_offset_ex (ea_t ea, int n, const refinfo_t *ri)
| Convert operand to a reference. More...
idaman int ida_export | op_offset (ea_t ea, int n, reftype_t type, ea_t target=BADADDR, ea_t base=0, adiff_t tdelta=0)
| See op_offset_ex()
idaman ea_t ida_export | get_offbase (ea_t ea, int n)
| Get offset base value - OBSOLETE FUNCTION, use get_refinfo() instead. More...
idaman int ida_export | get_offset_expression (ea_t ea, int n, ea_t from, adiff_t offset, char *buf, size_t bufsize, int getn_flags=0)
| Get offset expression (in the form "offset name+displ"). More...
idaman int ida_export | get_offset_expr (ea_t ea, int n, refinfo_t &ri, ea_t from, adiff_t offset, char *buf, size_t bufsize, int getn_flags=0)
| See get_offset_expression()
idaman ea_t ida_export | can_be_off32 (ea_t ea)
| Does the specified address contain a valid OFF32 value?. More...
idaman ea_t ida_export | calc_probable_base_by_value (ea_t ea, uval_t off)
| Try to calculate the offset base. More...
idaman reftype_t ida_export | get_default_reftype (ea_t ea)
| Get default reference type depending on the segment. More...
idaman ea_t ida_export | calc_reference_target (ea_t from, refinfo_t &ri, adiff_t opval)
| Calculate the target address of an offset expression. More...
idaman ea_t ida_export | calc_reference_basevalue (ea_t from, refinfo_t &ri, adiff_t opval, ea_t target)
| Calculate the value of the reference base. More...
ea_t | calc_target (ea_t from, ea_t ea, int n, adiff_t opval)
| Retrieves refinfo_t structure and calculates the target.

## Function Documentation

idaman bool ida_export set_offset | ( | ea_t | ea,
|  | int | n,
|  | ea_t | base
| ) |  |

Convert operand to offset - OBSOLETE FUNCTION, use op_offset() instead.

To delete an offset, use noType() function.

Parameters

  ea | linear address. if 'ea' has unexplored bytes, try to convert them to no segment: fail 16bit segment: to 16bit word data 32bit segment: to dword
  n | number of operand (may be ORed with OPND_OUTER) 0: first 1: second OPND_MASK: both operands
  base | base of offset (linear address)

Returns
  success

idaman int ida_export op_offset_ex | ( | ea_t | ea,
|  | int | n,
|  | const refinfo_t * | ri
| ) |  |

Convert operand to a reference.

To delete an offset, use noType() function.

Parameters

  ea | linear address. if 'ea' has unexplored bytes, try to convert them to no segment: fail 16bit segment: to 16bit word data 32bit segment: to dword
  n | number of operand (may be ORed with OPND_OUTER) 0: first 1: second 2: third OPND_MASK: all operands
  ri | reference information

Returns
  success

idaman ea_t ida_export get_offbase | ( | ea_t | ea,
|  | int | n
| ) |  |

Get offset base value - OBSOLETE FUNCTION, use get_refinfo() instead.

Parameters

  ea | linear address
  n | number of operand (may be ORed with OPND_OUTER) 0: first 1: second OPND_MASK: try to get base of the first operand, get the second if the first doesn't exist

Returns
  offset base or BADADDR

idaman int ida_export get_offset_expression | ( | ea_t | ea,
|  | int | n,
|  | ea_t | from,
|  | adiff_t | offset,
|  | char * | buf,
|  | size_t | bufsize,
|  | int | getn_flags = `0`
| ) |  |

Get offset expression (in the form "offset name+displ").

This function uses offset translation function ( processor_t::translate) if your IDP module has such a function. Translation function is used to map linear addresses in the program (only for offsets).

Example: suppose we have instruction at linear address 0x00011000:

    mov     ax, [bx+7422h]

and at ds:7422h:

    array   dw      ...

We want to represent the second operand with an offset expression, so then we call:

    get_offset_expresion(0x001100, 1, 0x001102, 0x7422, buf);
                         |         |  |         |       |
                         |         |  |         |       +output buffer
                         |         |  |         +value of offset expression
                         |         |  +address offset value in the instruction
                         |         +the second operand
                         +address of instruction

and the function will return a colored string:

    offset array

Parameters

  ea | start of instruction or data with the offset expression
  n | number of operand (may be ORed with OPND_OUTER) 0: first operand 1: second operand
  from | linear address of instruction operand or data referring to the name. This address will be used to get fixup information, so it should point to exact position of operand in the instruction.
  offset | value of operand or its part. The function will return text representation of this value as offset expression.
  buf | output buffer to hold offset expression
  bufsize | size of the output buffer
  getn_flags | combination of: GETN_APPZERO: meaningful only if the name refers to a structure. appends the struct field name if the field offset is zero GETN_NODUMMY: do not generate dummy names for the expression but pretend they already exist (useful to verify that the offset expression can be represented)

Return values

  0 | can't convert to offset expression
  1 | ok, a simple offset expression
  2 | ok, a complex offset expression

idaman ea_t ida_export can_be_off32 | ( | ea_t | ea | ) |

Does the specified address contain a valid OFF32 value?.

For symbols in special segments the displacement is not taken into account. If yes, then the target address of OFF32 will be returned. If not, then BADADDR is returned.

idaman ea_t ida_export calc_probable_base_by_value | ( | ea_t | ea,
|  | uval_t | off
| ) |  |

Try to calculate the offset base.

2 bases are checked: current ds and cs. If fails, return BADADDR

idaman reftype_t ida_export get_default_reftype | ( | ea_t | ea | ) |

Get default reference type depending on the segment.

Returns
  one of REF_OFF8,REF_OFF16,REF_OFF32

idaman ea_t ida_export calc_reference_target | ( | ea_t | from,
|  | refinfo_t & | ri,
|  | adiff_t | opval
| ) |  |

Calculate the target address of an offset expression.

Note
  this function may change 'ri' structure.

If ri.base is BADADDR, it calculates the offset base address from the referencing instruction/data address.

Parameters

  ri | reference info block from the database
  opval | operand value (usually op_t::value or op_t::addr)

Returns
  the target address of the reference

idaman ea_t ida_export calc_reference_basevalue | ( | ea_t | from,
|  | refinfo_t & | ri,
|  | adiff_t | opval,
|  | ea_t | target
| ) |  |

Calculate the value of the reference base.

The reference basevalue is used like this: "offset target - reference_basevalue" Usually the basevalue is equal to 0. If it is not equal to 0, then ri.base contains the address of reference_basevalue (which is not equal to reference_basevalue for 16-bit programs!).

Parameters

  from | the referencing instruction/data address
  ri | reference info block from the database
  opval | operand value (usually op_t::value or op_t::addr)
  target | the reference target. If BADADDR, it will be calculated automatically

Returns
  the reference basevalue