def __call__(self): # FIXME: Hey-Rays bindings are broken # iflags = ida_hexrays.user_iflags_new() # for (cl_ea, cl_op), f in self.iflags: # cl = ida_hexrays.citem_locator_t(cl_ea, cl_op) # iflags.insert(cl, f) # ida_hexrays.save_user_iflags(self.ea, iflags) ida_hexrays.save_user_iflags(self.ea, ida_hexrays.user_iflags_new()) HexRaysEvent.refresh_pseudocode_view() cfunc = ida_hexrays.decompile(self.ea) for (cl_ea, cl_op), f in self.iflags: cl = ida_hexrays.citem_locator_t(cl_ea, cl_op) cfunc.set_user_iflags(cl, f) cfunc.save_user_iflags() HexRaysEvent.refresh_pseudocode_view()
def _get_user_iflags(ea): user_iflags = ida_hexrays.restore_user_iflags(ea) if user_iflags is None: user_iflags = ida_hexrays.user_iflags_new() iflags = [] it = ida_hexrays.user_iflags_begin(user_iflags) while it != ida_hexrays.user_iflags_end(user_iflags): cl = ida_hexrays.user_iflags_first(it) f = ida_hexrays.user_iflags_second(it) # Temporary while Hex-Rays fix their API def read_type_sign(obj): import ctypes import struct buf = ctypes.string_at(id(obj), 4) return struct.unpack('I', buf)[0] f = read_type_sign(f) iflags.append(((cl.ea, cl.op), f)) it = ida_hexrays.user_iflags_next(it) ida_hexrays.user_iflags_free(user_iflags) return iflags