def xref_or_find(self, addr, allow_many=False): lrefs = list(DataRefsTo(addr)) if len(lrefs) == 0: lrefs = list(idautils.refs(addr, self.ptrfirst, self.ptrnext)) if len(lrefs) > 1 and not allow_many: print("too many xrefs to %08X" % addr) return [] lrefs = [r for r in lrefs if not isCode(get_full_flags(r))] return lrefs
def _update_from_ptr(ptr, struc, track_members): for xref in map(lambda x: Instruction(x), DataRefsTo(ptr.addr)): if xref.mnem == "mov" and xref[0].type == o_reg and xref[1].type == o_mem: if xref[0].type == o_reg: print("Working on xref: %s" % xref) track = start_track( next_addr(xref.ea), {xref[0].reg: struc}, types_to_track=(Register, Structure, StructureMember, Pointer), allow_members=True, ) _update_structs_from_track(track) else: print("Skipping xref: %s" % xref)