aboutsummaryrefslogtreecommitdiff
path: root/VMProtect/models.h
diff options
context:
space:
mode:
Diffstat (limited to 'VMProtect/models.h')
-rw-r--r--VMProtect/models.h488
1 files changed, 488 insertions, 0 deletions
diff --git a/VMProtect/models.h b/VMProtect/models.h
new file mode 100644
index 0000000..6e9ac0b
--- /dev/null
+++ b/VMProtect/models.h
@@ -0,0 +1,488 @@
+#ifndef MODELS_H
+#define MODELS_H
+
+#include "widgets.h"
+
+class Folder;
+class IFunction;
+class License;
+class FileFolder;
+class InternalFile;
+class PropertyManager;
+
+enum NodeType {
+ NODE_ROOT,
+ NODE_ARCHITECTURE,
+ NODE_OPTIONS,
+ NODE_SCRIPT,
+ NODE_SCRIPT_BOOKMARK,
+ NODE_LOAD_COMMANDS,
+ NODE_LOAD_COMMAND,
+ NODE_SEGMENTS,
+ NODE_SEGMENT,
+ NODE_SECTION,
+ NODE_IMPORTS,
+ NODE_IMPORT,
+ NODE_IMPORT_FOLDER,
+ NODE_IMPORT_FUNCTION,
+ NODE_EXPORTS,
+ NODE_EXPORT_FOLDER,
+ NODE_EXPORT,
+ NODE_MAP_FOLDER,
+ NODE_MAP_FUNCTION,
+ NODE_FUNCTIONS,
+ NODE_FOLDER,
+ NODE_FUNCTION,
+ NODE_RESOURCES,
+ NODE_RESOURCE_FOLDER,
+ NODE_RESOURCE,
+ NODE_LICENSES,
+ NODE_LICENSE,
+ NODE_FILES,
+ NODE_FILE,
+ NODE_FILE_FOLDER,
+ NODE_COMMAND,
+ NODE_WATERMARK,
+ NODE_PROPERTY,
+ NODE_DUMP,
+ NODE_CALC,
+ NODE_MESSAGE,
+ NODE_WARNING,
+ NODE_ERROR,
+ NODE_TEMPLATE,
+ NODE_ASSEMBLIES,
+};
+
+class ProjectNode
+{
+public:
+ ProjectNode(ProjectNode *parent, NodeType type, void *data = NULL);
+ ~ProjectNode();
+ void clear();
+ NodeType type() const { return type_; }
+ QString text(int column = 0) const;
+ bool contains(const QRegExp &filter) const;
+ QString path() const;
+ void *data() const { return data_; }
+ QIcon icon() const { return icon_; }
+ ProjectNode *child(int index) const { return children_[index]; };
+ int childCount() const { return children_.size(); }
+ void setData(void *data) { data_ = data; }
+ void setText(const QString &text) { text_ = text; }
+ void setIcon(const QIcon &icon) { icon_ = icon; }
+ QList<ProjectNode *> children() const { return children_; };
+ ProjectNode *parent() const { return parent_; };
+ void addChild(ProjectNode *child);
+ void insertChild(int index, ProjectNode *child);
+ void removeChild(ProjectNode *child);
+ void setPropertyManager(PropertyManager *propertyManager);
+ ProjectNode *properties() const { return properties_; };
+ void localize();
+private:
+ ProjectNode *parent_;
+ void *data_;
+ NodeType type_;
+ QString text_;
+ QIcon icon_;
+ QList<ProjectNode *> children_;
+ ProjectNode *properties_;
+
+ // no copy ctr or assignment op
+ ProjectNode(const ProjectNode &);
+ ProjectNode &operator =(const ProjectNode &);
+};
+
+class IProjectNodesModel
+{
+public:
+ virtual ProjectNode *indexToNode(const QModelIndex &index) const = 0;
+};
+
+class Core;
+class BaseModel : public QAbstractItemModel, public IProjectNodesModel
+{
+ Q_OBJECT
+public:
+ BaseModel(QObject *parent = 0);
+ ~BaseModel();
+ virtual void setCore(Core *core);
+ bool isEmpty() const { return root_->childCount() == 0; }
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ ProjectNode *indexToNode(const QModelIndex &index) const;
+ QModelIndex nodeToIndex(ProjectNode *node) const;
+ QModelIndex objectToIndex(void *object) const;
+ ProjectNode *objectToNode(void *object) const;
+ void setObjectNode(void *object, ProjectNode *node);
+ ProjectNode *root() const { return root_; }
+ Core *core() const { return core_; }
+ void localize();
+signals:
+ void nodeUpdated(ProjectNode *node);
+ void nodeRemoved(ProjectNode *node);
+ void objectRemoved(void *object);
+protected:
+ void clear();
+ bool removeNode(void *object);
+ void updateNode(ProjectNode *node);
+ void removeObject(void *object);
+ void createFunctionsTree(ProjectNode *root);
+private:
+ ProjectNode *root_;
+ Core *core_;
+ QMap<void *, ProjectNode *> objectToNode_;
+};
+
+class ProjectModel : public BaseModel
+{
+ Q_OBJECT
+public:
+ ProjectModel(QObject *parent = 0);
+ ~ProjectModel();
+ virtual void setCore(Core *core);
+ //virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ virtual Qt::DropActions supportedDragActions() const { return Qt::MoveAction; }
+ virtual Qt::DropActions supportedDropActions() const { return Qt::MoveAction; }
+ virtual Qt::ItemFlags flags(const QModelIndex & index) const;
+ virtual QStringList mimeTypes() const;
+ virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
+ virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
+ void addFolder(Folder *folder);
+ void updateFolder(Folder *folder);
+ void removeFolder(Folder *folder);
+ void addFunction(IFunction *func);
+ void updateFunction(IFunction *func);
+ void removeFunction(IFunction *func);
+ void updateScript();
+ QModelIndex optionsIndex() const { return nodeToIndex(nodeOptions_); }
+#ifndef LITE
+ QModelIndex scriptIndex() const { return nodeToIndex(nodeScript_); }
+ uptr_t bookmarkNodeToPos(ProjectNode *node) const;
+ void updateScriptBookmarks();
+#endif
+#ifdef ULTIMATE
+ QModelIndex licensesIndex() const { return nodeToIndex(nodeLicenses_); }
+ void addLicense(License *license);
+ void updateLicense(License *license);
+ void removeLicense(License *license);
+ void addFileFolder(FileFolder *folder);
+ void updateFileFolder(FileFolder *folder);
+ void removeFileFolder(FileFolder *folder);
+ void addFile(InternalFile *file);
+ void updateFile(InternalFile *file);
+ void removeFile(InternalFile *file);
+ void updateFiles();
+#endif
+ void sortNode(ProjectNode *node, int field);
+signals:
+ void modified();
+private:
+ ProjectNode *internalAddFolder(Folder *folder);
+ ProjectNode *internalUpdateFolder(Folder *folder);
+ ProjectNode *internalAddFunction(IFunction *func);
+ ProjectNode *internalUpdateFunction(IFunction *func);
+#ifdef ULTIMATE
+ ProjectNode *internalAddLicense(License *license);
+ ProjectNode *internalUpdateLicense(License *license);
+ ProjectNode *internalAddFileFolder(FileFolder *folder);
+ ProjectNode *internalUpdateFileFolder(FileFolder *folder);
+ ProjectNode *internalAddFile(InternalFile *file);
+ ProjectNode *internalUpdateFile(InternalFile *file);
+#endif
+ ProjectNode *addObject(ProjectNode *parent, NodeType type, void *object);
+ ProjectNode *nodeFunctions_;
+#ifdef ULTIMATE
+ ProjectNode *nodeLicenses_;
+ ProjectNode *nodeFiles_;
+#endif
+#ifndef LITE
+ ProjectNode *nodeScript_;
+#endif
+ ProjectNode *nodeOptions_;
+};
+
+class FunctionsModel : public BaseModel
+{
+public:
+ FunctionsModel(QObject *parent = 0);
+ virtual void setCore(Core *core);
+ void updateFunction(IFunction *func);
+ void removeFunction(IFunction *func);
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+};
+
+class IResource;
+class IArchitecture;
+class ISection;
+class IImport;
+
+class InfoModel : public BaseModel
+{
+ Q_OBJECT
+public:
+ InfoModel(QObject *parent = 0);
+ virtual void setCore(Core *core);
+ void updateResource(IResource *resource);
+ void updateSegment(ISection *segment);
+ void updateImport(IImport *import);
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ QModelIndex dumpIndex(IArchitecture *file) const { return objectToIndex(file); }
+signals:
+ void modified();
+};
+
+class SearchModel : public QAbstractItemModel
+{
+public:
+ SearchModel(QObject *parent = 0);
+ void search(ProjectNode *directory, const QString &text, bool protectedFunctionsOnly = false);
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ virtual bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
+ QModelIndex nodeToIndex(ProjectNode *node) const;
+ void updateNode(ProjectNode *node);
+ void removeNode(ProjectNode *node);
+ void clear();
+ ProjectNode *indexToNode(const QModelIndex &index) const;
+private:
+ QList<ProjectNode *> items_;
+};
+
+class DirectoryModel : public QAbstractItemModel, public IProjectNodesModel
+{
+public:
+ DirectoryModel(QObject *parent = 0);
+ void setDirectory(ProjectNode *directory);
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual Qt::ItemFlags flags(const QModelIndex &index) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ virtual bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
+ QModelIndex nodeToIndex(ProjectNode *node) const;
+ void updateNode(ProjectNode *node);
+ void removeNode(ProjectNode *node);
+private:
+ ProjectNode *indexToNode(const QModelIndex &index) const;
+ QList<ProjectNode *> items_;
+ ProjectNode *directory_;
+};
+
+class IFile;
+class MapFunctionBundle;
+class MapFunctionBundleListModel : public QAbstractItemModel
+{
+ Q_OBJECT
+public:
+ MapFunctionBundleListModel(IFile &file, bool codeOnly, QObject *parent = 0);
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ void search(const QString &text);
+ virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
+private:
+ QList<MapFunctionBundle*> mapFunctionList_;
+ QList<MapFunctionBundle*> items_;
+};
+
+class MapFunction;
+class MapFunctionListModel : public QAbstractItemModel
+{
+ Q_OBJECT
+public:
+ MapFunctionListModel(IArchitecture &file, bool codeOnly, QObject *parent = 0);
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ void search(const QString &text);
+ virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
+private:
+ QList<MapFunction*> mapFunctionList_;
+ QList<MapFunction*> items_;
+};
+
+class WatermarkManager;
+class Watermark;
+
+class WatermarksModel : public BaseModel
+{
+ Q_OBJECT
+public:
+ WatermarksModel(QObject *parent = 0);
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ virtual Qt::ItemFlags flags(const QModelIndex & index) const;
+ WatermarkManager *manager() const;
+ void setCore(Core *core);
+ void addWatermark(Watermark *watermark);
+ void updateWatermark(Watermark *watermark);
+ void removeWatermark(Watermark *watermark);
+ QModelIndex indexByName(const QString &watermarkName) const;
+private:
+ ProjectNode *internalAddWatermark(Watermark *watermark);
+ ProjectNode *internalUpdateWatermark(Watermark *watermark);
+};
+
+class WatermarkScanModel : public QAbstractItemModel
+{
+public:
+ WatermarkScanModel(QObject *parent = 0);
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ Watermark *indexToWatermark(const QModelIndex &index) const;
+ void setWatermarkData(std::map<Watermark *, size_t> data);
+ void removeWatermark(Watermark *watermark);
+ void clear();
+private:
+ QMap<Watermark *, size_t> items_;
+};
+
+class ProjectTemplate;
+class TemplatesModel : public BaseModel
+{
+ Q_OBJECT
+public:
+ TemplatesModel(QObject *parent = 0);
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual Qt::ItemFlags flags(const QModelIndex & index) const;
+ void setCore(Core *core);
+ void addTemplate(ProjectTemplate * pt);
+ void updateTemplate(ProjectTemplate *pt);
+ void removeTemplate(ProjectTemplate *pt);
+private:
+ ProjectNode *internalAddTemplate(ProjectTemplate * pt);
+ ProjectNode *internalUpdateTemplate(ProjectTemplate * pt);
+};
+
+class LogModel : public BaseModel
+{
+public:
+ LogModel(QObject *parent = 0);
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ void clear();
+ void addMessage(MessageType type, IObject *sender, const QString &text);
+ void removeObject(void *object);
+};
+
+class ProjectTreeDelegate : public TreeViewItemDelegate
+{
+ Q_OBJECT
+public:
+ ProjectTreeDelegate(QObject *parent = 0);
+ QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
+ void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
+};
+
+class WatermarksTreeDelegate : public TreeViewItemDelegate
+{
+ Q_OBJECT
+public:
+ WatermarksTreeDelegate(QObject *parent = 0);
+ QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
+ void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
+};
+
+class TemplatesTreeDelegate : public TreeViewItemDelegate
+{
+ Q_OBJECT
+public:
+ TemplatesTreeDelegate(QObject *parent = 0);
+ QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
+ void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
+};
+
+class DumpModel : public QAbstractItemModel
+{
+public:
+ DumpModel(QObject *parent = 0);
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ void setFile(IArchitecture *file);
+ QModelIndex addressToIndex(uint64_t address);
+private:
+ QByteArray read(uint64_t address, int size) const;
+ uint64_t indexToAddress(const QModelIndex &index) const;
+
+ IArchitecture *file_;
+ QMap<uint64_t, int> addrsToRows_;
+ mutable int rowCountCache_;
+ mutable uint64_t cacheAddress_;
+ mutable QByteArray cache_;
+};
+
+class ICommand;
+class DisasmModel : public QAbstractItemModel
+{
+public:
+ DisasmModel(QObject *parent = 0);
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual int rowCount(const QModelIndex &parent) const;
+ virtual int columnCount(const QModelIndex &parent) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+ void setFile(IArchitecture *file);
+ QModelIndex addressToIndex(uint64_t address);
+ ICommand *indexToCommand(const QModelIndex &index) const;
+ IArchitecture *file() const { return file_; }
+private:
+ int addressOffset(uint64_t address) const;
+ uint64_t offsetToAddress(int offset) const;
+ void funcClear() const;
+
+ IArchitecture *file_;
+ mutable int rowCountCache_;
+ QMap<uint64_t, int> addrsToRows_;
+ IFunction *func_;
+};
+
+class ItemModelSearcher
+{
+public:
+ ItemModelSearcher(QAbstractItemModel *where, QModelIndex from, const QRegExp *term, bool forward, bool incremental) :
+ where_(where), from_(from), term_(term), forward_(forward), incremental_(incremental), current_match_(NULL)
+ {
+ result_ = find();
+ }
+ QModelIndex result() { return result_; }
+
+private:
+ QModelIndex find();
+ QModelIndex result_;
+
+ bool extractMatchingIndexes(const QModelIndex &parent);
+
+ QAbstractItemModel *where_;
+ const QRegExp *term_;
+ const bool forward_, incremental_;
+ const QModelIndex from_;
+
+ QModelIndex match_before_, match_after_;
+ QModelIndex *current_match_;
+};
+
+#endif \ No newline at end of file