# IDAPython Porting Guide from IDA 8.x to 9.0

IDA 9.0 IDAPython Changes and porting guide

* [Introduction](#introduction)
* [ida\_struct](#ida_struct)
  * [Removed functions:](#removed-functions)
  * [Removed methods and members](#removed-methods-and-members)
    * [member\_t](#member_t)
    * [struct\_t](#struct_t)
    * [struct\_field\_visitor\_t](#struct_field_visitor_t)
    * [udm\_visitor\_t](#udm_visitor_t)
* [ida\_enum](#ida_enum)
  * [Removed functions](#removed-functions-1)
  * [enum\_member\_visitor\_t](#enum_member_visitor_t)
* [ida\_typeinf](#ida_typeinf)
  * [Removed functions](#removed-functions-2)
  * [Added functions](#added-functions)
  * [Added class](#added-class)
    * [udm\_visitor\_t](#udm_visitor_t-1)
  * [Removed methods](#removed-methods)
    * [enum\_type\_data\_t](#enum_type_data_t)
  * [Added methods](#added-methods)
    * [callregs\_t](#callregs_t)
    * [enum\_type\_data\_t](#enum_type_data_t-1)
    * [func\_type\_data\_t.](#func_type_data_t)
    * [til\_t](#til_t)
    * [tinfo\_t](#tinfo_t)
    * [udm\_t](#udm_t)
    * [udtmembervec\_t](#udtmembervec_t)
  * [Modified methods:](#modified-methods)
    * [tinfo\_t](#tinfo_t-1)
* [ida\_frame](#ida_frame)
  * [Removed functions](#removed-functions-3)
  * [Added functions](#added-functions-1)
  * [Modified functions](#modified-functions)
* [ida\_bytes](#ida_bytes)
  * [Removed functions](#removed-functions-4)
  * [Added functions](#added-functions-2)
  * [Modified functions](#modified-functions-1)
* [idc](#idc)
  * [Removed functions](#removed-functions-5)
* [ida\_dirtree](#ida_dirtree)
  * [Removed functions](#removed-functions-6)
* [ida\_diskio](#ida_diskio)
  * [Removed functions](#removed-functions-7)
* [ida\_fpro](#ida_fpro)
  * [Added functions](#added-functions-3)
* [ida\_funcs](#ida_funcs)
  * [Added methods](#added-methods-1)
    * [func\_item\_iterator\_t](#func_item_iterator_t)
* [ida\_gdl](#ida_gdl)
  * [Added classes](#added-classes)
    * [edge\_t](#edge_t)
    * [edgevec\_t](#edgevec_t)
    * [node\_ordering\_t](#node_ordering_t)
* [ida\_graph](#ida_graph)
  * [Removed classes](#removed-classes)
    * [node\_ordering\_t](#node_ordering_t-1)
    * [edge\_t](#edge_t-1)
  * [Renamed clases](#renamed-clases)
  * [Renamed functions](#renamed-functions)
* [ida\_hexrays](#ida_hexrays)
  * [Removed functions](#removed-functions-8)
  * [Modified functions](#modified-functions-2)
  * [Added functions](#added-functions-4)
  * [Added classes](#added-classes-1)
  * [Removed methods](#removed-methods-1)
    * [vdui\_t](#vdui_t)
  * [Added methods](#added-methods-2)
    * [cinsn\_list\_t](#cinsn_list_t)
    * [Hexrays\_Hooks](#hexrays_hooks)
    * [lvar\_t](#lvar_t)
    * [lvars\_t](#lvars_t)
    * [simple\_graph\_t](#simple_graph_t)
    * [fnumber\_t](#fnumber_t)
    * [minsn\_t](#minsn_t)
    * [mba\_t](#mba_t)
    * [codegen\_t](#codegen_t)
  * [Modified methods](#modified-methods-1)
    * [Hexrays\_Hooks](#hexrays_hooks-1)
    * [valrng\_t](#valrng_t)
    * [stkvar\_ref\_t](#stkvar_ref_t)
    * [mop\_t](#mop_t)
* [ida\_ida](#ida_ida)
  * [Added classes](#added-classes-2)
    * [idbattr\_valmap\_t](#idbattr_valmap_t)
    * [idbattr\_info\_t](#idbattr_info_t)
  * [inf\_structure accessors](#inf_structure-accessors)
    * [Replacement examples:](#replacement-examples)
    * [inf\_structure getters](#inf_structure-getters)
    * [inf\_structure setters](#inf_structure-setters)
* [ida\_idaapi](#ida_idaapi)
  * [Removed functions](#removed-functions-9)
* [ida\_idd](#ida_idd)
  * [Added functions](#added-functions-5)
* [ida\_idp](#ida_idp)
  * [Removed methods](#removed-methods-2)
    * [\_processor\_t](#_processor_t)
  * [processor\_t](#processor_t)
  * [Modified methods](#modified-methods-2)
    * [\_processor\_t](#_processor_t-1)
    * [IDP\_Hooks](#idp_hooks)
  * [Added methods](#added-methods-3)
    * [IDB\_Hooks](#idb_hooks)
  * [Removed functions](#removed-functions-10)
* [ida\_ieee](#ida_ieee)
  * [Removed methods](#removed-methods-3)
    * [fpvalue\_t](#fpvalue_t)
* [ida\_kernwin](#ida_kernwin)
  * [Removed functions](#removed-functions-11)
  * [Modified function](#modified-function)
  * [Removed classes](#removed-classes-1)
  * [Removed methods](#removed-methods-4)
    * [place\_t](#place_t)
    * [twinpos\_t](#twinpos_t)
    * [tagged\_line\_sections\_t](#tagged_line_sections_t)
  * [Added methods](#added-methods-4)
    * [tagged\_line\_sections\_t](#tagged_line_sections_t-1)
    * [chooser\_base\_t](#chooser_base_t)
  * [Added functions](#added-functions-6)
* [ida\_lines](#ida_lines)
  * [Removed functions](#removed-functions-12)
* [ida\_moved](#ida_moved)
  * [Modified functions](#modified--functions)
* [ida\_nalt](#ida_nalt)
  * [Removed functions](#removed-functions-13)
* [ida\_netnode](#ida_netnode)
  * [Modified functions](#modified-functions-3)
* [ida\_pro](#ida_pro)
  * [Removed functions](#removed-functions-14)
  * [Added classes](#added-classes-3)
    * [plugin\_options\_t](#plugin_options_t)
    * [uchar\_pointer](#uchar_pointer)
    * [ushort\_pointer](#ushort_pointer)
    * [uint\_pointer](#uint_pointer)
    * [sint8\_pointer](#sint8_pointer)
    * [int8\_pointer](#int8_pointer)
    * [uint8\_pointer](#uint8_pointer)
    * [int16\_pointer](#int16_pointer)
    * [uint16\_pointer](#uint16_pointer)
    * [int32\_pointer](#int32_pointer)
    * [uint32\_pointer](#uint32_pointer)
    * [int64\_pointer](#int64_pointer)
    * [uint64\_pointer](#uint64_pointer)
    * [ssize\_pointer](#ssize_pointer)
    * [bool\_pointer](#bool_pointer)
    * [short\_pointer](#short_pointer)
    * [char\_pointer](#char_pointer)
    * [sel\_pointer](#sel_pointer)
    * [asize\_pointer](#asize_pointer)
    * [adiff\_pointer](#adiff_pointer)
    * [uval\_pointer](#uval_pointer)
    * [ea32\_pointer](#ea32_pointer)
    * [ea64\_pointer](#ea64_pointer)
    * [flags\_pointer](#flags_pointer)
    * [flags64\_pointer](#flags64_pointer)
    * [tid\_pointer](#tid_pointer)
  * [Added functions](#added-functions-7)
* [ida\_regfinder](#ida_regfinder)
  * [Removed functions](#removed-functions-15)
  * [Modified functions](#modified-functions-4)
  * [Added methods](#added-methods-5)
    * [reg\_value\_info\_t](#reg_value_info_t)
* [ida\_registry](#ida_registry)
  * [Removed functions](#removed-functions-16)
* [ida\_search](#ida_search)
  * [Removed functions](#removed-functions-17)
* [ida\_ua](#ida_ua)
  * [Removed Function](#removed-function)
  * [Modified functions](#modified-functions-5)
  * [Added methods](#added-methods-6)
    * [macro\_constructor\_t](#macro_constructor_t)
* [idautils](#idautils)
  * [Modified functions](#modified-functions-6)
* [IDB events](#idb-events)
* [Type information error codes](#type-information-error-codes)
* [Alternative examples](#alternative-examples)
  * [del\_struct\_members](#del_struct_members)
  * [get\_best\_fit\_member](#get_best_fit_member)
  * [get\_innermost\_member](#get_innermost_member)
  * [get\_max\_offset](#get_max_offset)
  * [get\_first\_struc\_idx](#get_first_struc_idx)
  * [get\_member\_fullname](#get_member_fullname)
  * [get\_struc](#get_struc)
  * [get\_member](#get_member)
  * [get\_member\_by\_fullname](#get_member_by_fullname)
  * [get\_member\_struc](#get_member_struc)
  * [get\_member\_tinfo](#get_member_tinfo)
  * [get\_member\_by\_name](#get_member_by_name)
  * [get\_struc\_idx](#get_struc_idx)
  * [get\_struc\_qty](#get_struc_qty)
  * [is\_varmember](#is_varmember)
  * [is\_special\_member](#is_special_member)
  * [is\_varstr](#is_varstr)
  * [get\_sptr](#get_sptr)
  * [set\_struc\_listed](#set_struc_listed)
* [How to examples](#how-to-examples)
  * [List structure members](#list-structure-members)
    * [Example 1](#example-1)
    * [Example 2](#example-2)
  * [List enum members](#list-enum-members)
  * [List frame information](#list-frame-information)
  * [List stack variables xrefs](#list-stack-variables-xrefs)
  * [Create a structure with parsing](#create-a-structure-with-parsing)
  * [Create a structure member by member](#create-a-structure-member-by-member)
  * [Create a union member by member](#create-a-union-member-by-member)
  * [Create a bitmask enum](#create-a-bitmask-enum)
  * [Create an array](#create-an-array)
    * [Example 1](#example-1-1)
    * [Example 2](#example-2-1)
  * [Log local type events](#log-local-type-events)
  * [Log frame events](#log-frame-events)

## 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`

## ida\_struct

### Removed functions:

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

The idc alternatives and the examples are based on:

* `ida_typeinf` module
* `ida_typeinf.tinfo_t`, the type info class
* `ida_typeinf.udt_type_data_t`, the user defined type class
* `ida_typeinf.udm_t`, the user data type member class

NOTE: It is recommended to take a look at the implementation of the idc.\* functions mentioned below.

| 8.4                         | 9.0                                      |
| --------------------------- | ---------------------------------------- |
| `add_struc`                 | `idc.add_struc`                          |
| `add_struc_member`          | `idc.add_struc_member`                   |
| `del_struc`                 | `idc.del_struc`                          |
| `del_struc_member`          | `idc.del_struc_member`                   |
| `del_struc_members`         | see [example](#del_struct_members)       |
| `expand_struc`              | `idc.expand_struc`                       |
| `get_best_fit_member`       | see [example](#get_best_fit_member)      |
| `get_first_struc_idx`       | see [example](#get_first_struc_idx)      |
| `get_innermost_member`      | see [example](#get_innermost_member)     |
| `get_last_struc_idx`        |                                          |
| `get_max_offset`            | see [example](#get_max_offset)           |
| `get_member`                | see [example](#get_member)               |
| `get_member_by_fullname`    | see [example](#get_member_by_fullname)   |
| `get_member_by_id`          | see `tinfo_t.get_udm_by_tid`             |
| `get_member_by_name`        | see [example](#get_member_by_name)       |
| `get_member_cmt`            | `idc.get_member_cmt`                     |
| `get_member_fullname`       | see [example](#get_member_fullname)      |
| `get_member_id`             | `idc.get_member_id`                      |
| `get_member_name`           | `idc.get_member_name`                    |
| `get_member_size`           | `idc.get_member_size`                    |
| `get_member_struc`          | see [example](#get_member_struc)         |
| `get_member_tinfo`          | see [example](#get_member_tinfo)         |
| `get_next_member_idx`       |                                          |
| `get_next_struc_idx`        |                                          |
| `get_or_guess_member_tinfo` |                                          |
| `get_prev_member_idx`       |                                          |
| `get_prev_struc_idx`        |                                          |
| `get_sptr`                  | see [example](#get_sptr)                 |
| `get_struc`                 | see [example](#get_struc)                |
| `get_struc_by_idx`          |                                          |
| `get_struc_cmt`             | `idc.get_struc_cmt`                      |
| `get_struc_first_offset`    |                                          |
| `get_struc_id`              | `idc.get_struc_id`                       |
| `get_struc_idx`             | see [example](#get_struc_idx)            |
| `get_struc_last_offset`     |                                          |
| `get_struc_name`            | `idc.get_struc_name`                     |
| `get_struc_next_offset`     |                                          |
| `get_struc_prev_offset`     |                                          |
| `get_struc_qty`             | see [example](#get_struc_qty)            |
| `get_struc_size`            | `idc.get_struc_size`                     |
| `is_anonymous_member_name`  | see `ida_frame.is_anonymous_member_name` |
| `is_dummy_member_name`      | see `ida_frame.is_dummy_member_name`     |
| `is_member_id`              | `idc.is_member_id`                       |
| `is_special_member`         | see [example](#is_special_member)        |
| `is_union`                  | `idc.is_union`                           |
| `is_varmember`              | see [example](#is_varmember)             |
| `is_varstr`                 | see [example](#is_varstr)                |
| `retrieve_member_info`      |                                          |
| `save_struc`                | see `tinfo_t.save_type`                  |
| `set_member_cmt`            | `idc.set_member_cmt`                     |
| `set_member_name`           | `idc.set_member_name`                    |
| `set_member_tinfo`          |                                          |
| `set_member_type`           | `idc.set_member_type`                    |
| `set_struc_align`           |                                          |
| `set_struc_cmt`             | `idc.set_struc_cmt`                      |
| `set_struc_hidden`          |                                          |
| `set_struc_idx`             |                                          |
| `set_struc_listed`          | see [example](#set_struc_listed)         |
| `set_struc_name`            | `idc.set_struc_name`                     |
| `stroff_as_size`            | see `ida_typeinf.stroff_as_size`         |
| `struct_field_visitor_t`    | see `ida_typeinf.tinfo_visitor_t`        |
| `unsync_and_delete_struc`   |                                          |
| `visit_stroff_fields`       |                                          |
| `visit_stroff_udms`         | see `ida_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.4                            | 9.0                           |
| ------------------------------ | ----------------------------- |
| `add_enum`                     | `idc.add_enum`                |
| `add_enum_member`              | `idc.add_enum_member`         |
| `del_enum`                     | `idc.del_enum`                |
| `del_enum_member`              | `idc.del_enum_member`         |
| `for_all_enum_members`         |                               |
| `get_bmask_cmt`                | `idc.get_bmask_cmt`           |
| `get_bmask_name`               | `idc.get_bmask_name`          |
| `get_enum`                     | `idc.get_enum`                |
| `get_enum_cmt`                 | `idc.get_enum_cmt`            |
| `get_enum_flag`                | `idc.get_enum_flag`           |
| `get_enum_idx`                 |                               |
| `get_enum_member`              | `idc.get_enum_member`         |
| `get_enum_member_bmask`        | `idc.get_enum_member_bmask`   |
| `get_enum_member_by_name`      | `idc.get_enum_member_by_name` |
| `get_enum_member_cmt`          | `idc.get_enum_member_cmt`     |
| `get_enum_member_enum`         | `idc.get_enum_member_enum`    |
| `get_enum_member_name`         | `idc.get_enum_member_name`    |
| `get_enum_member_serial`       |                               |
| `get_enum_member_value`        | `idc.get_enum_member_value`   |
| `get_enum_name`                | `idc.get_enum_name`           |
| `get_enum_name2`               |                               |
| `get_enum_qty`                 |                               |
| `get_enum_size`                | `idc.get_enum_size`           |
| `get_enum_type_ordinal`        |                               |
| `get_enum_width`               | `idc.get_enum_width`          |
| `get_first_bmask`              | `idc.get_first_bmask`         |
| `get_first_enum_member`        | `idc.get_first_enum_member`   |
| `get_first_serial_enum_member` |                               |
| `get_last_bmask`               | `idc.get_last_bmask`          |
| `get_last_enum_member`         | `idc.get_last_enum_member`    |
| `get_last_serial_enum_member`  |                               |
| `get_next_bmask`               | `idc.get_next_bmask`          |
| `get_next_enum_member`         | `idc.get_next_enum_member`    |
| `get_next_serial_enum_member`  |                               |
| `get_prev_bmask`               | `idc.get_prev_bmask`          |
| `get_prev_enum_member`         | `idc.get_prev_enum_member`    |
| `get_prev_serial_enum_member`  |                               |
| `getn_enum`                    |                               |
| `is_bf`                        | `idc.is_bf`                   |
| `is_enum_fromtil`              |                               |
| `is_enum_hidden`               |                               |
| `is_ghost_enum`                |                               |
| `is_one_bit_mask`              |                               |
| `set_bmask_cmt`                | `idc.set_bmask_cmt`           |
| `set_bmask_name`               | `idc.set_bmask_name`          |
| `set_enum_bf`                  | `idc.set_enum_bf`             |
| `set_enum_cmt`                 | `idc.set_enum_cmt`            |
| `set_enum_flag`                | `idc.set_enum_flag`           |
| `set_enum_fromtil`             |                               |
| `set_enum_ghost`               |                               |
| `set_enum_hidden`              |                               |
| `set_enum_idx`                 |                               |
| `set_enum_member_cmt`          | `idc.set_enum_member_cmt`     |
| `set_enum_member_name`         | `idc.set_enum_member_name`    |
| `set_enum_name`                | `idc.set_enum_name`           |
| `set_enum_type_ordinal`        |                               |
| `set_enum_width`               | `idc.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.4                                                                              | 9.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](#tinfo_t)
* `get_frame`: see [tinfo\_t.get-func\_frame](#tinfo_t)
* `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.4                                                                                                                                          | 9.0                                                                                                                        |
| -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `define_stkvar(pfn: "func_t *", name: "const char *", off: "sval_t", flags: "flags64_t", ti: "const opinfo_t *", nbytes: "asize_t") -> bool` | `define_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.4                                                                                                                                 | 9.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_t`                                 | `bin_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

* `find_text` see [ida\_bytes](#ida_bytes)
* `find_binary` see [ida\_bytes](#ida_bytes)

## 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](#ida_gdl) `node_ordering_t` has been made an alias of `ida_gdl.node_ordering_t`

#### edge\_t

See [ida-gdl](#ida_gdl) `edge_t` has been made an alias of `ida_gdl.edge_t`

### Renamed clases

| 8.4                | 9.0                   |
| ------------------ | --------------------- |
| `abstract_graph_t` | `drawable_graph_t`    |
| `mutable_graph_t`  | `interactive_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.4                           | 9.0                               |
| ----------------------------- | --------------------------------- |
| `create_mutable_graph`        | `create_interactive_graph`        |
| `delete_mutable_graph`        | `delete_interactive_graph`        |
| `grcode_create_mutable_graph` | `grcode_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.4                                                                                                | 9.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.4                                             | 9.0                                                           |
| ----------------------------------------------- | ------------------------------------------------------------- |
| `flowchart(self, fc: "qflow_chart_t") -> "int"` | `flowchart(self, fc: "qflow_chart_t", mba: "mba_t") -> "int"` |

#### valrng\_t

| 8.4                                          | 9.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.4                                                        | 9.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.4                                                   | 9.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](#removed-functions-9) `get_inf_structure` has been removed. It has been replaced by the following accessors.

#### Replacement examples:

| In 8.4                                      | In 9.0                           |
| ------------------------------------------- | -------------------------------- |
| `ida_idaapi.get_inf_structure().procname`   | `ida_ida.inf_get_procname()`     |
| `ida_idaapi.get_inf_structure().max_ea`     | `ida_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

* `get_inf_structure` see [inf\_structure getters](#getters) and [inf\_structure setters](#setters)
* `loader_input_t_from_linput`
* `loader_input_t_from_capsule`
* `loader_input_t_from_fp`

## 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](#idb-events) below.

### Removed methods

#### \_processor\_t

* `has_realcvt`

### processor\_t

* `get_uFlag`

### Modified methods

#### \_processor\_t

| 8.4                                                                                     | 9.0                                                                                        |
| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| `gen_stkvar_def(ctx: "outctx_t &", mptr: "member_t const *", v: : "sval_t") -> ssize_t` | `gen_stkvar_def(ctx: "outctx_t &", mptr: "udm_t", v: "sval_t", tid: "tid_t") -> "ssize_t"` |

#### IDP\_Hooks

| 8.4                                       | 9.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](#added-classes-2) 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.4                                                | 9.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`

## ida\_search

### 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.4                                                                                            | 9.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.4                                            | 9.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 7                 | In 9.0                                                   |
| ----------------------- | -------------------------------------------------------- |
| `truc_created`          | `local_types_changed`                                    |
| `deleting_struc`        | **none**                                                 |
| `struc_deleted`         | `local_types_changed`                                    |
| `changing_struc_align`  | **none**                                                 |
| `struc_align_changed`   | `local_types_changed`                                    |
| `renaming_struc`        | **none**                                                 |
| `struc_renamed`         | `local_types_changed`                                    |
| `expanding_struc`       | **none**                                                 |
| `struc_expanded`        | `lt_udt_expanded, frame_expanded, local_types_changed`   |
| `struc_member_created`  | `lt_udm_created, frame_udm_created, local_types_changed` |
| `deleting_struc_member` | **none**                                                 |
| `struc_member_deleted`  | `lt_udm_deleted, frame_udm_deleted, local_types_changed` |
| `renaming_struc_member` | **none**                                                 |
| `struc_member_renamed`  | `lt_udm_renamed, frame_udm_renamed, local_types_changed` |
| `changing_struc_member` | **none**                                                 |
| `struc_member_changed`  | `lt_udm_changed, frame_udm_changed, local_types_changed` |
| `changing_struc_cmt`    | **none**                                                 |
| `struc_cmt_changed`     | `local_types_changed`                                    |
| `enum_created`          | `local_types_changed`                                    |
| `deleting_enum`         | **none**                                                 |
| `enum_deleted`          | `local_types_changed`                                    |
| `renaming_enum`         | **none**                                                 |
| `enum_renamed`          | `local_types_changed`                                    |
| `changing_enum_bf`      | `local_types_changed`                                    |
| `enum_bf_changed`       | `local_types_changed`                                    |
| `changing_enum_cmt`     | **none**                                                 |
| `enum_cmt_changed`      | `local_types_changed`                                    |
| `enum_member_created`   | `local_types_changed`                                    |
| `deleting_enum_member`  | **none**                                                 |
| `enum_member_deleted`   | `local_types_changed`                                    |
| `enum_width_changed`    | `local_types_changed`                                    |
| `enum_flag_changed`     | `local_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 name              | Val. | Meaning                                                                                                                         |
| ----------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------- |
| **TERR\_OK**            | 0    | ok                                                                                                                              |
| **TERR\_STABLE**        | 1    | it means no errors occurred but nothing has changed (this code is internal: should never be returned to caller) -\*             |
| **TERR\_SAVE\_ERROR**   | -1   | failed to save                                                                                                                  |
| **TERR\_SERIALIZE**     | -2   | failed to serialize                                                                                                             |
| **TERR\_BAD\_NAME**     | -3   | name is not acceptable                                                                                                          |
| **TERR\_BAD\_ARG**      | -4   | bad argument                                                                                                                    |
| **TERR\_BAD\_TYPE**     | -5   | bad type                                                                                                                        |
| **TERR\_BAD\_SIZE**     | -6   | bad size                                                                                                                        |
| **TERR\_BAD\_INDEX**    | -7   | bad index                                                                                                                       |
| **TERR\_BAD\_ARRAY**    | -8   | arrays are forbidden as function arguments                                                                                      |
| **TERR\_BAD\_BF**       | -9   | bitfields are forbidden as function arguments                                                                                   |
| **TERR\_BAD\_OFFSET**   | -10  | bad member offset                                                                                                               |
| **TERR\_BAD\_UNIVAR**   | -11  | unions cannot have variable sized members                                                                                       |
| **TERR\_BAD\_VARLAST**  | -12  | variable sized member must be the last member in the structure                                                                  |
| **TERR\_OVERLAP**       | -13  | the member overlaps with other members that cannot be deleted                                                                   |
| **TERR\_BAD\_SUBTYPE**  | -14  | recursive structure nesting is forbidden                                                                                        |
| **TERR\_BAD\_VALUE**    | -15  | value is not acceptable                                                                                                         |
| **TERR\_NO\_BMASK**     | -16  | bitmask is not found                                                                                                            |
| **TERR\_BAD\_BMASK**    | -17  | Bad enum member mask. The specified mask should not intersect with any existing mask in the enum. Zero masks are prohibited too |
| **TERR\_BAD\_MSKVAL**   | -18  | bad bmask and value combination                                                                                                 |
| **TERR\_BAD\_REPR**     | -19  | bad or incompatible field representation                                                                                        |
| **TERR\_GRP\_NOEMPTY**  | -20  | could not delete group mask for not empty group                                                                                 |
| **TERR\_DUPNAME**       | -21  | duplicate name                                                                                                                  |
| **TERR\_UNION\_BF**     | -22  | unions cannot have bitfields                                                                                                    |
| **TERR\_BAD\_TAH**      | -23  | bad bits in the type attributes (TAH bits)                                                                                      |
| **TERR\_BAD\_BASE**     | -24  | bad base class                                                                                                                  |
| **TERR\_BAD\_GAP**      | -25  | bad gap                                                                                                                         |
| **TERR\_NESTED**        | -26  | recursive structure nesting is forbidden                                                                                        |
| **TERR\_NOT\_COMPAT**   | -27  | the new type is not compatible with the old type                                                                                |
| **TERR\_BAD\_LAYOUT**   | -28  | failed to calculate the structure/union layout                                                                                  |
| **TERR\_BAD\_GROUPS**   | -29  | bad group sizes for bitmask enum                                                                                                |
| **TERR\_BAD\_SERIAL**   | -30  | enum value has too many serials                                                                                                 |
| **TERR\_ALIEN\_NAME**   | -31  | enum member name is used in another enum                                                                                        |
| **TERR\_STOCK**         | -32  | stock type info cannot be modified                                                                                              |
| **TERR\_ENUM\_SIZE**    | -33  | bad enum size                                                                                                                   |
| **TERR\_NOT\_IMPL**     | -34  | not implemented                                                                                                                 |
| **TERR\_TYPE\_WORSE**   | -35  | the new type is worse than the old type                                                                                         |
| **TERR\_BAD\_FX\_SIZE** | -36  | cannot 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.

```python
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\_best\_fit\_member

The following code can be used as an example of how to replace ida\_struct.get\_best\_fit\_member.

```python
def get_best_fit_member(sid, offset):
    tif = ida_typeinf.tinfo_t()
    if tif.get_type_by_tid(sid) and tif.is_udt():
        udt = ida_typeinf.udt_type_data_t()
        if tif.get_udt_details(udt):
            idx = udt.get_best_fit_member(offset)
            if idx != -1:
                return udt[idx]
    return None
```

### get\_innermost\_member

The following code can be used as an example of how to replace ida\_struct.get\_innermost\_member.

```python
def get_innermost_member(sid, offset):
    tif = ida_typeinf.tinfo_t()
    if tif.get_type_by_tid(sid) and tif.is_udt():
        (mtif, idx, _) = tif.get_innermost_udm(offset * 8)
        udt = ida_typeinf.udt_type_data_t()
        if idx != -1:
            if tif.get_udt_details(udt):
                return mtif, udt[idx]
    return None
```

### get\_max\_offset

```python
def get_max_offset(tif):
    if tif:
        if tif.is_struct():
            return tif.get_size()
        elif tif.is_union():
            return tif.get_udt_nmembers()
    return -1
```

### get\_first\_struc\_idx

The following code can be used as an example of how to replace ida\_struct.get\_first\_struc\_idx.

```python
def get_first_struc_idx():
    idx = -1
    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:
            idx = i
            break
    return idx
```

### get\_member\_fullname

The following code can be used as an example of how to replace ida\_struct.get\_member\_fullname.

```python
def get_member_fullname(udm_tid):
    return ida_typeinf.get_tid_name(udm_tid)
```

### get\_struc

The following code can be used as an example of how to replace ida\_struct.get\_struc.

```python
def get_struc(struct_tid):
    tif = ida_typeinf.tinfo_t()
    if tif.get_type_by_tid(struct_tid):
        if tif.is_struct():
            return tif
    return ida_idapi.BADADDR
```

### get\_member

The following code can be used as an example of how to replace ida\_struct.get\_member.

```python
def get_member(tif, offset):
    if not tif.is_struct():
        return None
    
    udm = ida_typeinf.udm_t()
    udm.offset = offset * 8
    idx = tif.find_udm(udm, ida_typeinf.STRMEM_OFFSET)
    if idx != -1:
        return udm
    
    return None
```

### get\_member\_by\_fullname

The following code can be used as an example of how to replace ida\_struct.get\_member\_by\_fullname.

```python
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\_member\_struc

The following code can be used as an example of how to replace ida\_struct.get\_member\_struc.

```python
def get_member_struc(fullname):
    udm = ida_typeinf.udm_t()
    idx = ida_typeinf.get_udm_by_fullname(udm, fullname)
    if idx != -1:
        if udm.type.is_struct():
            return ida_typeinf.tinfo_t(udm.type)
    return None
```

### get\_member\_tinfo

The following code can be used as an example of how to replace ida\_struct.get\_member\_tinfo.

```python
def get_member_tinfo(tif, udm):
    if tif and udm:
        ida_typeinf.copy_tinfo_t(tif, udm.type)
        return True
    return False
```

### get\_member\_by\_name

The following code can be used as an example of how to replace ida\_struct.get\_member\_by\_name.

```python
def get_member_by_name(tif, name):
    if not tif.is_struct():
        return None
    
    udm = ida_typeinf.udm_t()
    udm.name = name
    idx = tif.find_udm(udm, ida_typeinf.STRMEM_NAME)
    if idx != -1:
        return udm
    return None
```

### get\_struc\_idx

The following code can be used as an example of how to replace ida\_struct.get\_struc\_idx.

```python
def get_struc_idx(id):
    tif = ida_typeinf.tinfo_t()
    if tif.get_type_by_tid(id):
        if tif.is_struct():
            return tif.get_ordinal()
    return -1
```

### get\_struc\_qty

The following code can be used as an example of how to replace ida\_struct.get\_struc\_idx.

```python
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\_varmember

The following code can be used as an example of how to replace ida\_struct.is\_varmember.

```python
def is_varmember(udm):
    return udm.is_varmember()
```

### is\_special\_member

The following code can be used as an example of how to replace ida\_struct.is\_special\_member.

```python
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
```

### is\_varstr

```python
def is_varstr(str_id):
    tif = ida_typeinf.tinfo_t()
    if tif.get_type_by_tid(str_id):
        return tif.is_varstruct()
    return False
```

### get\_sptr

The following code can be used as an example of how to replace ida\_struct.get\_sptr.

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

### set\_struc\_listed

```python
def set_struc_listed(tif, is_listed):
    if tif.is_struct():
        ida_typeinf.set_type_choosable(None, tif.get_ordinal(), is_listed)
```

## How to examples

### List structure members

#### Example 1

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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

```python
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')
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.hex-rays.com/9.0/developer-guide/idapython/idapython-porting-guide-ida-9.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
