Skip to content
This repository was archived by the owner on Dec 24, 2025. It is now read-only.

Latest commit

 

History

History
324 lines (262 loc) · 10.6 KB

File metadata and controls

324 lines (262 loc) · 10.6 KB

Additions

udm_t(name: str, type, offset: int = -1) : udm_t

# Create a structure/union member, with the specified name
# and type.
#
# The size will be computed automatically.
#
# @param name a valid member name. Must not be empty.
# @param type the member type. the type can be specified one of the following ways:
#              - type_t if the type is simple (integral/floating/bool);
#              - tinfo_t a more complex type, like a pointer, array, etc;
#              - string as a C type declaration.
# @param offset the member offset in bits. It is the caller's responsibility
#              to specify correct offsets.
# if an input argument is incorrect, the constructor may raise an exception

tinfo_t.get_udm_by_name(name: str) : (idx, udm_t) | (-1, None)

# Retrieve a structure/union member (and its index) with the
# specified name in the specified tinfo_t object.
#
# @param name Member name. Must not be empty.
# @returns a tuple (int, udm_t), or (-1, None) if member not found.
  • CL#156578 - first attempt, w/o the index

tinfo_t.get_udm_by_offset(offset: int) : (idx, udm_t) | (-1, None)

# Retrieve a structure/union member with the specified offset
# in the specified tinfo_t object.
#
# @param offset Member bit offset
# @returns a tuple (int, udm_t), or (-1, None) if member not found.

tinfo_t.add_udm(name: str, type: tinfo_t | type_t | str, offset: int = -1)

# Add a new member to a structure/union type, with the specified name and type.
#
# The size will be computed automatically.
# The new member must not overlap with the existing members.
# if an input argument is incorrect, the constructor may raise an exception
#
# @param name Member name. Must not be empty.
# @param type Member type. Can be specified one of the following ways:
#              - type_t if the type is simple (integral/floating/bool);
#              - tinfo_t a more complex type, like a pointer, array, etc;
#              - string as a C type declaration.
# @param offset  Member offset in bits. If specified as -1, the new member
#                is added at the end of the structure/union.
# @returns member object
  • CL#156615

tinfo_t.insert_udm(self, udm: udm_t, idx: int, times: int = 1, etf_flags: int = 0):

# Insert a member in the current structure/union, at the specified index.
#
# The member's size will be computed automatically.
#
# @param udm       The member, fully initialized (but whose offset is not set)
# @param idx       the index in the udm array where the new udm should be placed.
# @param times     how many times to insert the new member
# @param etf_flags an OR'ed combination of ETF_ flags

funcarg_t(name: str, type: tinfo_t | type_t | str, argloc: argloc_t = argloc_t())

# Create a function argument, with the specified name and type.
#
# The 'type' descriptor, can be one of:
#
# * type_t: if the type is simple (integral/floating/bool). E.g., `BTF_INT`
# * tinfo_t: can handle more complex types (structures, pointers, arrays, ...)
# * str: a C type declaration
#
# If an input argument is incorrect, the constructor may raise an exception
#
# @param name a valid argument name. May not be empty.
# @param type the member type
# @param argloc the argument location. Can be empty.
  • CL#156993

til_t.numbered_types() : generator of tinfo_t

# Returns a generator over the numbered types contained in this
# type library.
#
# Every iteration returns a fresh new tinfo_t object
#
# @return a tinfo_t-producing generator
  • CL#156968

til_t.named_types() : generator of tinfo_t

# Returns a generator over the named types contained in this
# type library.
#
# Every iteration returns a fresh new tinfo_t object
#
# @return a tinfo_t-producing generator
  • CL#156968

til_t.get_named_type(name: str) : tinfo_t | None

# Retrieves a tinfo_t representing the named type in this type library.
#
# @param name a type name
# @return a new tinfo_t object, or None if not found
  • CL#156969

til_t.get_numbered_type(ordinal: int): tinfo_t | None

# Retrieves a tinfo_t representing the numbered type in this type library.
#
# @param ordinal a type ordinal
# @return a new tinfo_t object, or None if not found
  • CL#156969

qvector.append(thing: any) : None

# Alias of push_back()
  • CL#156975

qvector.extend(thing: qvector) : None

# Alias of insert(end(), thing.begin(), thing.end())
  • CL#156975

func_type_data_t() should default to CM_CC_UNKNOWN

Otherwise, the following is not working:

ftd = func_type_data_t()
ftd.append(funcarg_t("myarg", BT_INT32))
ftd.rettype = tinfo_t(BT_INT64)
tif = tinfo_t()
tif.create_func(ftd)
tif._print() => features a `__bad_cc` calling convention
  • CL#157005

tinfo_t.add_edm(name: str, value: int)

# Add an enumerator to the current enumeration.
#
# When creating a new enumeration from scratch, you might
# want to first call `create_enum()`
#
# This method has the following signatures:
#
# * add_edm(edm: edm_t, bmask: int = -1, etf_flags: int = 0, idx: int = -1)
# * add_edm(name: str, value: int, bmask: int = -1, etf_flags: int = 0, idx: int = -1)
#
# If an input argument is incorrect, the constructor may raise an exception
#
# @param edm       The member, fully initialized (first form)
# @param name      Enumerator name - must not be empty
# @param value     Enumerator value
# @param bmask     A bitmask to which the enumerator belongs
# @param etf_flags an OR'ed combination of ETF_ flags
# @param idx       the index in the edm array where the new udm should be placed.
#                  If the specified index cannot be honored because it would spoil
  • CL#1570??

edm_t(name: str, value: int, cmt: str = None) : edm_t

# Create a structure/union member, with the specified name and value
#
# @param name  Enumerator name. Must not be empty.
# @param value Enumerator value
# @param cmt   Enumerator repeatable comment. May be empty.
  • CL#1570??

tinfo_t(type: type_t) : tinfo_t

tinfo_t(decl: str, til: til_t = None, pt_flags: int = 0) : tinfo_t

tinfo_t(**kwargs) : tinfo_t

# Create a type object with the provided argumens.
#
# This constructor has the following signatures:
#
# * tinfo_t(decl_type: type_t)
# * tinfo_t(decl: str, til: til_t = None, pt_flags: int = 0)
#
# The latter form will create the type object by parsing the type declaration
#
# Alternatively, you can use a form accepting the following keyword arguments:
#
# * ordinal: int
# * name: str
# * til: til_t=None # `None` means `get_idati()`
#
# E.g.,
#
# * tinfo_t(ordinal=3)
# * tinfo_t(ordinal=10, til=get_idati())
# * tinfo_t(name="mytype_t")
# * tinfo_t(name="thattype_t", til=my_other_til)
#
# The constructor may raise an exception if data was invalid/parsing failed.
#
# @param decl_type A simple type
# @param decl A valid C declaration
# @param til A type library, or `None` to use the (`get_idati()`) default
# @param ordinal An ordinal in the type library
# @param name A valid type name
# @param pt_flags Parsing flags

tinfo_t.iter_struct() : generator of udm_t

# Iterate on the members composing this structure.
#
# Example:
#     til = ida_typeinf.get_idati()
#     tif = til.get_named_type("my_struc")
#     for udm in tif.iter_struct():
#         print(f"{udm.name} at bit offset {udm.offset}")
#
# Will raise an exception if this type is not a structure.
#
# @return a udm_t-producing generator

tinfo_t.iter_union() : generator of udm_t

# Iterate on the members composing this union.
#
# Example:
#     til = ida_typeinf.get_idati()
#     tif = til.get_named_type("my_union")
#     for udm in tif.iter_union():
#         print(f"{udm.name} with type {udm.type}")
#
# Will raise an exception if this type is not a union.
#
# @return a udm_t-producing generator

tinfo_t.iter_udt() : generator of udm_t

# Iterate on the members composing this structure, or union.
#
# Example:
#     til = ida_typeinf.get_idati()
#     tif = til.get_named_type("my_type")
#     for udm in tif.iter_udt():
#         print(f"{udm.name} at bit offset {udm.offset} with type {udm.type}")
#
# Will raise an exception if this type is not a structure, or union
#
# @return a udm_t-producing generator

tinfo_t.iter_enum() : generator of edm_t

# Iterate on the members composing this enumeration
#
# Example:
#     til = ida_typeinf.get_idati()
#     tif = til.get_named_type("my_enum")
#     for edm in tif.iter_enum():
#         print(f"{edm.name} = {edm.value}")
#
# Will raise an exception if this type is not an enumeration
#
# @return a edm_t-producing generator

Proposals

tinfo_t repr

Python>idati.get_named_type("Elf32_Vernaux")
<ida_typeinf.tinfo_t object "Elf32_Vernaux">

Or any alternatives that show module and class names instead of

Python>idati.get_named_type("Elf32_Vernaux")  # it's tinfo_t object, not a string
Elf32_Vernaux

All idapython default representation as __repr__

On typing objects Python interpreters show __repr__, but IDAPython shows __str__ Suggestion is to be synced with the interpreters and show __repr__

Effectively test

[v] pc_api_add_frame_member.elf
[?] pc_api_apply_callee_tinfo.elf
[ ] pc_api_change_stkvar_type.elf
[v] pc_api_create_array.elf
[v] pc_api_create_bfstruct.elf
[v] pc_api_create_bmenum.elf
[v] pc_api_create_libssh2_til.elf
[v] pc_api_create_struct_by_parsing.elf
[v] pc_api_create_user_shared_data.elf
[v] pc_api_del_struct_members.elf
[v] pc_api_func_ti_changed_listener.elf
[v] pc_api_gap_size_align_snippet.elf
[v] pc_api_get_best_fit_member.elf
[v] pc_api_get_innermost_member.elf
[v] pc_api_import_type_from_til.elf -> idapython-examples__import_type_from_til (requires UI)
[v] pc_api_insert_gap.elf
[v] pc_api_list_enum_member.elf
[v] pc_api_list_frame_info.elf
[v] pc_api_list_func_details.elf
[v] pc_api_list_struct_accesses.elf
[ ] pc_api_list_struct_member.elf
[ ] pc_api_list_struct_xrefs.elf
[ ] pc_api_list_union_member.elf
[ ] pc_api_mark_func_spoiled.elf
[ ] pc_api_operand_to_struct_member.elf
[ ] pc_api_setpehdr.elf
[ ] pc_api_visit_tinfo.elf