def add_idc_func(name, fp, args, defvals=None, flags=0): """ Extends the IDC language by exposing a new IDC function that is backed up by a Python function @param name: IDC function name to expose @param fp: Python callable that will receive the arguments and return a tuple. @param args: Arguments. A tuple of idaapi.VT_XXX constants @param flags: IDC function flags. A combination of EXTFUN_XXX constants @return: Boolean """ global __IDC_FUNC_CTXS # Get the context f = __IDC_FUNC_CTXS.get(name, None) # Registering a function that is already registered? if f is not None: # Unregister it first del_idc_func(name) # Convert the tupple argument info to a string args = "".join([chr(x) for x in args]) # make sure we don't have an obvious discrepancy between # the number of args, and the provided default values if len(defvals) > len(args): return False vdefvals = idc_values_t() if not _ida_expr.pyw_convert_defvals(vdefvals, defvals): return False # Create a context ctxptr = _ida_expr.pyw_register_idc_func(name, args, fp) if ctxptr == 0: return False # Bind the context with the IdcFunc object f = _IdcFunction(ctxptr) # Remember the Python context __IDC_FUNC_CTXS[name] = f # Register IDC function with a callback return _ida_expr.py_add_idc_func(name, f.fp_ptr, args, vdefvals, flags)
def pyw_convert_defvals(*args) -> "bool": r""" pyw_convert_defvals(out, py_seq) -> bool """ return _ida_expr.pyw_convert_defvals(*args)
def add_idc_func(name, fp, args, defvals=None, flags=0): """ Extends the IDC language by exposing a new IDC function that is backed up by a Python function @param name: IDC function name to expose @param fp: Python callable that will receive the arguments and return a tuple. @param args: Arguments. A tuple of idaapi.VT_XXX constants @param flags: IDC function flags. A combination of EXTFUN_XXX constants @return: Boolean Add an IDC function. This function does not modify the predefined kernel functions. Example: static error_t idaapi myfunc5(idc_value_t *argv, idc_value_t *res) { msg("myfunc is called with arg0=%a and arg1=%s\n", argv[0].num, argv[1].str); res->num = 5; // let's return 5 return eOk; } static const char myfunc5_args[] = { VT_LONG, VT_STR, 0 }; static const ext_idcfunc_t myfunc_desc = { "MyFunc5", myfunc5, myfunc5_args, NULL, 0, EXTFUN_BASE }; // after this: add_idc_func(myfunc_desc); // there is a new IDC function which can be called like this: MyFunc5(0x123, "test"); If the function already exists, it will be replaced by the new function @return: success """ global __IDC_FUNC_CTXS # Get the context f = __IDC_FUNC_CTXS.get(name, None) # Registering a function that is already registered? if f is not None: # Unregister it first del_idc_func(name) # Convert the tupple argument info to a string args = "".join([chr(x) for x in args]) # make sure we don't have an obvious discrepancy between # the number of args, and the provided default values if len(defvals) > len(args): return False vdefvals = idc_values_t() if not _ida_expr.pyw_convert_defvals(vdefvals, defvals): return False # Create a context ctxptr = _ida_expr.pyw_register_idc_func(name, args, fp) if ctxptr == 0: return False # Bind the context with the IdcFunc object f = _IdcFunction(ctxptr) # Remember the Python context __IDC_FUNC_CTXS[name] = f # Register IDC function with a callback return _ida_expr.py_add_idc_func(name, f.fp_ptr, args, vdefvals, flags)