Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Porting Guide from IDA 8.x to 9.0

IDA 9.0 IDAPython changes and porting guide

{% hint style=“info” %} How to use this Porting Guide? This guide provides a comprehensive list of all changes in IDAPython API between IDA 8.4 and 9.0. Here’s how you can make the most of it:

Introduction

This guide provides information about what has been changed in the IDAPython API between IDA 8.4 and 9.0.

The largest change is due to the removal of two modules:

  • ida_struct
  • ida_enum

For years now, those 2 modules have been superseded by the ida_typeinf module, which offers similar functionality.

In case you are not familiar with ida_typeinf’s main concepts, we recommend having a look at them first.

ida_struct

  1. ida_struct structures were accessed mostly through their index (or ID), while ida_typeinf adopts another approach using type names (or ordinals). Consequently, the notion of “structure index” bears less importance, and doesn’t have a direct alternative.
  2. many ida_struct.get_struc_* operations were accepting a tid_t. While the notion of tid_t is still present in IDA 9.0, it is not part of identifying a type anymore (a type is now identified either by its name, or its ordinal). The notion of tid_t is mostly used to “bind” types to data & functions in the IDB. For example, calling ida_nalt.get_strid(address) will return you such a tid_t. From a tid_t, you can load the corresponding tinfo_t object by using tinfo_t(tid=id).

Removed functions:

The table below provides alternatives to the functions that have been removed in IDA 9.0.

8.49.0
add_structinfo_t.create_udt
add_struc_membertinfo_t.add_udm
del_strucdel_numbered_type, del_named_type
del_struc_membertinfo_t.del_udm
del_struc_memberssee example
expand_structinfo_t.expand_udt
get_best_fit_memberudt_type_data_t.get_best_fit_member
get_first_struc_idxtil_t.numbered_types (see notes)
get_innermost_membertinfo_t.get_innermost_udm
get_last_struc_idxsee notes
get_max_offsettinfo_t.get_size (structures), or tinfo_t.get_udt_nmembers (unions)
get_membertinfo_t.get_udm / tinfo_t.get_udm_by_offset
get_member_by_fullnameget_udm_by_fullname
get_member_by_idtinfo_t.get_udm_by_tid
get_member_by_nametinfo_t.get_udm
get_member_cmttinfo_t.get_udm + udm_t.cmt
get_member_fullnameget_tif_name
get_member_idtinfo_t(tid=...) + tinfo_t.get_udm_tid
get_member_nametinfo_t(tid=...) + tinfo_t.get_udm + udm_t.name
get_member_sizetinfo_t(tid=...) + tinfo_t.get_udm + udm_t.size
get_member_strucget_udm_by_fullname
get_member_tinfoudm_t.type
get_next_member_idxsee notes
get_next_struc_idxsee notes
get_or_guess_member_tinfo
get_prev_member_idxsee notes
get_prev_struc_idxsee notes
get_sptrsee example
get_structinfo_t(tid=...)
get_struc_by_idxsee notes
get_struc_cmttinfo_t.get_type_cmt
get_struc_first_offset
get_struc_idget_named_type_tid
get_struc_idxsee notes
get_struc_last_offsettinfo_t.get_udt_details + udm_t.offset
get_struc_nameget_tid_name
get_struc_next_offset
get_struc_prev_offset
get_struc_qtysee example
get_struc_sizetinfo_t(tid=...) + tinfo_t.get_size
is_anonymous_member_nameida_frame.is_anonymous_member_name
is_dummy_member_nameida_frame.is_dummy_member_name
is_member_ididc.is_member_id
is_special_membersee example
is_uniontinfo_t(tid=...) + tinfo_t.is_union
is_varmemberudm_t.is_varmember
is_varstrtinfo_t(tid=...) + tinfo_t.is_varstruct
retrieve_member_info
save_structinfo_t.save_type / tinfo_t.set_named_type / tinfo_t.set_numbered_type
set_member_cmttinfo_t(tid=...) + tinfo_t.set_udm_cmt
set_member_nametinfo_t(tid=...) + tinfo_t.rename_udm
set_member_tinfo
set_member_typetinfo_t(tid=...) + tinfo_t.set_udm_type
set_struc_align
set_struc_cmttinfo_t(tid=...) + tinfo_t.set_type_cmt
set_struc_hidden
set_struc_idx
set_struc_listedset_type_choosable
set_struc_nametinfo_t(tid=...) + tinfo_t.rename_type
stroff_as_sizeida_typeinf.stroff_as_size
struct_field_visitor_tida_typeinf.tinfo_visitor_t
unsync_and_delete_struc
visit_stroff_fields
visit_stroff_udmsida_typeinf.visit_stroff_udms

Removed methods and members

member_t

  • by_til see ida_typeinf.udm_t.is_by_til
  • eoff
  • flag
  • get_size use ida_typeinf.udm_t.size // 8 instead.
  • get_soff see soff below.
  • has_ti
  • has_union
  • id
  • is_baseclass see ida_typeinf.udm_t.is_baseclass
  • is_destructor see ida_typeinf.udm_t.can_be_dtor
  • is_dupname
  • props
  • soff use ida_typeinf.udm_t.offset // 8 instead.
  • this
  • thisown
  • unimem

struct_t

  • age
  • from_til
  • get_alignment
  • get_last_member
  • get_member
  • has_union see ida_typeinf.tinfo_t.has_union
  • id see ida_typeinf.tinfo_t.get_tid
  • is_choosable
  • is_copyof
  • is_frame see ida_typeinf.tinfo_t.is_frame
  • is_ghost
  • is_hidden
  • is_mappedto
  • is_synced
  • is_union see ida_typeinf.tinfo_t.is_union
  • is_varstr see ida_typeinf.tinfo_t.is_varstruct
  • like_union
  • members
  • memqty see ida_typeinf.tinfo_t.get_udt_nmembers
  • ordinal see ida_typeinf.tinfo_t.get_ordinal
  • props
  • set_alignment
  • thisown

struct_field_visitor_t

  • visit_field

udm_visitor_t

  • visit_udm

ida_enum

Removed functions

The functions below 8.4 are removed those under 9.0 are alternatives.

The idc alternatives are based on:

  • ida_typeinf module
  • ida_typeinf.tinfo_t, the type info class
  • ida_typeinf.enum_type_data_t, the enumeration type class
  • ida_typeinf.edm_t, the enumeration member class
8.49.0
add_enumidc.add_enum
add_enum_memberidc.add_enum_member
del_enumidc.del_enum
del_enum_memberidc.del_enum_member
for_all_enum_members
get_bmask_cmtidc.get_bmask_cmt
get_bmask_nameidc.get_bmask_name
get_enumidc.get_enum
get_enum_cmtidc.get_enum_cmt
get_enum_flagidc.get_enum_flag
get_enum_idx
get_enum_memberidc.get_enum_member
get_enum_member_bmaskidc.get_enum_member_bmask
get_enum_member_by_nameidc.get_enum_member_by_name
get_enum_member_cmtidc.get_enum_member_cmt
get_enum_member_enumidc.get_enum_member_enum
get_enum_member_nameidc.get_enum_member_name
get_enum_member_serial
get_enum_member_valueidc.get_enum_member_value
get_enum_nameidc.get_enum_name
get_enum_name2
get_enum_qty
get_enum_sizeidc.get_enum_size
get_enum_type_ordinal
get_enum_widthidc.get_enum_width
get_first_bmaskidc.get_first_bmask
get_first_enum_memberidc.get_first_enum_member
get_first_serial_enum_member
get_last_bmaskidc.get_last_bmask
get_last_enum_memberidc.get_last_enum_member
get_last_serial_enum_member
get_next_bmaskidc.get_next_bmask
get_next_enum_memberidc.get_next_enum_member
get_next_serial_enum_member
get_prev_bmaskidc.get_prev_bmask
get_prev_enum_memberidc.get_prev_enum_member
get_prev_serial_enum_member
getn_enum
is_bfidc.is_bf
is_enum_fromtil
is_enum_hidden
is_ghost_enum
is_one_bit_mask
set_bmask_cmtidc.set_bmask_cmt
set_bmask_nameidc.set_bmask_name
set_enum_bfidc.set_enum_bf
set_enum_cmtidc.set_enum_cmt
set_enum_flagidc.set_enum_flag
set_enum_fromtil
set_enum_ghost
set_enum_hidden
set_enum_idx
set_enum_member_cmtidc.set_enum_member_cmt
set_enum_member_nameidc.set_enum_member_name
set_enum_nameidc.set_enum_name
set_enum_type_ordinal
set_enum_widthidc.set_enum_width

enum_member_visitor_t

  • visit_enum_member

ida_typeinf

Removed functions

  • callregs_t_regcount
  • get_ordinal_from_idb_type
  • is_autosync
  • get_udm_tid: use tinfo_t.get_udm_tid as an alternative.
  • get_tinfo_tid: use tinfo_t.get_tid as an alternative.
  • tinfo_t_get_stock
  • get_ordinal_qty: use ida_typeinf.get_ordinal_count or ida_typeinf.get_ordinal_limit as alternatives.
  • import_type: use idc.import_type as an alternative.

Added functions

  • detach_tinfo_t(_this: "tinfo_t") -> "bool"
  • get_tinfo_by_edm_name(tif: "tinfo_t", til: "til_t", mname: "char const *") -> "ssize_t"
  • stroff_as_size(plen: "int", tif: "tinfo_t", value: "asize_t") -> "bool"
  • visit_stroff_udms(sfv: "udm_visitor_t", path: "tid_t const *", disp: "adiff_t *", appzero: "bool") -> "adiff_t *"
  • is_one_bit_mask(mask: "uval_t") -> "bool"
  • get_idainfo_by_udm(flags: "flags64_t *", ti: "opinfo_t", set_lzero: "bool *", ap: "array_parameters_t", udm: "udm_t") -> "bool"

Added class

udm_visitor_t

  • visit_udm

Removed methods

enum_type_data_t

  • get_constant_group

Added methods

callregs_t

  • set_registers(self, kind: "callregs_t::reg_kind_t", first_reg: "int", last_reg: "int") -> "void"

enum_type_data_t

  • all_constants(self)
  • all_groups(self, skip_trivial=False)
  • get_constant_group(self, *args) -> "PyObject *"
  • get_max_serial(self, value: "uint64") -> "uchar"
  • get_serial(self, index: "size_t") -> "uchar"

func_type_data_t.

  • find_argument(self, *args) -> "ssize_t"

til_t

  • find_base(self, n: "char const *") -> "til_t *"
  • get_type_names(self) -> "const char *"

tinfo_t

  • detach(self) -> "bool"
  • is_punknown(self) -> "bool"
  • get_enum_nmembers(self) -> "size_t"
  • is_empty_enum(self) -> "bool"
  • get_enum_width(self) -> "int"
  • calc_enum_mask(self) -> "uint64"
  • get_edm_tid(self, idx: "size_t") -> "tid_t"
  • is_udm_by_til(self, idx: "size_t") -> "bool"
  • set_udm_by_til(self, idx: "size_t", on: "bool"=True, etf_flags: "uint"=0) -> "tinfo_code_t"
  • set_fixed_struct(self, on: "bool"=True) -> "tinfo_code_t"
  • set_struct_size(self, new_size: "size_t") -> "tinfo_code_t"
  • is_fixed_struct(self) -> "bool"
  • get_func_frame(self, pfn: "func_t const *") -> "bool"
  • is_frame(self) -> "bool"
  • get_frame_func(self) -> "ea_t"
  • set_enum_radix(self, radix: "int", sign: "bool", etf_flags: "uint"=0) -> "tinfo_code_t"
  • rename_funcarg(self, index: "size_t", name: "char const *", etf_flags: "uint"=0) -> "tinfo_code_t"
  • set_funcarg_type(self, index: "size_t", tif: "tinfo_t", etf_flags: "uint"=0) -> "tinfo_code_t"
  • set_func_rettype(self, tif: "tinfo_t", etf_flags: "uint"=0) -> "tinfo_code_t"
  • del_funcargs(self, idx1: "size_t", idx2: "size_t", etf_flags: "uint"=0) -> "tinfo_code_t"
  • del_funcarg(self, idx: "size_t", etf_flags: "uint"=0) -> "tinfo_code_t"
  • add_funcarg(self, farg: "funcarg_t", etf_flags: "uint"=0, idx: "ssize_t"=-1) -> "tinfo_code_t"
  • set_func_cc(self, cc: "cm_t", etf_flags: "uint"=0) -> "tinfo_code_t"
  • set_funcarg_loc(self, index: "size_t", argloc: "argloc_t", etf_flags: "uint"=0) -> "tinfo_code_t"
  • set_func_retloc(self, argloc: "argloc_t", etf_flags: "uint"=0) -> "tinfo_code_t"
  • get_stkvar(self, insn: "insn_t const &", x: "op_t const", v: "sval_t") -> "ssize_t"

udm_t

  • is_retaddr(self) -> "bool"
  • is_savregs(self) -> "bool"
  • is_special_member(self) -> "bool"
  • is_by_til(self) -> "bool"
  • set_retaddr(self, on: "bool"=True) -> "void"
  • set_savregs(self, on: "bool"=True) -> "void
  • set_by_til(self, on: "bool"=True) -> "void"

udtmembervec_t

  • set_fixed(self, on: "bool"=True) -> "void"

Modified methods:

tinfo_t

8.49.0
find_udm(self, udm: "udmt_t *", strmem_flags: "int") -> "int"find_udm(self, udm: "udmt_t *", strmem_flags: "int") -> "int"
find_udm(self, name: "char const *", strmem_flags: "int") -> "int"
get_type_by_edm_name(self, mname: "const char *", til: "til_t"=None) -> "bool"get_edm_by_name(self, mname: "char const *", til: "til_t"=None) -> "ssize_t"

ida_frame

8.4 To access the structure of a function frame, use:

  • get_struc() (use func_t::frame as structure ID)
  • get_frame(const func_t *pfn)
  • get_frame(ea_t ea)

9.0 To access the structure of a function frame, use:

  • tinfo_t::get_func_frame(const func_t *pfn) as the preferred way.
  • get_func_frame(tinfo_t *out, const func_t *pfn)

Removed functions

  • get_stkvar: see tinfo_t
  • get_frame: see tinfo_t.get-func_frame
  • get_frame_member_by_id
  • get_min_spd_ea
  • delete_unreferenced_stkvars
  • delete_wrong_stkvar_ops

Added functions

  • get_func_frame(out: "tinfo_t",pfn: "func_t const *") -> "bool"
  • add_frame_member(pfn: "func_t const *", name: "char const *", offset: "uval_t", tif: "tinfo_t", repr: "value_repr_t"=None, etf_flags: "uint"=0) -> "bool"
  • is_anonymous_member_name(name: "char const *") -> "bool"
  • is_dummy_member_name(name: "char const *") -> "bool"
  • is_special_frame_member(tid: "tid_t") -> "bool"
  • set_frame_member_type(pfn: "func_t const *",offset: "uval_t", tif: "tinfo_t", repr: "value_repr_t"=None, etf_flags: "uint"=0) -> "bool"
  • delete_frame_members(pfn: "func_t const *",start_offset: "uval_t", end_offset: "uval_t") -> "bool"
  • calc_frame_offset(pfn: "func_t *", off: "sval_t", insn: "insn_t const *"=None, op: "op_t const *"=None) -> "sval_t"

Modified functions

8.49.0
define_stkvar(pfn: "func_t *", name: "const char *", off: "sval_t", flags: "flags64_t", ti: "const opinfo_t *", nbytes: "asize_t") -> booldefine_stkvar(pfn: "func_t *", name: "char const *", off: "sval_t", tif: "tinfo_t", repr: "value_repr_t"=None) -> "bool"

ida_bytes

Removed functions

  • free_chunck
  • get_8bit

Added functions

  • find_bytes(bs: typing.Union[bytes, bytearray, str], range_start: int, range_size: typing.Optional[int] = None, range_end: typing.Optional[int] = ida_idaapi.BADADDR, mask: typing.Optional[typing.Union[bytes, bytearray]] = None, flags: typing.Optional[int] = BIN_SEARCH_FORWARD | BIN_SEARCH_NOSHOW, radix: typing.Optional[int] = 16, strlit_encoding: typing.Optional[typing.Union[int, str]] = PBSENC_DEF1BPU) -> int
  • find_string(_str: str, range_start: int, range_end: typing.Optional[int] = ida_idaapi.BADADDR, range_size: typing.Optional[int] = None, strlit_encoding: typing.Optional[typing.Union[int, str]] = PBSENC_DEF1BPU, flags: typing.Optional[int] = BIN_SEARCH_FORWARD | BIN_SEARCH_NOSHOW) -> int

Modified functions

8.49.0
op_enum(ea: "ea_t", n: "int", id: "enum_t", serial: "uchar"=0) -> "bool"op_enum(ea: "ea_t", n: "int", id: "tid_t", serial: "uchar"=0) -> "bool"
get_enum_id(ea: "ea_t", n: "int") -> "tid_t"get_enum_id(ea: "ea_t", n: "int") -> "enum_t"
parse_binpat_str(out: "compiled_binpat_vec_t", ea: "ea_t", _in: "char const *", radix: "int", strlits_encoding: "int"=0) -> "str"parse_binpat_str(out: "compiled_binpat_vec_t", ea: "ea_t", _in: "char const *", radix: "int", strlits_encoding: "int"=0) -> "bool"
bin_search3(start_ea: "ea_t", end_ea: "ea_t", data: "compiled_binpat_vec_t", flags: "int) -> ea_tbin_search(start_ea: "ea_t", end_ea: "ea_t", data: "compiled_binpat_vec_t const &", flags: "int") -> (ea_t, size_t)
bin_search(start_ea: "ea_t", end_ea: "ea_t", image: "uchar const *", mask: "uchar const *", len: "size_t", flags: "int") -> ea_t
get_octet2(ogen: "octet_generator_t") -> "uchar_t*"get_octet(ogen: "octet_generator_t") -> "uchar_t*"

idc

Removed functions

ida_dirtree

Removed functions

  • dirtree_cursor_root_cursor
  • dirtree_t_errstr

ida_diskio

Removed functions

  • enumerate_files2
  • eclose

ida_fpro

Added functions

  • qflcose(fp: "FILE *") -> "int"

ida_funcs

Added methods

func_item_iterator_t

  • set_ea(self, _ea: "ea_t") -> "bool"

ida_gdl

Added classes

edge_t

edgevec_t

node_ordering_t

  • clear(self)
  • resize(self, n: "int") -> "void"
  • size(self) -> "size_t"
  • set(self, _node: "int", num: "int") -> "void"
  • clr(self, _node: "int") -> "bool"
  • node(self, _order: "size_t") -> "int"
  • order(self, _node: "int") -> "int"

ida_graph

Removed classes

node_ordering_t

See ida-gdl node_ordering_t has been made an alias of ida_gdl.node_ordering_t

edge_t

See ida-gdl edge_t has been made an alias of ida_gdl.edge_t

Renamed clases

8.49.0
abstract_graph_tdrawable_graph_t
mutable_graph_tinteractive_graph_t

abstract_graph_t has been made an alias of drawable_graph_t mutbale_graph_t has been made an alias of interactive_graph_t

Renamed functions

8.49.0
create_mutable_graphcreate_interactive_graph
delete_mutable_graphdelete_interactive_graph
grcode_create_mutable_graphgrcode_create_interactive_graph

create_mutable_graph has been made an alias of create_interactive_graph delete_mutable_graph has been made an alias of delete_interactive_graph grcode_create_mutable_graph has been made an alias of grcode_create_interactive_graph

ida_hexrays

Removed functions

  • get_member_type
  • checkout_hexrays_license
  • cinsn_t_insn_is_epilog

Modified functions

8.49.0
save_user_labels2(func_ea: "ea_t", user_labels: "user_labels_t", func: "cfunc_t"=None) -> "void"save_user_labels(func_ea: "ea_t", user_labels: "user_labels_t", func: "cfunc_t"=None) -> "void"
restore_user_labels2(func_ea: "ea_t", func: "cfunc_t"=None) -> "user_labels_t *"restore_user_labels(func_ea: "ea_t", func: "cfunc_t"=None) -> "user_labels_t *"

Added functions

  • max_vlr_value(size: "int") -> "uvlr_t"
  • min_vlr_svalue(size: "int") -> "uvlr_t"
  • max_vlr_svalue(size: "int") -> "uvlr_t"
  • is_unsigned_cmpop(cmpop: "cmpop_t") -> "bool"
  • is_signed_cmpop(cmpop: "cmpop_t") -> "bool"
  • is_cmpop_with_eq(cmpop: "cmpop_t") -> "bool"
  • is_cmpop_without_eq(cmpop: "cmpop_t") -> "bool"

Added classes

  • catchexpr_t
  • ccatch_t
  • ctry_t
  • cthrow_t
  • cblock_pos_t

Removed methods

vdui_t

  • set_strmem_type
  • rename_strmem

Added methods

cinsn_list_t

  • splice(self, pos: "qlist< cinsn_t >::iterator", other: "cinsn_list_t", first: "qlist< cinsn_t >::iterator", last: "qlist< cinsn_t >::iterator") -> "void"

Hexrays_Hooks

  • pre_structural(self, ct: "control_graph_t *", cfunc: "cfunc_t", g: "simple_graph_t") -> "int"
  • begin_inlining(self, cdg: "codegen_t", decomp_flags: "int") -> "int"
  • inlining_func(self, cdg: "codegen_t", blk: "int", mbr: "mba_ranges_t") -> "int"
  • inlined_func(self, cdg: "codegen_t", blk: "int", mbr: "mba_ranges_t", i1: "int", i2: "int") -> "int"
  • collect_warnings(self, warnings: "qstrvec_t *", cfunc: "cfunc_t") -> "int"

lvar_t

  • was_scattered_arg(self) -> "bool"
  • set_scattered_arg(self) -> "void"
  • clr_scattered_arg(self) -> "void"

lvars_t

  • find_input_reg(self, reg: "int", _size: "int"=1) -> "int"

simple_graph_t

  • compute_dominators(self, domin: "array_of_node_bitset_t &", post: "bool"=False) -> "void"
  • compute_immediate_dominators(self, domin: "array_of_node_bitset_t const &", idomin: "intvec_t", post: "bool"=False) -> "void"
  • depth_first_preorder(self, pre: "node_ordering_t") -> "int"
  • depth_first_postorder(self, post: "node_ordering_t") -> "int"
  • begin(self) -> "simple_graph_t::iterator"
  • end(self) -> "simple_graph_t::iterator"
  • front(self) -> "int"
  • inc(self, p: "simple_graph_t::iterator &", n: "int"=1) -> "void"
  • goup(self, node: "int") -> "int"

fnumber_t

  • calc_max_exp(self) -> "int"
  • is_nan(self) -> "bool"

minsn_t

  • was_unpaired(self) -> "bool"

mba_t

  • split_block(self, blk: "mblock_t", start_insn: "minsn_t") -> "mblock_t *"
  • inline_func(self, cdg: "codegen_t", blknum: "int", ranges: "mba_ranges_t", decomp_flags: "int"=0, inline_flags: "int"=0) -> "merror_t"
  • locate_stkpnt(self, ea: "ea_t") -> "stkpnt_t const *"

codegen_t

  • clear(self) -> "void"

Modified methods

Hexrays_Hooks

8.49.0
flowchart(self, fc: "qflow_chart_t") -> "int"flowchart(self, fc: "qflow_chart_t", mba: "mba_t") -> "int"

valrng_t

8.49.0
cvt_to_cmp(self, strict: "bool") -> "bool"cvt_to_cmp(self) -> "bool"
max_value(self, size_ : "int") -> "uvlr_t"max_value(self) -> "uvlr_t"
min_svalue(self, size_: "int") -> "uvlr_t"min_svalue(self) -> "uvlr_t"
max_svalue(self, size_: "int") -> "uvlr_t"max_svalue(self) -> "uvlr_t"

stkvar_ref_t

8.49.0
get_stkvar(self, p_off=None: "uval_t *") -> "member_t *"get_stkvar(self, udm: "udm_t"=None, p_off: "uval_t *"=None) -> "ssize_t"

mop_t

8.49.0
get_stkvar(self, p_off: "uval_t *") -> "member_t *"get_stkvar(self, udm: "udm_t"=None, p_off: "uval_t *"=None) -> "ssize_t"

ida_ida

Added classes

idbattr_valmap_t

idbattr_info_t

  • is_node_altval(self) -> "bool"
  • is_node_supval(self) -> "bool"
  • is_node_valobj(self) -> "bool"
  • is_node_blob(self) -> "bool"
  • is_node_var(self) -> "bool"
  • is_struc_field(self) -> "bool"
  • is_cstr(self) -> "bool"
  • is_qstring(self) -> "bool"
  • is_bytearray(self) -> "bool"
  • is_buf_var(self) -> "bool"
  • is_decimal(self) -> "bool"
  • is_hexadecimal(self) -> "bool"
  • is_readonly_var(self) -> "bool"
  • is_incremented(self) -> "bool"
  • is_val_mapped(self) -> "bool"
  • is_hash(self) -> "bool"
  • use_hlpstruc(self) -> "bool"
  • is_bitmap(self) -> "bool"
  • is_onoff(self) -> "bool"
  • is_scalar_var(self) -> "bool"
  • is_bitfield(self) -> "bool"
  • is_boolean(self) -> "bool"
  • has_individual_node(self) -> "bool"
  • str_true(self) -> "char const *"
  • str_false(self) -> "char const *"
  • ridx(self) -> "size_t"
  • hashname(self) -> "char const *"

inf_structure accessors

As will be shown in ida_idaapi Removed functions get_inf_structure has been removed. It has been replaced by the following accessors.

Replacement examples:

In 8.4In 9.0
ida_idaapi.get_inf_structure().procnameida_ida.inf_get_procname()
ida_idaapi.get_inf_structure().max_eaida_ida.inf_get_max_ea()
ida_idaapi.get_inf_structure().is_32bit()ida_ida.inf_is_32bit_exactly()

The list of getters and setters is given below.

inf_structure getters

  • inf_get_version() -> "ushort"
  • inf_get_genflags() -> "ushort"
  • inf_get_lflags() -> "uint32"
  • inf_get_app_bitness() -> "uint"
  • inf_get_database_change_count() -> "uint32"
  • inf_get_filetype() -> "filetype_t"
  • inf_get_ostype() -> "ushort"
  • inf_get_apptype() -> "ushort"
  • inf_get_asmtype() -> "uchar"
  • inf_get_specsegs() -> "uchar"
  • inf_get_af() -> "uint32"
  • inf_get_af2() -> "uint32"
  • inf_get_baseaddr() -> "uval_t"
  • inf_get_start_ss() -> "sel_t"
  • inf_get_start_cs() -> "sel_t"
  • inf_get_start_ip() -> "ea_t"
  • inf_get_start_ea() -> "ea_t"
  • inf_get_start_sp() -> "ea_t"
  • inf_get_main() -> "ea_t"
  • inf_get_min_ea() -> "ea_t"
  • inf_get_max_ea() -> "ea_t"
  • inf_get_omin_ea() -> "ea_t"
  • inf_get_omax_ea() -> "ea_t"
  • inf_get_lowoff() -> "ea_t"
  • inf_get_highoff() -> "ea_t"
  • inf_get_maxref() -> "uval_t"
  • inf_get_netdelta() -> "sval_t"
  • inf_get_xrefnum() -> "uchar"
  • inf_get_type_xrefnum() -> "uchar"
  • inf_get_refcmtnum() -> "uchar"
  • inf_get_xrefflag() -> "uchar"
  • inf_get_max_autoname_len() -> "ushort"
  • inf_get_nametype() -> "char"
  • inf_get_short_demnames() -> "uint32"
  • inf_get_long_demnames() -> "uint32"
  • inf_get_demnames() -> "uchar"
  • inf_get_listnames() -> "uchar"
  • inf_get_indent() -> "uchar"
  • inf_get_cmt_indent() -> "uchar"
  • inf_get_margin() -> "ushort"
  • inf_get_lenxref() -> "ushort"
  • inf_get_outflags() -> "uint32"
  • inf_get_cmtflg() -> "uchar"
  • inf_get_limiter() -> "uchar"
  • inf_get_bin_prefix_size() -> "short"
  • inf_get_prefflag() -> "uchar"
  • inf_get_strlit_flags() -> "uchar"
  • inf_get_strlit_break() -> "uchar"
  • inf_get_strlit_zeroes() -> "char"
  • inf_get_strtype() -> "int32"
  • inf_get_strlit_sernum() -> "uval_t"
  • inf_get_datatypes() -> "uval_t"
  • inf_get_abibits() -> "uint32"
  • inf_get_appcall_options() -> "uint32"
  • inf_get_privrange_start_ea() -> "ea_t"
  • inf_get_privrange_end_ea() -> "ea_t"
  • inf_get_cc_id() -> "comp_t"
  • inf_get_cc_cm() -> "cm_t"
  • inf_get_cc_size_i() -> "uchar"
  • inf_get_cc_size_b() -> "uchar"
  • inf_get_cc_size_e() -> "uchar"
  • inf_get_cc_defalign() -> "uchar"
  • inf_get_cc_size_s() -> "uchar"
  • inf_get_cc_size_l() -> "uchar"
  • inf_get_cc_size_ll() -> "uchar"
  • inf_get_cc_size_ldbl() -> "uchar"
  • inf_get_procname() -> "size_t"
  • inf_get_strlit_pref() -> "size_t"
  • inf_get_cc(out: "compiler_info_t") -> "bool"
  • inf_get_privrange(*args) -> "range_t"
  • inf_get_af_low() -> "ushort"
  • inf_get_af_high() -> "ushort"
  • inf_get_af2_low() -> "ushort"
  • inf_get_pack_mode() -> "int"
  • inf_get_demname_form() -> "uchar"
  • inf_is_auto_enabled() -> "bool"
  • inf_is_graph_view() -> "bool"
  • inf_is_32bit_or_higher() -> "bool"
  • inf_is_32bit_exactly() -> "bool"
  • inf_is_16bit() -> "bool"
  • inf_is_64bit() -> "bool"
  • inf_is_dll() -> "bool"
  • inf_is_flat_off32() -> "bool"
  • inf_is_be() -> "bool"
  • inf_is_wide_high_byte_first() -> "bool"
  • inf_is_snapshot() -> "bool"
  • inf_is_kernel_mode() -> "bool"
  • inf_is_limiter_thin() -> "bool"
  • inf_is_limiter_thick() -> "bool"
  • inf_is_limiter_empty() -> "bool"
  • inf_is_mem_aligned4() -> "bool"
  • inf_is_hard_float() -> "bool"
  • inf_abi_set_by_user() -> "bool"
  • inf_allow_non_matched_ops() -> "bool"
  • inf_allow_sigmulti() -> "bool"
  • inf_append_sigcmt() -> "bool"
  • inf_big_arg_align(*args) -> "bool"
  • inf_check_manual_ops() -> "bool"
  • inf_check_unicode_strlits() -> "bool"
  • inf_coagulate_code() -> "bool"
  • inf_coagulate_data() -> "bool"
  • inf_compress_idb() -> "bool"
  • inf_create_all_xrefs() -> "bool"
  • inf_create_func_from_call() -> "bool"
  • inf_create_func_from_ptr() -> "bool"
  • inf_create_func_tails() -> "bool"
  • inf_create_jump_tables() -> "bool"
  • inf_create_off_on_dref() -> "bool"
  • inf_create_off_using_fixup() -> "bool"
  • inf_create_strlit_on_xref() -> "bool"
  • inf_data_offset() -> "bool"
  • inf_dbg_no_store_path() -> "bool"
  • inf_decode_fpp() -> "bool"
  • inf_del_no_xref_insns() -> "bool"
  • inf_final_pass() -> "bool"
  • inf_full_sp_ana() -> "bool"
  • inf_gen_assume() -> "bool"
  • inf_gen_lzero() -> "bool"
  • inf_gen_null() -> "bool"
  • inf_gen_org() -> "bool"
  • inf_huge_arg_align(cc: cm_t) -> "bool"
  • inf_like_binary() -> "bool":
  • inf_line_pref_with_seg() -> "bool"
  • inf_loading_idc() -> "bool"
  • inf_macros_enabled() -> "bool"
  • inf_map_stkargs() -> "bool"
  • inf_mark_code() -> "bool"
  • inf_merge_strlits() -> "bool"
  • inf_no_store_user_info() -> "bool"
  • inf_noflow_to_data() -> "bool"
  • inf_noret_ana() -> "bool"
  • inf_op_offset() -> "bool"
  • inf_pack_idb() -> "bool"
  • inf_pack_stkargs(*args) -> "bool"
  • inf_prefix_show_funcoff() -> "bool"
  • inf_prefix_show_segaddr() -> "bool"
  • inf_prefix_show_stack() -> "bool"
  • inf_prefix_truncate_opcode_bytes() -> "bool"
  • inf_propagate_regargs() -> "bool"
  • inf_propagate_stkargs() -> "bool"
  • inf_readonly_idb() -> "bool"
  • inf_rename_jumpfunc() -> "bool"
  • inf_rename_nullsub() -> "bool"
  • inf_should_create_stkvars() -> "bool"
  • inf_should_trace_sp() -> "bool"
  • inf_show_all_comments() -> "bool"
  • inf_show_auto() -> "bool"
  • inf_show_hidden_funcs() -> "bool"
  • inf_show_hidden_insns() -> "bool"
  • inf_show_hidden_segms() -> "bool"
  • inf_show_line_pref() -> "bool"
  • inf_show_repeatables() -> "bool"
  • inf_show_src_linnum() -> "bool"
  • inf_show_void() -> "bool"
  • inf_show_xref_fncoff() -> "bool"
  • inf_show_xref_seg() -> "bool"
  • inf_show_xref_tmarks() -> "bool"
  • inf_show_xref_val() -> "bool"
  • inf_stack_ldbl() -> "bool"
  • inf_stack_varargs() -> "bool"
  • inf_strlit_autocmt() -> "bool"
  • inf_strlit_name_bit() -> "bool"
  • inf_strlit_names() -> "bool"
  • inf_strlit_savecase() -> "bool"
  • inf_strlit_serial_names() -> "bool"
  • inf_test_mode() -> "bool"
  • inf_trace_flow() -> "bool"
  • inf_truncate_on_del() -> "bool"
  • inf_unicode_strlits() -> "bool"
  • inf_use_allasm() -> "bool"
  • inf_use_flirt() -> "bool"
  • inf_use_gcc_layout() -> "bool"

inf_structure setters

  • inf_set_allow_non_matched_ops(_v: "bool"=True) -> "bool"
  • inf_set_graph_view(_v: "bool"=True) -> "bool"
  • inf_set_lflags(_v: "uint32") -> "bool"
  • inf_set_decode_fpp(_v: "bool"=True) -> "bool"
  • inf_set_32bit(_v: "bool"=True) -> "bool"
  • inf_set_64bit(_v: "bool"=True) -> "bool"
  • inf_set_dll(_v: "bool"=True) -> "bool"
  • inf_set_flat_off32(_v: "bool"=True) -> "bool"
  • inf_set_be(_v: "bool"=True) -> "bool"
  • inf_set_wide_high_byte_first(_v: "bool"=True) -> "bool"
  • inf_set_dbg_no_store_path(_v: "bool"=True) -> "bool"
  • inf_set_snapshot(_v: "bool"=True) -> "bool"
  • inf_set_pack_idb(_v: "bool"=True) -> "bool"
  • inf_set_compress_idb(_v: "bool"=True) -> "bool"
  • inf_set_kernel_mode(_v: "bool"=True) -> "bool"
  • inf_set_app_bitness(bitness: "uint") -> "void"
  • inf_set_database_change_count(_v: "uint32") -> "bool"
  • inf_set_filetype(_v: "filetype_t") -> "bool"
  • inf_set_ostype(_v: "ushort") -> "bool"
  • inf_set_apptype(_v: "ushort") -> "bool"
  • inf_set_asmtype(_v: "uchar") -> "bool"
  • inf_set_specsegs(_v: "uchar") -> "bool"
  • inf_set_af(_v: "uint32") -> "bool"
  • inf_set_trace_flow(_v: "bool"=True) -> "bool"
  • inf_set_mark_code(_v: "bool"=True) -> "bool"
  • inf_set_create_jump_tables(_v: "bool"=True) -> "bool"
  • inf_set_noflow_to_data(_v: "bool"=True) -> "bool"
  • inf_set_create_all_xrefs(_v: "bool"=True) -> "bool"
  • inf_set_del_no_xref_insns(_v: "bool"=True) -> "bool"
  • inf_set_create_func_from_ptr(_v: "bool"=True) -> "bool"
  • inf_set_create_func_from_call(_v: "bool"=True) -> "bool"
  • inf_set_create_func_tails(_v: "bool"=True) -> "bool"
  • inf_set_should_create_stkvars(_v: "bool"=True) -> "bool"
  • inf_set_propagate_stkargs(_v: "bool"=True) -> "bool"
  • inf_set_propagate_regargs(_v: "bool"=True) -> "bool"
  • inf_set_should_trace_sp(_v: "bool"=True) -> "bool"
  • inf_set_full_sp_ana(_v: "bool"=True) -> "bool"
  • inf_set_noret_ana(_v: "bool"=True) -> "bool"
  • inf_set_guess_func_type(_v: "bool"=True) -> "bool"
  • inf_set_truncate_on_del(_v: "bool"=True) -> "bool"
  • inf_set_create_strlit_on_xref(_v: "bool"=True) -> "bool"
  • inf_set_check_unicode_strlits(_v: "bool"=True) -> "bool"
  • inf_set_create_off_using_fixup(_v: "bool"=True) -> "bool"
  • inf_set_create_off_on_dref(_v: "bool"=True) -> "bool"
  • inf_set_op_offset(_v: "bool"=True) -> "bool"
  • inf_set_data_offset(_v: "bool"=True) -> "bool"
  • inf_set_use_flirt(_v: "bool"=True) -> "bool"
  • inf_set_append_sigcmt(_v: "bool"=True) -> "bool"
  • inf_set_allow_sigmulti(_v: "bool"=True) -> "bool"
  • inf_set_hide_libfuncs(_v: "bool"=True) -> "bool"
  • inf_set_rename_jumpfunc(_v: "bool"=True) -> "bool"
  • inf_set_rename_nullsub(_v: "bool"=True) -> "bool"
  • inf_set_coagulate_data(_v: "bool"=True) -> "bool"
  • inf_set_coagulate_code(_v: "bool"=True) -> "bool"
  • inf_set_final_pass(_v: "bool"=True) -> "bool"
  • inf_set_af2(_v: "uint32") -> "bool"
  • inf_set_handle_eh(_v: "bool"=True) -> "bool"
  • inf_set_handle_rtti(_v: "bool"=True) -> "bool"
  • inf_set_macros_enabled(_v: "bool"=True) -> "bool"
  • inf_set_merge_strlits(_v: "bool"=True) -> "bool"
  • inf_set_baseaddr(_v: "uval_t") -> "bool"
  • inf_set_start_ss(_v: "sel_t") -> "bool"
  • inf_set_start_cs(_v: "sel_t") -> "bool"
  • inf_set_start_ip(_v: "ea_t") -> "bool"
  • inf_set_start_ea(_v: "ea_t") -> "bool"
  • inf_set_start_sp(_v: "ea_t") -> "bool"
  • inf_set_main(_v: "ea_t") -> "bool"
  • inf_set_min_ea(_v: "ea_t") -> "bool"
  • inf_set_max_ea(_v: "ea_t") -> "bool"
  • inf_set_omin_ea(_v: "ea_t") -> "bool"
  • inf_set_omax_ea(_v: "ea_t") -> "bool"
  • inf_set_lowoff(_v: "ea_t") -> "bool"
  • inf_set_highoff(_v: "ea_t") -> "bool"
  • inf_set_maxref(_v: "uval_t") -> "bool"
  • inf_set_netdelta(_v: "sval_t") -> "bool"
  • inf_set_xrefnum(_v: "uchar") -> "bool"
  • inf_set_type_xrefnum(_v: "uchar") -> "bool"
  • inf_set_refcmtnum(_v: "uchar") -> "bool"
  • inf_set_xrefflag(_v: "uchar") -> "bool"
  • inf_set_show_xref_seg(_v: "bool"=True) -> "bool"
  • inf_set_show_xref_tmarks(_v: "bool"=True) -> "bool"
  • inf_set_show_xref_fncoff(_v: "bool"=True) -> "bool"
  • inf_set_show_xref_val(_v: "bool"=True) -> "bool"
  • inf_set_max_autoname_len(_v: "ushort") -> "bool"
  • inf_set_nametype(_v: "char") -> "bool"
  • inf_set_short_demnames(_v: "uint32") -> "bool"
  • inf_set_long_demnames(_v: "uint32") -> "bool"
  • inf_set_demnames(_v: "uchar") -> "bool"
  • inf_set_listnames(_v: "uchar") -> "bool"
  • inf_set_indent(_v: "uchar") -> "bool"
  • inf_set_cmt_indent(_v: "uchar") -> "bool"
  • inf_set_margin(_v: "ushort") -> "bool"
  • inf_set_lenxref(_v: "ushort") -> "bool"
  • inf_set_outflags(_v: "uint32") -> "bool"
  • inf_set_show_void(_v: "bool"=True) -> "bool"
  • inf_set_show_auto(_v: "bool"=True) -> "bool"
  • inf_set_gen_null(_v: "bool"=True) -> "bool"
  • inf_set_show_line_pref(_v: "bool"=True) -> "bool"
  • inf_set_line_pref_with_seg(_v: "bool"=True) -> "bool"
  • inf_set_gen_lzero(_v: "bool"=True) -> "bool"
  • inf_set_gen_org(_v: "bool"=True) -> "bool"
  • inf_set_gen_assume(_v: "bool"=True) -> "bool"
  • inf_set_gen_tryblks(_v: "bool"=True) -> "bool"
  • inf_set_cmtflg(_v: "uchar") -> "bool"
  • inf_set_show_repeatables(_v: "bool"=True) -> "bool"
  • inf_set_show_all_comments(_v: "bool"=True) -> "bool"
  • inf_set_hide_comments(_v: "bool"=True) -> "bool"
  • inf_set_show_src_linnum(_v: "bool"=True) -> "bool"
  • inf_set_show_hidden_insns(_v: "bool"=True) -> "bool"
  • inf_set_show_hidden_funcs(_v: "bool"=True) -> "bool"
  • inf_set_show_hidden_segms(_v: "bool"=True) -> "bool"
  • inf_set_limiter(_v: "uchar") -> "bool"
  • inf_set_limiter_thin(_v: "bool"=True) -> "bool"
  • inf_set_limiter_thick(_v: "bool"=True) -> "bool"
  • inf_set_limiter_empty(_v: "bool"=True) -> "bool"
  • inf_set_bin_prefix_size(_v: "short") -> "bool"
  • inf_set_prefflag(_v: "uchar") -> "bool"
  • inf_set_prefix_show_segaddr(_v: "bool"=True) -> "bool"
  • inf_set_prefix_show_funcoff(_v: "bool"=True) -> "bool"
  • inf_set_prefix_show_stack(_v: "bool"=True) -> "bool"
  • inf_set_prefix_truncate_opcode_bytes(_v: "bool"=True) -> "bool"
  • inf_set_strlit_flags(_v: "uchar") -> "bool"
  • inf_set_strlit_names(_v: "bool"=True) -> "bool"
  • inf_set_strlit_name_bit(_v: "bool"=True) -> "bool"
  • inf_set_strlit_serial_names(_v: "bool"=True) -> "bool"
  • inf_set_unicode_strlits(_v: "bool"=True) -> "bool"
  • inf_set_strlit_autocmt(_v: "bool"=True) -> "bool"
  • inf_set_strlit_savecase(_v: "bool"=True) -> "bool"
  • inf_set_strlit_break(_v: "uchar") -> "bool"
  • inf_set_strlit_zeroes(_v: "char") -> "bool"
  • inf_set_strtype(_v: "int32") -> "bool"
  • inf_set_strlit_sernum(_v: "uval_t") -> "bool"
  • inf_set_datatypes(_v: "uval_t") -> "bool"
  • inf_set_abibits(_v: "uint32") -> "bool"
  • inf_set_mem_aligned4(_v: "bool"=True) -> "bool"
  • inf_set_pack_stkargs(_v: "bool"=True) -> "bool"
  • inf_set_big_arg_align(_v: "bool"=True) -> "bool"
  • inf_set_stack_ldbl(_v: "bool"=True) -> "bool"
  • inf_set_stack_varargs(_v: "bool"=True) -> "bool"
  • inf_set_hard_float(_v: "bool"=True) -> "bool"
  • inf_set_abi_set_by_user(_v: "bool"=True) -> "bool"
  • inf_set_use_gcc_layout(_v: "bool"=True) -> "bool"
  • inf_set_map_stkargs(_v: "bool"=True) -> "bool"
  • inf_set_huge_arg_align(_v: "bool"=True) -> "bool"
  • inf_set_appcall_options(_v: "uint32") -> "bool"
  • inf_set_privrange_start_ea(_v: "ea_t") -> "bool"
  • inf_set_privrange_end_ea(_v: "ea_t") -> "bool"
  • inf_set_cc_id(_v: "comp_t") -> "bool"
  • inf_set_cc_cm(_v: "cm_t") -> "bool"
  • inf_set_cc_size_i(_v: "uchar") -> "bool"
  • inf_set_cc_size_b(_v: "uchar") -> "bool"
  • inf_set_cc_size_e(_v: "uchar") -> "bool"
  • inf_set_cc_defalign(_v: "uchar") -> "bool"
  • inf_set_cc_size_s(_v: "uchar") -> "bool"
  • inf_set_cc_size_l(_v: "uchar") -> "bool"
  • inf_set_cc_size_ll(_v: "uchar") -> "bool"
  • inf_set_cc_size_ldbl(_v: "uchar") -> "bool"
  • inf_set_procname(*args) -> "bool"
  • inf_set_strlit_pref(*args) -> "bool"
  • inf_set_cc(_v: "compiler_info_t") -> "bool"
  • inf_set_privrange(_v: "range_t") -> "bool"
  • inf_set_af_low(saf: "ushort") -> "void"
  • inf_set_af_high(saf2: "ushort") -> "void"
  • inf_set_af2_low(saf: "ushort") -> "void"
  • inf_set_pack_mode(pack_mode: "int") -> "int"
  • inf_inc_database_change_count(cnt: "int"=1) -> "void"

ida_idaapi

Removed functions

ida_idd

Added functions

  • cpu2ieee(ieee_out: "fpvalue_t *", cpu_fpval: "void const *", size: "int") -> "int"
  • ieee2cpu(cpu_fpval: "void *", ieee_out: "fpvalue_t const &", size: "int") -> "int"

ida_idp

See also IDB events below.

Removed methods

_processor_t

  • has_realcvt

processor_t

  • get_uFlag

Modified methods

_processor_t

8.49.0
gen_stkvar_def(ctx: "outctx_t &", mptr: "member_t const *", v: : "sval_t") -> ssize_tgen_stkvar_def(ctx: "outctx_t &", mptr: "udm_t", v: "sval_t", tid: "tid_t") -> "ssize_t"

IDP_Hooks

8.49.0
ev_gen_stkvar_def(self, *args) -> "int"ev_gen_stkvar_def(self, outctx: "outctx_t *", stkvar: "udm_t", v: "sval_t", tid: "tid_t") -> "int"

Added methods

IDB_Hooks

  • lt_udm_created(self, udtname: "char const *", udm: "udm_t") -> "void"
  • lt_udm_deleted(self, udtname: "char const *", udm_tid: "tid_t", udm: "udm_t") -> "void"
  • lt_udm_renamed(self, udtname: "char const *", udm: "udm_t", oldname: "char const *") -> "void"
  • lt_udm_changed(self, udtname: "char const *", udm_tid: "tid_t", udmold: "udm_t", udmnew: "udm_t") -> "void"
  • lt_udt_expanded(self, udtname: "char const *", udm_tid: "tid_t", delta: "adiff_t") -> "void"
  • frame_created(self, func_ea: "ea_t") -> "void"
  • frame_udm_created(self, func_ea: "ea_t", udm: "udm_t") -> "void"
  • frame_udm_deleted(self, func_ea: "ea_t", udm_tid: "tid_t", udm: "udm_t") -> "void"
  • frame_udm_renamed(self, func_ea: "ea_t", udm: "udm_t", oldname: "char const *") -> "void"
  • frame_udm_changed(self, func_ea: "ea_t", udm_tid: "tid_t", udmold: "udm_t", udmnew: "udm_t") -> "void"
  • frame_expanded(self, func_ea: "ea_t", udm_tid: "tid_t", delta: "adiff_t") -> "void"

Removed functions

All the _processor_t functions have been removed from ida_idp.

ida_ieee

Removed methods

fpvalue_t

  • _get_10bytes
  • _set_10bytes

ida_kernwin

Removed functions

  • place_t_as_enumplace_t
  • place_t_as_structplace_t
  • open_enums_window
  • open_structs_window
  • choose_struc
  • choose_enum(title, default_id) -> "enum_t"
  • choose_enum_by_value(title, default_id, value, nbytes) -> "enum_t"

Modified function

  • place_t_as_idaplace_t has been made an alias of place_t.as_idaplace_t
  • place_t_as_simpleline_place_t has been made an alias of place_t.as_simpleline_place_t
  • place_t_as_tiplace_t has been made an alias of place_t.as_tiplace_t

Removed classes

  • enumplace_t
  • structplace_t

Removed methods

place_t

  • as_enumplace_t
  • as_structplace_t

twinpos_t

  • place_as_enumplace_t
  • place_as_structplace_t

tagged_line_sections_t

  • find_in

Added methods

tagged_line_sections_t

  • nearest_before(self, range: "tagged_line_section_t", start: "cpidx_t", tag: "color_t"=0) -> "tagged_line_section_t const *"
  • nearest_after(self, range: "tagged_line_section_t", start: "cpidx_t", tag: "color_t"=0) -> "tagged_line_section_t const *"

chooser_base_t

  • has_widget_lifecycle(self) -> "bool"

Added functions

  • is_ida_library(path: "char *", pathsize: "size_t", handle: "void **") -> "bool"

ida_lines

Removed functions

  • set_user_defined_prefix

ida_moved

Modified functions

  • bookmarks_t_mark has been made an alias of bookmarks_t.mark
  • bookmarks_t_get_desc has been made an alias of bookmarks_t.get_desc
  • bookmarks_t_find_index has been made an alias of bookmarks_t.find_index
  • bookmarks_t_size has been made an alias of bookmarks_t.size
  • bookmarks_t_erase has been made an alias of bookmarks_t.erase
  • bookmarks_t_get_dirtree_id has been made an alias of bookmarks_t.get_dirtree_id
  • bookmarks_t_get has been made an alias of bookmarks_t.get

ida_nalt

Removed functions

  • validate_idb_names

ida_netnode

Modified functions

  • netnode.exist has been made an alias of netnode.exist

ida_pro

Removed functions

  • uchar_array_frompointer
  • tid_array_frompointer
  • ea_array_frompointer
  • sel_array_frompointer
  • int_pointer_frompointer
  • sel_pointer_frompointer
  • ea_pointer_frompointer

See Added classes below

Added classes

plugin_options_t

  • erase(self, name: "char const *") -> "bool"

uchar_pointer

  • assign(self, value: "uchar") -> "void"
  • value(self) -> "uchar"
  • cast(self) -> "uchar *"
  • frompointer(t: "uchar *") -> "uchar_pointer *"

ushort_pointer

  • assign(self, value: "ushort") -> "void"
  • value(self) -> "ushort"
  • cast(self) -> "ushort *"
  • frompointer(t: "ushort *") -> "ushort_pointer *"

uint_pointer

  • assign(self, value: "uint") -> "void"
  • value(self) -> "uint"
  • cast(self) -> "uint *"
  • frompointer(t: "uint *") -> "uint_pointer *"

sint8_pointer

  • assign(self, value: "sint8") -> "void"
  • value(self) -> "sint8"
  • cast(self) -> "sint8 *"
  • frompointer(t: "sint8 *") -> "sint8_pointer *"

int8_pointer

  • assign(self, value: "int8") -> "void"
  • value(self) -> "int8"
  • cast(self) -> "int8 *"
  • frompointer(t: "int8 *") -> "int8_pointer *"

uint8_pointer

  • assign(self, value: "uint8") -> "void"
  • value(self) -> "uint8"
  • cast(self) -> "uint8 *"
  • frompointer(t: "uint8 *") -> "uint8_pointer *"

int16_pointer

  • assign(self, value: "int16") -> "void"
  • value(self) -> "int16"
  • cast(self) -> "int16 *"
  • frompointer(t: "int16 *") -> "int16_pointer *"

uint16_pointer

  • assign(self, value: "uint16") -> "void"
  • value(self) -> "uint16"
  • cast(self) -> "uint16 *"
  • frompointer(t: "uint16 *") -> "uint16_pointer *"

int32_pointer

  • assign(self, value: "int32") -> "void"
  • value(self) -> "int32"
  • cast(self) -> "int32 *"
  • frompointer(t: "int32 *") -> "int32_pointer *"

uint32_pointer

  • assign(self, value: "uint32") -> "void"
  • value(self) -> "uint32"
  • cast(self) -> "uint32 *"
  • frompointer(t: "uint32 *") -> "uint32_pointer *"

int64_pointer

  • assign(self, value: "int64") -> "void"
  • value(self) -> "int64"
  • cast(self) -> "int64 *"
  • frompointer(t: "int64 *") -> "int64_pointer *"

uint64_pointer

  • assign(self, value: "uint64") -> "void"
  • value(self) -> "uint64"
  • cast(self) -> "uint64 *"
  • frompointer(t: "uint64 *") -> "uint64_pointer *"

ssize_pointer

  • assign(self, value: "ssize_t") -> "void"
  • value(self) -> "ssize_t"
  • cast(self) -> "ssize_t *"
  • frompointer(t: "ssize_t *") -> "ssize_pointer *"

bool_pointer

  • assign(self, value: "bool") -> "void"
  • value(self) -> "bool"
  • cast(self) -> "bool *"
  • frompointer(t: "bool *") -> "bool_pointer *"

short_pointer

  • assign(self, value: "short") -> "void"
  • value(self) -> "short"
  • cast(self) -> "short *"
  • frompointer(t: "short *") -> "short_pointer *"

char_pointer

  • assign(self, value: "char") -> "void"
  • value(self) -> "char"
  • cast(self) -> "char *"
  • frompointer(t: "char *") -> "char_pointer *"

sel_pointer

  • assign(self, value: "sel_t") -> "void"
  • value(self) -> "sel_t"
  • cast(self) -> "sel_t *"
  • frompointer(t: "sel_t *") -> "sel_pointer *"

asize_pointer

  • assign(self, value: "asize_t") -> "void"
  • value(self) -> "asize_t"
  • cast(self) -> "asize_t *"
  • frompointer(t: "asize_t *") -> "asize_pointer *"

adiff_pointer

  • assign(self, value: "adiff_t") -> "void"
  • value(self) -> "adiff_t"
  • cast(self) -> "adiff_t *"
  • from_pointer(t: "adiff_t*") -> "adiff_pointer *"

uval_pointer

  • assign(self, value: "uval_t") -> "void"
  • value(self) -> "uval_t"
  • cast(self) -> "uval_t *"
  • frompointer(t: "uval_t *") -> "uval_pointer *"

ea32_pointer

  • assign(self, value: "ea32_t") -> "void"
  • value(self) -> "ea32_t"
  • cast(self) -> "ea32_t *"
  • frompointer(t: "ea32_t *") -> "ea32_pointer *"

ea64_pointer

  • assign(self, value: "ea64_t") -> "void"
  • value(self) -> "ea64_t"
  • cast(self) -> "ea64_t *"
  • frompointer(t: "ea64_t *") -> "ea64_pointer *"

flags_pointer

  • assign(self, value: "flags_t") -> "void"
  • value(self) -> "flags_t"
  • cast(self) -> "flags_t *"
  • frompointer(t: "flags_t *") -> "flags_pointer *"

flags64_pointer

  • assign(self, value: "flags64_t") -> "void"
  • value(self) -> "flags64_t"
  • cast(self) -> "flags64_t *"
  • frompointer(t: "flags64_t *") -> "flags64_pointer *"

tid_pointer

  • assign(self, value: "tid_t") -> "void"
  • value(self) -> "tid_t"
  • cast(self) -> "tid_t *"
  • frompointer(t: "tid_t *") -> "tid_pointer *"

Added functions

  • get_login_name() -> "qstring *"

ida_regfinder

Removed functions

  • reg_value_info_t_make_dead_end
  • reg_value_info_t_make_aborted
  • reg_value_info_t_make_badinsn
  • reg_value_info_t_make_unkinsn
  • reg_value_info_t_make_unkfunc
  • reg_value_info_t_make_unkloop
  • reg_value_info_t_make_unkmult
  • reg_value_info_t_make_num
  • reg_value_info_t_make_initial_sp

Modified functions

8.49.0
invalidate_regfinder_cache(ea: "ea_t") -> "void"invalidate_regfinder_cache(from=BADADDR: "ea_t", to=BADADDR: "ea_t") -> "void"

Added methods

reg_value_info_t

  • movt(self, r: "reg_value_info_t", insn: "insn_t const &") -> "void"

ida_registry

Removed functions

  • reg_load
  • reg_flush

Removed functions

  • find_binary

ida_ua

Removed Function

  • construct_macro(insn: "insn_t *", enable: "bool", build_macro: "PyObject *") -> bool (See [Modified functions](#modified-functions-4))

Modified functions

8.49.0
construct_macro2(_this: "macro_constructor_t *", insn: "insn_t *", enable: "bool") -> "bool"construct_macro(_this: "macro_constructor_t *", insn: "insn_t *", enable: "bool") -> "bool"

Added methods

macro_constructor_t

  • construct_macro(self, insn: "insn_t", enable: "bool") -> "bool"

idautils

Modified functions

8.49.0
Structs() -> [(idx, sid, name)]Structs() -> [(ordinal, sid, name)]
StructMembers(sid) -> [(offset, name, size)]StructMembers(sid) -> [(offset_in_bytes, name, size_in_bytes)]

IDB events

The following table provide a list of IDB events that have been replaced or, in some cases, removed.

Since 7In 9.0
truc_createdlocal_types_changed
deleting_strucnone
struc_deletedlocal_types_changed
changing_struc_alignnone
struc_align_changedlocal_types_changed
renaming_strucnone
struc_renamedlocal_types_changed
expanding_strucnone
struc_expandedlt_udt_expanded, frame_expanded, local_types_changed
struc_member_createdlt_udm_created, frame_udm_created, local_types_changed
deleting_struc_membernone
struc_member_deletedlt_udm_deleted, frame_udm_deleted, local_types_changed
renaming_struc_membernone
struc_member_renamedlt_udm_renamed, frame_udm_renamed, local_types_changed
changing_struc_membernone
struc_member_changedlt_udm_changed, frame_udm_changed, local_types_changed
changing_struc_cmtnone
struc_cmt_changedlocal_types_changed
enum_createdlocal_types_changed
deleting_enumnone
enum_deletedlocal_types_changed
renaming_enumnone
enum_renamedlocal_types_changed
changing_enum_bflocal_types_changed
enum_bf_changedlocal_types_changed
changing_enum_cmtnone
enum_cmt_changedlocal_types_changed
enum_member_createdlocal_types_changed
deleting_enum_membernone
enum_member_deletedlocal_types_changed
enum_width_changedlocal_types_changed
enum_flag_changedlocal_types_changed
enum_ordinal_changed`none

Type information error codes

Following is the list of error values returned by the type info module. It can also be found in typeinf.hpp in the IDASDK:

Error nameVal.Meaning
TERR_OK0ok
TERR_STABLE1it means no errors occurred but nothing has changed (this code is internal: should never be returned to caller) -*
TERR_SAVE_ERROR-1failed to save
TERR_SERIALIZE-2failed to serialize
TERR_BAD_NAME-3name is not acceptable
TERR_BAD_ARG-4bad argument
TERR_BAD_TYPE-5bad type
TERR_BAD_SIZE-6bad size
TERR_BAD_INDEX-7bad index
TERR_BAD_ARRAY-8arrays are forbidden as function arguments
TERR_BAD_BF-9bitfields are forbidden as function arguments
TERR_BAD_OFFSET-10bad member offset
TERR_BAD_UNIVAR-11unions cannot have variable sized members
TERR_BAD_VARLAST-12variable sized member must be the last member in the structure
TERR_OVERLAP-13the member overlaps with other members that cannot be deleted
TERR_BAD_SUBTYPE-14recursive structure nesting is forbidden
TERR_BAD_VALUE-15value is not acceptable
TERR_NO_BMASK-16bitmask is not found
TERR_BAD_BMASK-17Bad enum member mask. The specified mask should not intersect with any existing mask in the enum. Zero masks are prohibited too
TERR_BAD_MSKVAL-18bad bmask and value combination
TERR_BAD_REPR-19bad or incompatible field representation
TERR_GRP_NOEMPTY-20could not delete group mask for not empty group
TERR_DUPNAME-21duplicate name
TERR_UNION_BF-22unions cannot have bitfields
TERR_BAD_TAH-23bad bits in the type attributes (TAH bits)
TERR_BAD_BASE-24bad base class
TERR_BAD_GAP-25bad gap
TERR_NESTED-26recursive structure nesting is forbidden
TERR_NOT_COMPAT-27the new type is not compatible with the old type
TERR_BAD_LAYOUT-28failed to calculate the structure/union layout
TERR_BAD_GROUPS-29bad group sizes for bitmask enum
TERR_BAD_SERIAL-30enum value has too many serials
TERR_ALIEN_NAME-31enum member name is used in another enum
TERR_STOCK-32stock type info cannot be modified
TERR_ENUM_SIZE-33bad enum size
TERR_NOT_IMPL-34not implemented
TERR_TYPE_WORSE-35the new type is worse than the old type
TERR_BAD_FX_SIZE-36cannot extend struct beyond fixed size

Alternative examples

This section gives examples of how to port some ida_struct and ida_enum functions using ida_typeinf.

del_struct_members

The following code can be used as an example of how to replace ida_struct.del_struct_members.

def del_struct_members(sid, offset1, offset2):
    tif = ida_typeinf.tinfo_t()
    if tif.get_type_by_tid(sid) and tif.is_udt():
        udm = ida_typeinf.udm_t()
        udm.offset = offset1 * 8
        idx1 = tif.find_udm(udm, ida_typeinf.STRMEM_OFFSET)
        udm = ida_typeinf.udm_t()
        udm.offset = offset2 * 8
        idx2 = tif.find_udm(udm, ida_typeinf.STRMEM_OFFSET)
        return tif.del_udms(idx1, idx2)

get_member_by_fullname

The following code can be used as an example of how to replace ida_struct.get_member_by_fullname.

def get_member_by_fullname(fullname):
    udm = ida_typeinf.udm_t()
    idx = ida_typeinf.get_udm_by_fullname(udm, fullname)
    if  idx == -1:
        return None
    else:
        return udm

get_struc_qty

The following code can be used as an example of how to replace ida_struct.get_struc_qty.

def get_struc_qty():
    count = 0
    limit = ida_typeinf.get_ordinal_limit()
    for i in range(1, limit):
        tif = ida_typeinf.tinfo_t()
        if not tif.get_numbered_type(i, ida_typeinf.BTF_STRUCT):
            continue
        else:
            count += 1
    return count

is_special_member

The following code can be used as an example of how to replace ida_struct.is_special_member.

def is_special_member(member_id):
    tif = ida_typeing.tinfo_t()
    udm = ida_typeinf.udm_t()
    if tif.get_udm_by_tid(udm, member_id) != -1:
        return udm.is_special_member()
    return False

get_sptr

The following code can be used as an example of how to replace ida_struct.get_sptr.

def get_sptr(udm):
    tif = udm.type
    if tif.is_udt() and tif.is_struct():
        return tif
    else:
        return None

How to examples

List structure members

Example 1

def list_enum_members(name)
    tid = idc.get_struc_id(name)
    if not tid == ida_idaapi.BADADDR:
        for (offset, name, size) in idautils.StructMembers(tid):
            print(f'Member {name} at offset {offset} of size {size}')

Example 2

def list_struct_members2(name):
    til = ida_typeinf.get_idati()
    tif = ida_typeinf.tinfo_t()
    if not tif.get_named_type(til, name, ida_typeinf.BTF_STRUCT, True, False):
        print(f"'{name}' is not a structure")
    elif  tif.is_typedef():
        print(f"'{name}' is not a (non typedefed) structure.")
    else:
        udt = ida_typeinf.udt_type_data_t()
        if tif.get_udt_details(udt):
            idx = 0
            print(f'Listing the {name} structure {udt.size()} field names:')
            for udm in udt:
                print(f'Field {idx}: {udm.name}')
                idx += 1
        else:
            print(f"Unable to get udt details for structure '{name}'")

List enum members

def list_enum_members(name):
    til = ida_typeinf.get_idati()
    tif = ida_typeinf.tinfo_t()
    if not tif.get_named_type(til, name, ida_typeinf.BTF_ENUM, True, False):
        print(f"'{name}' is not an enum")
    elif tif.is_typedef():
        print(f"'{name}' is not a (non typedefed) enum.")
    else:
        edt = ida_typeinf.enum_type_data_t()
        if tif.get_enum_details(edt):
            idx = 0
            bitfield = ''
            if edt.is_bf():
                bitfield = '(bitfield)'
            print(f"Listing the '{name}' {bitfield} enum {edt.size()} field names:")
            for edm in edt:
                print(f'Field {idx}: {edm.name} = {edm.value}')
                idx += 1
        else:
            print(f"Unable to get udt details for enum '{name}'")

List frame information

func = ida_funcs.get_func(here())
if func:
    func_name = ida_funcs.get_func_name(func.start_ea)
    frame_tif = ida_typeinf.tinfo_t()
    if ida_frame.get_func_frame(frame_tif, func):
        frame_udt = ida_typeinf.udt_type_data_t()
        if frame_tif.get_udt_details(frame_udt):
            print('List frame information:')
            print('-----------------------')
            print(f'{func_name} @ {func.start_ea:x} framesize {frame_tif.get_size():x}')
            print(f'Local variable size: {func.frsize:x}')
            print(f'Saved registers: {func.frregs:x}')
            print(f'Argument size: {func.argsize:x}')
            print('{')
            idx = 0
            for udm in frame_udt:
                print(f'\t[{idx}] {udm.name}: soff={udm.offset//8:x} eof={udm.end()//8:x} {udm.type.dstr()}')
                idx += 1
            print('}')
else:
    print(f'{here():x} is not inside a function.')

List stack variables xrefs

func = ida_funcs.get_func(here())
if func:
    print(f'Function @ {func.start_ea:x}')

    frame_tif = ida_typeinf.tinfo_t()
    if ida_frame.get_func_frame(frame_tif, func):
        print('Frame found')
        nmembers = frame_tif.get_udt_nmembers()
        print(f'Frame has {nmembers} members')

        if nmembers > 0:
            frame_udt = ida_typeinf.udt_type_data_t()
            if frame_tif.get_udt_details(frame_udt):

                for frame_udm in frame_udt:
                    start_off = frame_udm.begin() // 8
                    end_off = frame_udm.end() // 8
                    xreflist = ida_frame.xreflist_t()
                    ida_frame.build_stkvar_xrefs(xreflist, func, start_off, end_off)
                    size = xreflist.size()
                    print(f'{frame_udm.name} stack variable starts @ {start_off:x}, ends @ {end_off:x}, xref size: {size}')

                    for idx in range(size):
                        match xreflist[idx].type:
                            case ida_xref.dr_R:
                                type = 'READ'
                            case ida_xref.dr_W:
                                type = 'WRITE'
                            case _:
                                type = 'UNK'
                        print(f'\t[{idx}]: xref @ {xreflist[idx].ea:x} of type {type}')
            else:
                print('Unable to get the frame details.')
        else:
            print('No members found.')
else:
    print('No function under the cursor')

Create a structure with parsing

struct_str = """struct pcap_hdr_s {
        uint32_t magic_number;   /* magic number */
        uint16_t version_major;  /* major version number */
        uint16_t version_minor;  /* minor version number */
        int32_t  thiszone;       /* GMT to local correction */
        uint32_t sigfigs;        /* accuracy of timestamps */
        uint32_t snaplen;        /* max length of captured packets, in octets */
        uint32_t network;        /* data link type */
};"""
tif = ida_typeinf.tinfo_t()
if tif.get_named_type(None, 'pcap_hdr_s'):
    ida_typeinf.del_named_type(None, 'pcap_hdr_s', ida_typeinf.NTF_TYPE)
ida_typeinf.idc_parse_types(struct_str, 0)
if not tif.get_named_type(None, 'pcap_hdr_s'):
    print('Unable to retrieve pcap_hdr_s structure')

Create a structure member by member

tif = ida_typeinf.tinfo_t()
if tif.get_named_type(None, 'pcaprec_hdr_s'):
    ida_typeinf.del_named_type(None, 'pcaprec_hdr_s', ida_typeinf.NTF_TYPE)
field_list = [('ts_sec', ida_typeinf.BTF_UINT32),
             ('ts_usec', ida_typeinf.BTF_UINT32),
             ('incl_len', ida_typeinf.BTF_UINT32),
             ('orig_len', ida_typeinf.BTF_UINT32)]
udt = ida_typeinf.udt_type_data_t()
udm = ida_typeinf.udm_t()
for (name, type) in field_list:
    udm.name = name
    udm.type = ida_typeinf.tinfo_t(type)
    udt.push_back(udm)
if tif.create_udt(udt):
    tif.set_named_type(None, 'pcaprec_hdr_s')

Create a union member by member

tif = ida_typeinf.tinfo_t()
if tif.get_named_type(None, 'my_union'):
    ida_typeinf.del_named_type(None, 'my_union', ida_typeinf.NTF_TYPE)
tif = ida_typeinf.tinfo_t()
udt = ida_typeinf.udt_type_data_t()
field_list = [('member1', ida_typeinf.BTF_INT32),
              ('member2', ida_typeinf.BTF_CHAR),
              ('member3', ida_typeinf.BTF_FLOAT)]
udt.is_union = True
udm = ida_typeinf.udm_t()
for (name, type) in field_list:
    udm.name = name
    udm.type = ida_typeinf.tinfo_t(type)
    udt.push_back(udm)
tif.get_named_type(None, 'pcap_hdr_s')
if tif.create_ptr(tif):
    udm.name = 'header_ptr'
    udm.type = tif
    udt.push_back(udm)
    tif.clear()
    tif.create_udt(udt, ida_typeinf.BTF_UNION)
    tif.set_named_type(None, 'my_union')

Create a bitmask enum

edt = ida_typeinf.enum_type_data_t()
edm = ida_typeinf.edm_t()
for name, value in [('field1', 1), ('field2', 2), ('field3', 4)]:
    edm.name = name
    edm.value = value
    edt.push_back(edm)

tif = ida_typeinf.tinfo_t()
if tif.create_enum(edt):
    tif.set_enum_is_bitmask(ida_typeinf.tinfo_t.ENUMBM_ON)
    tif.set_named_type(None, 'bmenum')

Create an array

Example 1

tif = ida_typeinf.tinfo_t(ida_typeinf.BTF_INT)
if tif.create_array(tif, 5, 0):
    type = tif._print()
    tif.set_named_type(None, 'my_int_array1')

Example 2

atd = ida_typeinf.array_type_data_t()
atd.base = 0
atd.nelems = 5
atd.elem_type = ida_typeinf.tinfo_t(ida_typeinf.BTF_INT)
tif = ida_typeinf.tinfo_t()
if tif.create_array(atd):
    type = tif._print()
    tif.set_named_type(None, 'my_int_array2')

Log local type events

class lt_logger_hooks_t(ida_idp.IDB_Hooks):
    def __init__(self):
        ida_idp.IDB_Hooks.__init__(self)
        self.inhibit_log = 0

    def _format_value(self, v):
        return str(v)

    def _log(self, msg=None):
        if self.inhibit_log <= 0:
            if msg:
                print(f'>>> lt_logger_hooks_f: {msg}')
            else:
                stack = inspect.stack()
                frame, _, _, _, _, _ = stack[1]
                args, _, _, values = inspect.getargvalues(frame)
                method_name = inspect.getframeinfo(frame)[2]
                argstrs = []
                for arg in args[1:]:
                    argstrs.append("%s=%s" % (arg, self._format_value(values[arg])))
                print(f'>>> lt_logger_hooks_t.{method_name}: {", ".join(args)}')
        return 0

    def lt_udm_created(self, udtname, udm):
        msg = f'UDM {udm.name} has been created in UDT {udtname}'
        return self._log(msg)

    def lt_udm_deleted(self, udtname, udm_tid):
        msg = f'UDM tid {udm_tid:x} has been deleted from {udtname}'
        return self._log(msg)

    def lt_udm_renamed(self, udtname, udm, oldname):
        msg = f'UDM {oldname} from UDT {udtname} has been renamed to {udm.name}'
        return self._log(msg)

    def lt_udm_changed(self, udtname, udm_tid, udmold, udmnew):
        return self._log()



# Remove an existing hook on second run
try:
    idp_hook_stat = "un"
    print("Local type IDB hook: checking for hook...")
    lthook
    print("Local type IDB hook: unhooking....")
    idp_hook_stat2 = ""
    lthook.unhook()
    del lthook
except:
    print("local type IDB hook: not installed, installing now....")
    idp_hook_stat = ""
    idp_hook_stat2 = "un"
    lthook = lt_logger_hooks_t()
    lthook.hook()

print(f'Local type IDB hook {idp_hook_stat}installed. Run the script again to {idp_hook_stat2}install')

Log frame events

class frame_logger_hooks_t(ida_idp.IDB_Hooks):
    def __init__(self):
        ida_idp.IDB_Hooks.__init__(self)
        self.inhibit_log = 0

    def _format_value(self, v):
        return str(v)

    def _log(self, msg=None):
        if self.inhibit_log <= 0:
            if msg:
                print(f'>>> frame_logger_hooks_f: {msg}')
            else:
                stack = inspect.stack()
                frame, _, _, _, _, _ = stack[1]
                args, _, _, values = inspect.getargvalues(frame)
                method_name = inspect.getframeinfo(frame)[2]
                argstrs = []
                for arg in args[1:]:
                    argstrs.append("%s=%s" % (arg, self._format_value(values[arg])))
                print(f'>>> frame_logger_hooks_t.{method_name}: {", ".join(args)}')
        return 0

    def frame_udm_created(self, func_ea, udm):
        return self._log()

    def frame_udm_deleted(self, func_ea, udm_tid, udm):
        return self._log()

    def frame_udm_renamed(self, func_ea, udm, oldname):
        return self._log()

    def frame_udm_changed(self, func_ea, udm_tid, udmold, udmnew):
        return self._log()



# Remove an existing hook on second run
try:
    frame_idp_hook_stat = "un"
    print("Frame IDP hook: checking for hook...")
    framehook
    print("Frame IDP hook: unhooking....")
    frame_idp_hook_stat2 = ""
    framehook.unhook()
    del framehook
except:
    print("Frame IDP hook: not installed, installing now....")
    frame_idp_hook_stat = ""
    frame_idp_hook_stat2 = "un"
    framehook = frame_logger_hooks_t()
    framehook.hook()

print(f'Frame IDB hook {frame_idp_hook_stat}installed. Run the script again to {frame_idp_hook_stat2}install')