示例#1
0
    def s_create():
        db = database.get()

        name = idaapi.askqstr('', 'Enter a class name')

        if name is None:
            return None

        if name in database.get().classes_by_name:
            idaapi.warning('That name is already used.')
            return None

        if not Class.s_name_is_valid(name):
            idaapi.warning('The class name "%s" is invalid.' % name)
            return None

        base_class = None
        base_name = idaapi.askqstr('', 'Enter a base class name (leave empty for none)')
        if base_name is None:
            return None
        if base_name:
            if base_name not in db.classes_by_name:
                idaapi.warning('The class "%s" is not in the database.' % base_name)
                return None
            else:
                base_class = db.classes_by_name[base_name]
                if not base_class.can_be_derived():
                    idaapi.warning('The class %s cannot be derived because the VTable is not setup correctly' % base_class.name)
                    return None

        return Class(name, base_class)

        '''
示例#2
0
    def try_set_typedef(self, t):
        val = idaapi.askqstr('', 'Enter typedef value')
        if val is None:
            return

        val_segs = val.split()
        itanium_mangler.fix_multi_seg_types(val_segs)
        if len(val_segs) != 1 or (
                val_segs[0] not in itanium_mangler.BUILTIN_TYPES
                and not itanium_mangler.check_identifier(val_segs[0])):
            idaapi.warning('That value is invalid.')
            return

        database.get().typedefs[t] = val.strip()
        self.update_list()
示例#3
0
    def handle_add(self):
        t = idaapi.askqstr('', 'Enter typedef name')
        if t is None:
            return

        if t in database.get().typedefs:
            idaapi.warning('That name is already used.')
            return

        if not itanium_mangler.check_identifier(t):
            idaapi.warning('That name is invalid.')
            return

        # Todo: prevent overwriting builtins

        self.try_set_typedef(t)
示例#4
0
    def handle_set_name(self):
        if self.edit_class is None:
            return

        new_name = idaapi.askqstr(self.edit_class.name, 'Enter a class name')
        if new_name is None or new_name == self.edit_class.name:
            return

        if new_name in database.get().classes_by_name:
            idaapi.warning('That name is already used.')
            return

        if not database_entries.Class.s_name_is_valid(new_name):
            idaapi.warning('The class name "%s" is invalid.' % new_name)
            return

        self.edit_class.rename(new_name)
        self.update_fields()
        self.parent_gui.update_class(self.edit_class)
示例#5
0
    def edit_deleted_virtual_vals(self):
        db = database.get()

        txt = idaapi.askqstr(
            ', '.join([('0x%X' % x) for x in db.deleted_virtual_vals]),
            "Enter deleted virtual values")
        if txt is None or not txt.strip():
            return

        new_deleted_virtual_vals = []

        for s in txt.split(','):
            try:
                new_deleted_virtual_vals.append(int(s, 0))
            except ValueError:
                idaapi.warning(
                    'Parsing "%s" failed. Deleted virtual values were not modified.'
                    % s)
                return

        db.deleted_virtual_vals = new_deleted_virtual_vals