def parse_declaration(declaration): m = re.search(r"^(\w+[ *]+)(\w+)(\[(\d+)\])?$", declaration) if m is None: logger.error( "Member declaration should be like `TYPE_NAME NAME[SIZE]` (Array is optional)" ) return type_name, field_name, _, arr_size = m.groups() if field_name[0].isdigit(): logger.error("Bad field name") return result = idc.ParseType(type_name, 0) if result is None: logger.error( "Failed to parse member type. It should be like `TYPE_NAME NAME[SIZE]` (Array is optional)" ) return _, tp, fld = result tinfo = idaapi.tinfo_t() tinfo.deserialize(idaapi.cvar.idati, tp, fld, None) if arr_size: assert tinfo.create_array(tinfo, int(arr_size)) return tinfo, field_name
def size(str): '''returns the size of a c declaration''' if not str.endswith(';'): str = str + ';' result = idc.ParseType(str, 0) if result is None: raise TypeError('Unable to parse C declaration %s' % repr(str)) _, type, _ = result return idc.SizeOf(type)
def activate(self): new_type_declaration = idaapi.askstr(0x100, self.type_name, "Enter type:") result = idc.ParseType(new_type_declaration, 0) if result is None: return _, tp, fld = result tinfo = idaapi.tinfo_t() tinfo.deserialize(idaapi.cvar.idati, tp, fld, None) self.tinfo = tinfo self.is_array = False
def __parse_declaration(declaration): m = re.search(r"^(\w+[ *]+)(\w+)$", declaration) if m is None: return type_name, field_name = m.groups() if field_name[0].isdigit(): print "[ERROR] Bad field name" return result = idc.ParseType(type_name, 0) if result is None: return _, tp, fld = result tinfo = idaapi.tinfo_t() tinfo.deserialize(idaapi.cvar.idati, tp, fld, None) return tinfo, field_name