hexrays_sample7.cpp
#include <hexrays.hpp>
hexdsp_t *hexdsp = NULL;
static bool inited = false;
static int idaapi callback(void *, hexrays_event_t event, va_list va)
{
switch ( event )
{
case hxe_maturity:
{
cfunc_t *func = va_arg(va, cfunc_t *);
ctree_maturity_t mat = va_arg(va, ctree_maturity_t);
if ( mat == CMAT_BUILT )
{
struct cblock_visitor_t : public ctree_visitor_t
{
cblock_visitor_t(void) : ctree_visitor_t(CV_FAST) {}
int idaapi visit_insn(cinsn_t *ins)
{
if ( ins->op == cit_block )
dump_block(ins->ea, ins->cblock);
return 0;
}
void dump_block(ea_t ea, cblock_t *b)
{
msg("dumping block %a\n", ea);
for ( cblock_t::iterator p=b->begin(); p != b->end(); ++p )
{
cinsn_t &i = *p;
msg(" %a: insn %d\n", i.ea, i.op);
}
}
};
cblock_visitor_t cbv;
cbv.apply_to(&func->body, NULL);
}
}
break;
}
return 0;
}
int idaapi init(void)
{
if ( !init_hexrays_plugin() )
return PLUGIN_SKIP;
install_hexrays_callback(callback, NULL);
const char *hxver = get_hexrays_version();
msg("Hex-rays version %s has been detected, %s ready to use\n", hxver, PLUGIN.wanted_name);
inited = true;
return PLUGIN_KEEP;
}
void idaapi term(void)
{
if ( inited )
{
remove_hexrays_callback(callback, NULL);
term_hexrays_plugin();
}
}
void idaapi run(int)
{
}
static char comment[] = "Sample plugin7 for Hex-Rays decompiler";
plugin_t PLUGIN =
{
IDP_INTERFACE_VERSION,
PLUGIN_HIDE,
init,
term,
run,
comment,
"",
"Hex-Rays block iterator",
""
};