mirror of
https://github.com/cemu-project/idapython.git
synced 2024-11-24 10:09:20 +01:00
bugfixes:
- ph_get_operand_info() would crash IDA sometimes - idc.SetBptCond() was broken - idc.GetFunctionCmt() was memory leaking - Form.GetFieldValue() was failing for numeric controls - Exceptions originating from the director classes will be displayed And other minor mods...
This commit is contained in:
parent
c29e1ef2da
commit
88aa875c55
@ -2418,10 +2418,7 @@ def GetLongPrm(offset):
|
|||||||
val = _IDC_GetAttr(idaapi.cvar.inf, _INFMAP, offset)
|
val = _IDC_GetAttr(idaapi.cvar.inf, _INFMAP, offset)
|
||||||
if offset == INF_PROCNAME:
|
if offset == INF_PROCNAME:
|
||||||
# procName is a character array
|
# procName is a character array
|
||||||
# strip it at the terminating zero
|
val = idaapi.as_cstr(val)
|
||||||
idx = val.find('\0')
|
|
||||||
if idx != -1:
|
|
||||||
val = val[:idx]
|
|
||||||
return val
|
return val
|
||||||
|
|
||||||
def GetShortPrm(offset):
|
def GetShortPrm(offset):
|
||||||
|
@ -155,7 +155,7 @@ Py_ssize_t pyvar_walk_list(
|
|||||||
PyObject *PyW_IntVecToPyList(const intvec_t &intvec);
|
PyObject *PyW_IntVecToPyList(const intvec_t &intvec);
|
||||||
|
|
||||||
// Converts an Python list to an intvec
|
// Converts an Python list to an intvec
|
||||||
void PyW_PyListToIntVec(PyObject *py_list, intvec_t &intvec);
|
bool PyW_PyListToIntVec(PyObject *py_list, intvec_t &intvec);
|
||||||
|
|
||||||
// Returns a reference to a class
|
// Returns a reference to a class
|
||||||
PyObject *get_idaapi_attr(const char *attr);
|
PyObject *get_idaapi_attr(const char *attr);
|
||||||
|
23
swig/dbg.i
23
swig/dbg.i
@ -6,7 +6,13 @@ typedef struct
|
|||||||
} regval_t;
|
} regval_t;
|
||||||
|
|
||||||
%ignore dbg;
|
%ignore dbg;
|
||||||
|
%ignore register_srcinfo_provider;
|
||||||
|
%ignore unregister_srcinfo_provider;
|
||||||
|
%ignore appcall_info_t;
|
||||||
%ignore get_manual_regions;
|
%ignore get_manual_regions;
|
||||||
|
%ignore internal_appcall;
|
||||||
|
%ignore internal_cleanup_appcall;
|
||||||
|
|
||||||
%ignore source_file_t;
|
%ignore source_file_t;
|
||||||
%ignore source_item_t;
|
%ignore source_item_t;
|
||||||
%ignore srcinfo_provider_t;
|
%ignore srcinfo_provider_t;
|
||||||
@ -15,6 +21,7 @@ typedef struct
|
|||||||
%ignore bpt_t::eval_cond;
|
%ignore bpt_t::eval_cond;
|
||||||
%ignore bpt_t::write;
|
%ignore bpt_t::write;
|
||||||
%ignore bpt_t::erase;
|
%ignore bpt_t::erase;
|
||||||
|
%ignore bpt_t::cndbody;
|
||||||
%rename (get_manual_regions) py_get_manual_regions;
|
%rename (get_manual_regions) py_get_manual_regions;
|
||||||
%ignore set_manual_regions;
|
%ignore set_manual_regions;
|
||||||
%ignore inform_idc_about_debthread;
|
%ignore inform_idc_about_debthread;
|
||||||
@ -28,6 +35,22 @@ static PyObject *meminfo_vec_t_to_py(meminfo_vec_t &areas);
|
|||||||
//</code(py_dbg)>
|
//</code(py_dbg)>
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
%extend bpt_t
|
||||||
|
{
|
||||||
|
PyObject *condition;
|
||||||
|
}
|
||||||
|
%{
|
||||||
|
PyObject *bpt_t_condition_get(bpt_t *bpt)
|
||||||
|
{
|
||||||
|
return PyString_FromString(bpt->cndbody.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void bpt_t_condition_set(bpt_t *bpt, PyObject *val)
|
||||||
|
{
|
||||||
|
if ( PyString_Check(val) )
|
||||||
|
bpt->cndbody = PyString_AsString(val);
|
||||||
|
}
|
||||||
|
%}
|
||||||
%inline %{
|
%inline %{
|
||||||
|
|
||||||
//<inline(py_dbg)>
|
//<inline(py_dbg)>
|
||||||
|
36
swig/funcs.i
36
swig/funcs.i
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
// FIXME: Are these really useful?
|
// FIXME: Are these really useful?
|
||||||
%ignore iterate_func_chunks;
|
%ignore iterate_func_chunks;
|
||||||
%ignore get_idasgn_desc;
|
|
||||||
%ignore get_idasgn_header_by_short_name;
|
%ignore get_idasgn_header_by_short_name;
|
||||||
|
|
||||||
// Kernel-only & unexported symbols
|
// Kernel-only & unexported symbols
|
||||||
@ -27,8 +26,13 @@
|
|||||||
%ignore create_func_eas_array;
|
%ignore create_func_eas_array;
|
||||||
%ignore auto_add_func_tails;
|
%ignore auto_add_func_tails;
|
||||||
%ignore read_tails;
|
%ignore read_tails;
|
||||||
|
|
||||||
|
%ignore get_idasgn_desc;
|
||||||
%rename (get_idasgn_desc) py_get_idasgn_desc;
|
%rename (get_idasgn_desc) py_get_idasgn_desc;
|
||||||
|
|
||||||
|
%ignore get_func_cmt;
|
||||||
|
%rename (get_func_cmt) py_get_func_cmt;
|
||||||
|
|
||||||
%include "funcs.hpp"
|
%include "funcs.hpp"
|
||||||
|
|
||||||
%clear(char *buf);
|
%clear(char *buf);
|
||||||
@ -65,9 +69,10 @@ def get_idasgn_desc(n):
|
|||||||
@param n: number of signature in the list (0..get_idasgn_qty()-1)
|
@param n: number of signature in the list (0..get_idasgn_qty()-1)
|
||||||
@return: None on failure or tuple(signame, optlibs)
|
@return: None on failure or tuple(signame, optlibs)
|
||||||
"""
|
"""
|
||||||
|
pass
|
||||||
#</pydoc>
|
#</pydoc>
|
||||||
*/
|
*/
|
||||||
static PyObject *ida_export py_get_idasgn_desc(int n)
|
static PyObject *py_get_idasgn_desc(int n)
|
||||||
{
|
{
|
||||||
char signame[MAXSTR];
|
char signame[MAXSTR];
|
||||||
char optlibs[MAXSTR];
|
char optlibs[MAXSTR];
|
||||||
@ -78,4 +83,31 @@ static PyObject *ida_export py_get_idasgn_desc(int n)
|
|||||||
return Py_BuildValue("(ss)", signame, optlibs);
|
return Py_BuildValue("(ss)", signame, optlibs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
#<pydoc>
|
||||||
|
def get_func_cmt(fn, repeatable):
|
||||||
|
"""
|
||||||
|
Retrieve function comment
|
||||||
|
@param fn: function instance
|
||||||
|
@param repeatable: retrieve repeatable or non-repeatable comments
|
||||||
|
@return: None on failure or the comment
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
#</pydoc>
|
||||||
|
*/
|
||||||
|
static PyObject *py_get_func_cmt(func_t *fn, bool repeatable)
|
||||||
|
{
|
||||||
|
char *s = get_func_cmt(fn, repeatable);
|
||||||
|
if ( s == NULL )
|
||||||
|
{
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PyObject *py_s = PyString_FromString(s);
|
||||||
|
qfree(s);
|
||||||
|
return py_s;
|
||||||
|
}
|
||||||
|
}
|
||||||
%}
|
%}
|
||||||
|
@ -407,7 +407,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// a graph viewer lost focus
|
// a graph viewer lost focus
|
||||||
void on_lostfocus(graph_viewer_t *gv)
|
void on_lostfocus(graph_viewer_t * /*gv*/)
|
||||||
{
|
{
|
||||||
PYW_GIL_ENSURE;
|
PYW_GIL_ENSURE;
|
||||||
PyObject *result = PyObject_CallMethod(
|
PyObject *result = PyObject_CallMethod(
|
||||||
@ -700,7 +700,7 @@ private:
|
|||||||
self = NULL;
|
self = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SelectNode(PyObject *self, int nid)
|
static void SelectNode(PyObject *self, int /*nid*/)
|
||||||
{
|
{
|
||||||
py_graph_t *_this = extract_this(self);
|
py_graph_t *_this = extract_this(self);
|
||||||
if ( _this == NULL || _this->form == NULL )
|
if ( _this == NULL || _this->form == NULL )
|
||||||
|
@ -153,7 +153,7 @@ class pycvt_t
|
|||||||
else if ( (ft > FT_FIRST_NUM && ft < FT_LAST_NUM) && PyW_GetNumber(py_attr, &val.u64) )
|
else if ( (ft > FT_FIRST_NUM && ft < FT_LAST_NUM) && PyW_GetNumber(py_attr, &val.u64) )
|
||||||
; // nothing to be done
|
; // nothing to be done
|
||||||
// A string array?
|
// A string array?
|
||||||
else if ( (ft == FT_STRARR || ft == FT_NUM16ARR || FT_CHRARR_STATIC )
|
else if ( (ft == FT_STRARR || ft == FT_NUM16ARR || ft == FT_CHRARR_STATIC )
|
||||||
&& (PyList_CheckExact(py_attr) || PyW_IsSequenceType(py_attr)) )
|
&& (PyList_CheckExact(py_attr) || PyW_IsSequenceType(py_attr)) )
|
||||||
{
|
{
|
||||||
// Return a reference to the attribute
|
// Return a reference to the attribute
|
||||||
@ -492,7 +492,7 @@ PyObject *PyW_IntVecToPyList(const intvec_t &intvec)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
static int idaapi pylist_to_intvec_cb(
|
static int idaapi pylist_to_intvec_cb(
|
||||||
PyObject *py_item,
|
PyObject *py_item,
|
||||||
Py_ssize_t index,
|
Py_ssize_t /*index*/,
|
||||||
void *ud)
|
void *ud)
|
||||||
{
|
{
|
||||||
intvec_t &intvec = *(intvec_t *)ud;
|
intvec_t &intvec = *(intvec_t *)ud;
|
||||||
@ -504,10 +504,10 @@ static int idaapi pylist_to_intvec_cb(
|
|||||||
return CIP_OK;
|
return CIP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PyW_PyListToIntVec(PyObject *py_list, intvec_t &intvec)
|
bool PyW_PyListToIntVec(PyObject *py_list, intvec_t &intvec)
|
||||||
{
|
{
|
||||||
intvec.clear();
|
intvec.clear();
|
||||||
(void)pyvar_walk_list(py_list, pylist_to_intvec_cb, &intvec);
|
return pyvar_walk_list(py_list, pylist_to_intvec_cb, &intvec) != CIP_FAILED;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -1207,9 +1207,9 @@ int pyvar_to_idcvar(
|
|||||||
idc_var->set_int64(PyLong_AsLongLong(attr));
|
idc_var->set_int64(PyLong_AsLongLong(attr));
|
||||||
Py_DECREF(attr);
|
Py_DECREF(attr);
|
||||||
return CIP_OK;
|
return CIP_OK;
|
||||||
//
|
//
|
||||||
// BYREF
|
// BYREF
|
||||||
//
|
//
|
||||||
case PY_ICID_BYREF:
|
case PY_ICID_BYREF:
|
||||||
{
|
{
|
||||||
// BYREF always require this parameter
|
// BYREF always require this parameter
|
||||||
@ -1822,6 +1822,7 @@ import struct
|
|||||||
import traceback
|
import traceback
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import bisect
|
||||||
import __builtin__
|
import __builtin__
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
@ -1852,6 +1853,13 @@ PY_ICID_BYREF = 1
|
|||||||
PY_ICID_OPAQUE = 2
|
PY_ICID_OPAQUE = 2
|
||||||
"""opaque object"""
|
"""opaque object"""
|
||||||
|
|
||||||
|
# Step trace options (used with set_step_trace_options())
|
||||||
|
ST_OVER_DEBUG_SEG = 0x01
|
||||||
|
"""step tracing will be disabled when IP is in a debugger segment"""
|
||||||
|
|
||||||
|
ST_OVER_LIB_FUNC = 0x02
|
||||||
|
"""step tracing will be disabled when IP is in a library function"""
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
class pyidc_opaque_object_t(object):
|
class pyidc_opaque_object_t(object):
|
||||||
"""This is the base class for all Python<->IDC opaque objects"""
|
"""This is the base class for all Python<->IDC opaque objects"""
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
%ignore debugger_t;
|
%ignore debugger_t;
|
||||||
%ignore memory_info_t;
|
%ignore memory_info_t;
|
||||||
|
%ignore lowcnd_t;
|
||||||
|
%ignore lowcnd_vec_t;
|
||||||
|
%ignore update_bpt_info_t;
|
||||||
|
%ignore update_bpt_vec_t;
|
||||||
%ignore register_info_t;
|
%ignore register_info_t;
|
||||||
%ignore appcall;
|
%ignore appcall;
|
||||||
%ignore idd_opinfo_t;
|
%ignore idd_opinfo_t;
|
||||||
@ -355,7 +359,8 @@ static PyObject *dbg_get_name()
|
|||||||
{
|
{
|
||||||
if ( dbg == NULL )
|
if ( dbg == NULL )
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
return PyString_FromString(dbg->name);
|
else
|
||||||
|
return PyString_FromString(dbg->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
25
swig/idp.i
25
swig/idp.i
@ -421,8 +421,7 @@ static PyObject *ph_get_operand_info(
|
|||||||
// Allocate register space
|
// Allocate register space
|
||||||
thid_t tid = get_current_thread();
|
thid_t tid = get_current_thread();
|
||||||
regvals_t regvalues;
|
regvals_t regvalues;
|
||||||
regvalues.reserve(dbg->registers_size);
|
regvalues.resize(dbg->registers_size);
|
||||||
|
|
||||||
// Read registers
|
// Read registers
|
||||||
if ( dbg->read_registers(tid, -1, regvalues.begin()) != 1 )
|
if ( dbg->read_registers(tid, -1, regvalues.begin()) != 1 )
|
||||||
break;
|
break;
|
||||||
@ -809,22 +808,22 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int is_call_insn(ea_t ea)
|
virtual int is_call_insn(ea_t /*ea*/)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int is_ret_insn(ea_t ea, bool strict)
|
virtual int is_ret_insn(ea_t /*ea*/, bool /*strict*/)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual PyObject *assemble(
|
virtual PyObject *assemble(
|
||||||
ea_t ea,
|
ea_t /*ea*/,
|
||||||
ea_t cs,
|
ea_t /*cs*/,
|
||||||
ea_t ip,
|
ea_t /*ip*/,
|
||||||
bool use32,
|
bool /*use32*/,
|
||||||
const char *line)
|
const char * /*line*/)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1070,9 +1069,9 @@ int idaapi IDP_Callback(void *ud, int notification_code, va_list va)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Swig::DirectorException &)
|
catch (Swig::DirectorException &e)
|
||||||
{
|
{
|
||||||
msg("Exception in IDP Hook function:\n");
|
msg("Exception in IDP Hook function: %s\n", e.getMessage());
|
||||||
if ( PyErr_Occurred() )
|
if ( PyErr_Occurred() )
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
}
|
}
|
||||||
@ -1249,9 +1248,9 @@ int idaapi IDB_Callback(void *ud, int notification_code, va_list va)
|
|||||||
return proxy->segm_moved(ea, ea2, size);
|
return proxy->segm_moved(ea, ea2, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Swig::DirectorException &)
|
catch (Swig::DirectorException &e)
|
||||||
{
|
{
|
||||||
msg("Exception in IDB Hook function:\n");
|
msg("Exception in IDB Hook function: %s\n", e.getMessage());
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
{
|
{
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
|
134
swig/kernwin.i
134
swig/kernwin.i
@ -11,6 +11,10 @@
|
|||||||
%rename (del_menu_item) py_del_menu_item;
|
%rename (del_menu_item) py_del_menu_item;
|
||||||
%ignore vwarning;
|
%ignore vwarning;
|
||||||
|
|
||||||
|
%ignore choose_idasgn;
|
||||||
|
%rename (choose_idasgn) py_choose_idasgn;
|
||||||
|
|
||||||
|
|
||||||
%ignore msg;
|
%ignore msg;
|
||||||
%rename (msg) py_msg;
|
%rename (msg) py_msg;
|
||||||
|
|
||||||
@ -105,7 +109,22 @@ void refresh_lists(void)
|
|||||||
|
|
||||||
%inline %{
|
%inline %{
|
||||||
//<inline(py_kernwin)>
|
//<inline(py_kernwin)>
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
|
static PyObject *py_choose_idasgn()
|
||||||
|
{
|
||||||
|
char *name = choose_idasgn();
|
||||||
|
if ( name == NULL )
|
||||||
|
{
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PyObject *py_str = PyString_FromString(name);
|
||||||
|
qfree(name);
|
||||||
|
return py_str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
/*
|
/*
|
||||||
@ -416,6 +435,7 @@ class UI_Hooks(object):
|
|||||||
|
|
||||||
@return: Ignored
|
@return: Ignored
|
||||||
"""
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
#</pydoc>
|
#</pydoc>
|
||||||
*/
|
*/
|
||||||
@ -436,7 +456,7 @@ public:
|
|||||||
return unhook_from_notification_point(HT_UI, UI_Callback, this);
|
return unhook_from_notification_point(HT_UI, UI_Callback, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int preprocess(const char *name)
|
virtual int preprocess(const char * /*name*/)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -586,18 +606,6 @@ static void formchgcbfa_refresh_field(size_t p_fa, int fid)
|
|||||||
return fa->refresh_field(fid);
|
return fa->refresh_field(fid);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
static void formchgcbfa_set_field_value(
|
|
||||||
size_t p_fa,
|
|
||||||
int fid,
|
|
||||||
int ft,
|
|
||||||
PyObject *py_val,
|
|
||||||
size_t sz)
|
|
||||||
{
|
|
||||||
DECLARE_FORM_ACTIONS;
|
|
||||||
return fa->refresh_field(fid);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
static PyObject *formchgcbfa_get_field_value(
|
static PyObject *formchgcbfa_get_field_value(
|
||||||
size_t p_fa,
|
size_t p_fa,
|
||||||
@ -609,7 +617,7 @@ static PyObject *formchgcbfa_get_field_value(
|
|||||||
switch ( ft )
|
switch ( ft )
|
||||||
{
|
{
|
||||||
// button - uint32
|
// button - uint32
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
uint32 val;
|
uint32 val;
|
||||||
if ( fa->get_field_value(fid, &val) )
|
if ( fa->get_field_value(fid, &val) )
|
||||||
@ -617,7 +625,7 @@ static PyObject *formchgcbfa_get_field_value(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// ushort
|
// ushort
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
ushort val;
|
ushort val;
|
||||||
if ( fa->get_field_value(fid, &val) )
|
if ( fa->get_field_value(fid, &val) )
|
||||||
@ -625,7 +633,7 @@ static PyObject *formchgcbfa_get_field_value(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// string label
|
// string label
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
char val[MAXSTR];
|
char val[MAXSTR];
|
||||||
if ( fa->get_field_value(fid, val) )
|
if ( fa->get_field_value(fid, val) )
|
||||||
@ -633,7 +641,7 @@ static PyObject *formchgcbfa_get_field_value(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// string input
|
// string input
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
qstring val;
|
qstring val;
|
||||||
val.resize(sz + 1);
|
val.resize(sz + 1);
|
||||||
@ -641,7 +649,7 @@ static PyObject *formchgcbfa_get_field_value(
|
|||||||
return PyString_FromString(val.begin());
|
return PyString_FromString(val.begin());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 5:
|
case 5:
|
||||||
{
|
{
|
||||||
intvec_t intvec;
|
intvec_t intvec;
|
||||||
// Returned as 1-base
|
// Returned as 1-base
|
||||||
@ -653,6 +661,54 @@ static PyObject *formchgcbfa_get_field_value(
|
|||||||
|
|
||||||
return PyW_IntVecToPyList(intvec);
|
return PyW_IntVecToPyList(intvec);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Numeric control
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
sel_t sel;
|
||||||
|
sval_t sval;
|
||||||
|
uval_t uval;
|
||||||
|
ulonglong ull;
|
||||||
|
} u;
|
||||||
|
switch ( sz )
|
||||||
|
{
|
||||||
|
case 'S': // sel_t
|
||||||
|
{
|
||||||
|
if ( fa->get_field_value(fid, &u.sel) )
|
||||||
|
return Py_BuildValue(PY_FMT64, u.sel);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// sval_t
|
||||||
|
case 'n':
|
||||||
|
case 'N':
|
||||||
|
case 'D':
|
||||||
|
case 'O':
|
||||||
|
case 'Y':
|
||||||
|
case 'H':
|
||||||
|
{
|
||||||
|
if ( fa->get_field_value(fid, &u.sval) )
|
||||||
|
return Py_BuildValue(PY_SFMT64, u.sval);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'L': // uint64
|
||||||
|
case 'l': // int64
|
||||||
|
{
|
||||||
|
if ( fa->get_field_value(fid, &u.ull) )
|
||||||
|
return Py_BuildValue(sz == 'L' ? "K" : "L", u.ull);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'M': // uval_t
|
||||||
|
case '$': // ea_t
|
||||||
|
{
|
||||||
|
if ( fa->get_field_value(fid, &u.uval) )
|
||||||
|
return Py_BuildValue(PY_FMT64, u.uval);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
@ -670,39 +726,44 @@ static bool formchgcbfa_set_field_value(
|
|||||||
switch ( ft )
|
switch ( ft )
|
||||||
{
|
{
|
||||||
// button - uint32
|
// button - uint32
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
uint32 val = PyLong_AsUnsignedLong(py_val);
|
uint32 val = PyLong_AsUnsignedLong(py_val);
|
||||||
return fa->set_field_value(fid, &val);
|
return fa->set_field_value(fid, &val);
|
||||||
}
|
}
|
||||||
// ushort
|
// ushort
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
ushort val = PyLong_AsUnsignedLong(py_val) & 0xffff;
|
ushort val = PyLong_AsUnsignedLong(py_val) & 0xffff;
|
||||||
return fa->set_field_value(fid, &val);
|
return fa->set_field_value(fid, &val);
|
||||||
}
|
}
|
||||||
// strings
|
// strings
|
||||||
case 3:
|
case 3:
|
||||||
case 1:
|
case 1:
|
||||||
return fa->set_field_value(fid, PyString_AsString(py_val));
|
return fa->set_field_value(fid, PyString_AsString(py_val));
|
||||||
// intvec_t
|
// intvec_t
|
||||||
case 5:
|
case 5:
|
||||||
{
|
{
|
||||||
intvec_t intvec;
|
intvec_t intvec;
|
||||||
// Passed as 0-based
|
// Passed as 0-based
|
||||||
PyW_PyListToIntVec(py_val, intvec);
|
if ( !PyW_PyListToIntVec(py_val, intvec) )
|
||||||
|
break;
|
||||||
|
|
||||||
// Make 1-based
|
// Make 1-based
|
||||||
for ( intvec_t::iterator it=intvec.begin(); it != intvec.end(); ++it)
|
for ( intvec_t::iterator it=intvec.begin(); it != intvec.end(); ++it)
|
||||||
(*it)++;
|
(*it)++;
|
||||||
|
|
||||||
bool ok = fa->set_field_value(fid, &intvec);
|
return fa->set_field_value(fid, &intvec);
|
||||||
return ok;
|
}
|
||||||
|
// Numeric
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
uint64 num;
|
||||||
|
if ( PyW_GetNumber(py_val, &num) )
|
||||||
|
return fa->set_field_value(fid, &num);
|
||||||
}
|
}
|
||||||
// unknown
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef DECLARE_FORM_ACTIONS
|
#undef DECLARE_FORM_ACTIONS
|
||||||
@ -739,9 +800,9 @@ int idaapi UI_Callback(void *ud, int notification_code, va_list va)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Swig::DirectorException &)
|
catch (Swig::DirectorException &e)
|
||||||
{
|
{
|
||||||
msg("Exception in UI Hook function:\n");
|
msg("Exception in UI Hook function: %s\n", e.getMessage());
|
||||||
if ( PyErr_Occurred() )
|
if ( PyErr_Occurred() )
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
}
|
}
|
||||||
@ -768,7 +829,7 @@ bool idaapi py_menu_item_callback(void *userdata)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ret = PyObject_IsTrue(result);
|
bool ret = PyObject_IsTrue(result) != 0;
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2331,7 +2392,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The user clicked
|
// The user clicked
|
||||||
static bool idaapi s_cv_click(TCustomControl *cv, int shift, void *ud)
|
static bool idaapi s_cv_click(TCustomControl * /*cv*/, int shift, void *ud)
|
||||||
{
|
{
|
||||||
customviewer_t *_this = (customviewer_t *)ud;
|
customviewer_t *_this = (customviewer_t *)ud;
|
||||||
return _this->on_click(shift);
|
return _this->on_click(shift);
|
||||||
@ -3675,7 +3736,7 @@ class Form(object):
|
|||||||
def __init__(self, tp, value):
|
def __init__(self, tp, value):
|
||||||
cls = Form.fieldtype_to_ctype(tp, self.DefI64)
|
cls = Form.fieldtype_to_ctype(tp, self.DefI64)
|
||||||
if cls is None:
|
if cls is None:
|
||||||
raise TypeError("Invalid field type: %s" % tp)
|
raise TypeError("Invalid numeric field type: %s" % tp)
|
||||||
# Get a pointer type to the ctype type
|
# Get a pointer type to the ctype type
|
||||||
self.arg = pointer(cls(value))
|
self.arg = pointer(cls(value))
|
||||||
|
|
||||||
@ -4566,7 +4627,7 @@ class Form(object):
|
|||||||
Converts a control object to a tuple containing the field id
|
Converts a control object to a tuple containing the field id
|
||||||
and the associated buffer size
|
and the associated buffer size
|
||||||
"""
|
"""
|
||||||
# Input control depend on the associate buffer size (supplied by the user)
|
# Input control depend on the associated buffer size (supplied by the user)
|
||||||
|
|
||||||
# Make sure you check instances types taking into account inheritance
|
# Make sure you check instances types taking into account inheritance
|
||||||
if isinstance(ctrl, Form.EmbeddedChooserControl):
|
if isinstance(ctrl, Form.EmbeddedChooserControl):
|
||||||
@ -4578,6 +4639,9 @@ class Form(object):
|
|||||||
return (3, min(_idaapi.MAXSTR, ctrl.size))
|
return (3, min(_idaapi.MAXSTR, ctrl.size))
|
||||||
elif isinstance(ctrl, Form.ColorInput):
|
elif isinstance(ctrl, Form.ColorInput):
|
||||||
return (4, 0)
|
return (4, 0)
|
||||||
|
elif isinstance(ctrl, Form.NumericInput):
|
||||||
|
# Pass the numeric control type
|
||||||
|
return (6, ord(ctrl.tp[0]))
|
||||||
elif isinstance(ctrl, Form.InputControl):
|
elif isinstance(ctrl, Form.InputControl):
|
||||||
return (1, ctrl.size)
|
return (1, ctrl.size)
|
||||||
else:
|
else:
|
||||||
|
10
swig/name.i
10
swig/name.i
@ -11,7 +11,6 @@
|
|||||||
%ignore get_struct_operand;
|
%ignore get_struct_operand;
|
||||||
%ignore set_debug_names;
|
%ignore set_debug_names;
|
||||||
%ignore get_debug_name;
|
%ignore get_debug_name;
|
||||||
%ignore get_debug_names;
|
|
||||||
%ignore nameVa;
|
%ignore nameVa;
|
||||||
|
|
||||||
// Unexported & kernel-only
|
// Unexported & kernel-only
|
||||||
@ -31,8 +30,11 @@
|
|||||||
%ignore is_exit_name;
|
%ignore is_exit_name;
|
||||||
%ignore dummy_name_ea;
|
%ignore dummy_name_ea;
|
||||||
|
|
||||||
|
%ignore get_debug_names;
|
||||||
%rename (get_debug_names) py_get_debug_names;
|
%rename (get_debug_names) py_get_debug_names;
|
||||||
%inline %{
|
%inline %{
|
||||||
|
//<inline(py_name)>
|
||||||
|
//------------------------------------------------------------------------
|
||||||
PyObject *py_get_debug_names(ea_t ea1, ea_t ea2)
|
PyObject *py_get_debug_names(ea_t ea1, ea_t ea2)
|
||||||
{
|
{
|
||||||
// Get debug names
|
// Get debug names
|
||||||
@ -50,11 +52,12 @@ PyObject *py_get_debug_names(ea_t ea1, ea_t ea2)
|
|||||||
}
|
}
|
||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
//</inline(py_name)>
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%pythoncode %{
|
%pythoncode %{
|
||||||
|
#<pycode(py_name)>
|
||||||
import bisect
|
|
||||||
|
|
||||||
class NearestName:
|
class NearestName:
|
||||||
"""
|
"""
|
||||||
@ -103,5 +106,6 @@ class NearestName:
|
|||||||
raise StopIteration
|
raise StopIteration
|
||||||
return self._get_item(index)
|
return self._get_item(index)
|
||||||
|
|
||||||
|
#</pycode(py_name)>
|
||||||
%}
|
%}
|
||||||
%include "name.hpp"
|
%include "name.hpp"
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
%ignore reloc_info_t; // swig under mac chokes on this
|
%ignore reloc_info_t; // swig under mac chokes on this
|
||||||
|
|
||||||
%ignore qmutex_create;
|
%ignore qmutex_create;
|
||||||
|
%ignore qiterator;
|
||||||
|
%ignore qrefcnt_t;
|
||||||
%ignore qmutex_free;
|
%ignore qmutex_free;
|
||||||
%ignore qmutex_lock;
|
%ignore qmutex_lock;
|
||||||
%ignore qmutex_t;
|
%ignore qmutex_t;
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
// Add a get_member() member function to struc_t.
|
// Add a get_member() member function to struc_t.
|
||||||
// This helps to access the members array in the class.
|
// This helps to access the members array in the class.
|
||||||
%extend struc_t {
|
%extend struc_t {
|
||||||
member_t * get_member(int index) { return &(self->members[index]); }
|
member_t *get_member(int index) { return &(self->members[index]); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,11 +32,7 @@
|
|||||||
$1 = MAXSTR;
|
$1 = MAXSTR;
|
||||||
}
|
}
|
||||||
%typemap(in,numinputs=0) (TYPEMAP, SIZE) {
|
%typemap(in,numinputs=0) (TYPEMAP, SIZE) {
|
||||||
#ifdef __cplusplus
|
$1 = ($1_ltype) qalloc(MAXSTR+1);
|
||||||
$1 = ($1_ltype) new char[MAXSTR+1];
|
|
||||||
#else
|
|
||||||
$1 = ($1_ltype) malloc(MAXSTR+1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
%typemap(out) ssize_t {
|
%typemap(out) ssize_t {
|
||||||
/* REMOVING ssize_t return value in $symname */
|
/* REMOVING ssize_t return value in $symname */
|
||||||
@ -51,11 +47,7 @@
|
|||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
resultobj = Py_None;
|
resultobj = Py_None;
|
||||||
}
|
}
|
||||||
#ifdef __cplusplus
|
qfree($1);
|
||||||
delete [] $1;
|
|
||||||
#else
|
|
||||||
free($1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
%enddef
|
%enddef
|
||||||
|
|
||||||
@ -85,11 +77,7 @@
|
|||||||
$1 = MAXSPECSIZE;
|
$1 = MAXSPECSIZE;
|
||||||
}
|
}
|
||||||
%typemap(in,numinputs=0) (TYPEMAP, SIZE) {
|
%typemap(in,numinputs=0) (TYPEMAP, SIZE) {
|
||||||
#ifdef __cplusplus
|
$1 = (char *) qalloc(MAXSPECSIZE+1);
|
||||||
$1 = (char *) new char[MAXSPECSIZE+1];
|
|
||||||
#else
|
|
||||||
$1 = (char *) malloc(MAXSPECSIZE+1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
%typemap(out) ssize_t {
|
%typemap(out) ssize_t {
|
||||||
/* REMOVING ssize_t return value in $symname */
|
/* REMOVING ssize_t return value in $symname */
|
||||||
@ -104,11 +92,7 @@
|
|||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
resultobj = Py_None;
|
resultobj = Py_None;
|
||||||
}
|
}
|
||||||
#ifdef __cplusplus
|
qfree((void *)$1);
|
||||||
delete [] (char *)$1;
|
|
||||||
#else
|
|
||||||
free((char *)$1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
%enddef
|
%enddef
|
||||||
|
|
||||||
@ -118,11 +102,7 @@
|
|||||||
$1 = &ressize;
|
$1 = &ressize;
|
||||||
}
|
}
|
||||||
%typemap(in,numinputs=0) (TYPEMAP, SIZE) {
|
%typemap(in,numinputs=0) (TYPEMAP, SIZE) {
|
||||||
#ifdef __cplusplus
|
$1 = (char *) qalloc(MAXSPECSIZE+1);
|
||||||
$1 = (char *) new char[MAXSPECSIZE+1];
|
|
||||||
#else
|
|
||||||
$1 = (char *) malloc(MAXSPECSIZE+1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
%typemap(out) ssize_t {
|
%typemap(out) ssize_t {
|
||||||
/* REMOVING ssize_t return value in $symname */
|
/* REMOVING ssize_t return value in $symname */
|
||||||
@ -137,11 +117,7 @@
|
|||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
resultobj = Py_None;
|
resultobj = Py_None;
|
||||||
}
|
}
|
||||||
#ifdef __cplusplus
|
qfree((void *)$1);
|
||||||
delete [] (char *)$1;
|
|
||||||
#else
|
|
||||||
free((char *)$1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
%enddef
|
%enddef
|
||||||
|
|
||||||
|
@ -150,6 +150,10 @@
|
|||||||
%ignore regobj_t;
|
%ignore regobj_t;
|
||||||
%ignore build_func_type;
|
%ignore build_func_type;
|
||||||
|
|
||||||
|
%ignore append_type_name;
|
||||||
|
%ignore for_all_types_ex;
|
||||||
|
%ignore pdb2ti;
|
||||||
|
|
||||||
%include "typeinf.hpp"
|
%include "typeinf.hpp"
|
||||||
|
|
||||||
// Custom wrappers
|
// Custom wrappers
|
||||||
|
@ -414,7 +414,7 @@ static PyObject *py_get_global_cmd_link()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
PyObject *insn_t_is_canon_insn(int itype)
|
static PyObject *insn_t_is_canon_insn(int itype)
|
||||||
{
|
{
|
||||||
if ( ph.is_canon_insn(itype) )
|
if ( ph.is_canon_insn(itype) )
|
||||||
Py_RETURN_TRUE;
|
Py_RETURN_TRUE;
|
||||||
@ -423,13 +423,13 @@ PyObject *insn_t_is_canon_insn(int itype)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
PyObject *insn_t_get_canon_feature(int itype)
|
static PyObject *insn_t_get_canon_feature(int itype)
|
||||||
{
|
{
|
||||||
return Py_BuildValue("I", ph.is_canon_insn(itype) ? ph.instruc[itype-ph.instruc_start].feature : 0);
|
return Py_BuildValue("I", ph.is_canon_insn(itype) ? ph.instruc[itype-ph.instruc_start].feature : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
PyObject *insn_t_get_canon_mnem(int itype)
|
static PyObject *insn_t_get_canon_mnem(int itype)
|
||||||
{
|
{
|
||||||
if ( ph.is_canon_insn(itype) )
|
if ( ph.is_canon_insn(itype) )
|
||||||
return Py_BuildValue("s", ph.instruc[itype-ph.instruc_start].name);
|
return Py_BuildValue("s", ph.instruc[itype-ph.instruc_start].name);
|
||||||
|
Loading…
Reference in New Issue
Block a user