mirror of
https://github.com/hasherezade/pe-bear
synced 2026-06-08 14:34:04 +00:00
231 lines
5.1 KiB
C++
231 lines
5.1 KiB
C++
#pragma once
|
|
|
|
#include <QtGlobal>
|
|
|
|
#include <map>
|
|
#include <set>
|
|
|
|
#include "QtCompat.h"
|
|
#include "gui_base/PeTreeView.h"
|
|
#include "ExeDependentAction.h"
|
|
#include "gui/PeTreeModel.h"
|
|
|
|
enum PEFileFieldId {
|
|
PEFILE_NONE = -1,
|
|
PEFILE_ROOT,
|
|
PEFILE_MAIN,
|
|
//PEFILE_SIGNATURE,
|
|
PEFILE_IMG_DOS_HDR,
|
|
PEFILE_DOS_STUB,
|
|
PEFILE_IMG_NT_HDRS,
|
|
PEFILE_SEC_HDRS,
|
|
PEFILE_SECTIONS,
|
|
PEFILE_OVERLAY,
|
|
PEFILE_FIELD_COUNTER
|
|
};
|
|
|
|
enum PEFileNTHdrFieldId {
|
|
PEFILE_NTHDR_NONE = -1,
|
|
PEFILE_NTHDR_SIGN,
|
|
PEFILE_NTHDR_FILEHDR,
|
|
PEFILE_NTHDR_OPTHDR,
|
|
PEFILE_NTHDR_COUNTER
|
|
};
|
|
|
|
class PEFileEntryPointItem;
|
|
|
|
class PEFileTreeItem : public PeTreeItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
enum ViewLevel { DESC = 0, DETAILS = 1 };
|
|
typedef enum ViewLevel level_t;
|
|
|
|
PEFileTreeItem(PeHandler *peHndl, level_t level = DESC, PEFileFieldId role = PEFILE_NONE, PEFileTreeItem *parent = NULL);
|
|
|
|
bool attachIfBelongs(PEFileTreeItem *child);
|
|
int columnCount() const;
|
|
|
|
virtual QVariant data(int column) const;
|
|
virtual QVariant foreground(int column) const;
|
|
virtual QVariant background(int column) const;
|
|
virtual QVariant toolTip(int column) const;
|
|
virtual QVariant whatsThis(int column) const { return this->role; } //WhatsThisRole
|
|
virtual QVariant decoration(int column) const;
|
|
virtual QVariant font(int column) const;
|
|
|
|
virtual BYTE* getContent() const;
|
|
ViewLevel getViewLevel() { return level; }
|
|
|
|
/* PEGuiItem interface */
|
|
virtual offset_t getContentOffset() const;
|
|
virtual bufsize_t getContentSize() const;
|
|
|
|
signals:
|
|
void needReset();
|
|
|
|
protected slots:
|
|
void onModified();
|
|
|
|
protected:
|
|
void createTree();
|
|
void deleteOverlayNode();
|
|
void appendOverlayNode();
|
|
|
|
PEFileTreeItem* findNodeByRole(int role);
|
|
|
|
bufsize_t getOverlaySize() const;
|
|
|
|
virtual bool isChildOk(TreeItem* child)
|
|
{
|
|
return (dynamic_cast<PEFileTreeItem*>(child) != 0);
|
|
}
|
|
|
|
void setEntryPointItem(PEFileEntryPointItem *EpItem)
|
|
{
|
|
entryPointItem = EpItem;
|
|
}
|
|
|
|
PEFileEntryPointItem *entryPointItem;
|
|
ViewLevel level;
|
|
|
|
PEFileFieldId role;
|
|
QString fileName;
|
|
|
|
friend class PEFileTreeModel;
|
|
friend class PEFileEntryPointItem;
|
|
};
|
|
|
|
//----------
|
|
|
|
class PEFileSectionsTreeItem : public PEFileTreeItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
PEFileSectionsTreeItem(PeHandler *peHndl, level_t level = DESC, int secIndx = (-1), PEFileTreeItem *parent = NULL);
|
|
inline SectionHdrWrapper* getMySection() const;
|
|
|
|
virtual QVariant data(int column) const;
|
|
virtual QVariant background(int column) const;
|
|
virtual QVariant decoration(int column) const; // DecorationRole
|
|
|
|
virtual BYTE* getContent() const;
|
|
|
|
public slots:
|
|
void onSectionNumChanged();
|
|
|
|
/* PEGuiItem interface */
|
|
virtual offset_t getContentOffset() const;
|
|
virtual bufsize_t getContentSize() const;
|
|
protected:
|
|
|
|
int secIndx;
|
|
};
|
|
|
|
//----------
|
|
|
|
class PEFileNTHdrTreeItem : public PEFileTreeItem
|
|
{
|
|
public:
|
|
PEFileNTHdrTreeItem(PeHandler *peHndl, level_t level = DESC, enum PEFileNTHdrFieldId subrole = PEFILE_NTHDR_NONE, PEFileTreeItem *parent = NULL);
|
|
|
|
virtual QVariant data(int column) const;
|
|
virtual BYTE* getContent() const;
|
|
|
|
/* PEGuiItem interface */
|
|
virtual offset_t getContentOffset() const;
|
|
virtual bufsize_t getContentSize() const;
|
|
protected:
|
|
enum PEFileNTHdrFieldId subrole;
|
|
};
|
|
|
|
//----------
|
|
|
|
class PEFileEntryPointItem : public PEFileTreeItem
|
|
{
|
|
public:
|
|
PEFileEntryPointItem(PeHandler *peHndl, PEFileTreeItem *mainItem, PEFileTreeItem *parent);
|
|
virtual ~PEFileEntryPointItem();
|
|
|
|
virtual QVariant decoration(int column) const;
|
|
virtual QVariant data(int column) const;
|
|
|
|
virtual BYTE* getContent() const;
|
|
|
|
/* PEGuiItem interface */
|
|
virtual offset_t getContentOffset() const;
|
|
virtual bufsize_t getContentSize() const;
|
|
|
|
protected:
|
|
offset_t savedEP;
|
|
PEFileTreeItem *mainItem;
|
|
|
|
friend class PEFileTreeItem;
|
|
};
|
|
|
|
//----------
|
|
|
|
class PEFileTreeModel : public QAbstractItemModel
|
|
{
|
|
Q_OBJECT
|
|
|
|
signals:
|
|
void modelUpdated();
|
|
|
|
public slots:
|
|
void refreshView();
|
|
|
|
QModelIndex addHandler(PeHandler *peHndl);
|
|
void deleteHandler(PeHandler *peHndl);
|
|
|
|
public:
|
|
PEFileTreeModel(QObject *parent = 0);
|
|
~PEFileTreeModel();
|
|
|
|
int rowCount(const QModelIndex &parent) const;
|
|
int columnCount(const QModelIndex &parent) const;
|
|
|
|
QVariant data(const QModelIndex &index, int role) const;
|
|
bool setData(const QModelIndex &, const QVariant &, int) { return false; } //external modifications not allowed
|
|
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
|
|
Qt::ItemFlags flags(const QModelIndex &index) const;
|
|
|
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
|
QModelIndex parent(const QModelIndex &index) const;
|
|
|
|
protected:
|
|
void reset()
|
|
{
|
|
//>
|
|
this->beginResetModel();
|
|
this->endResetModel();
|
|
//<
|
|
}
|
|
|
|
std::map<PEFile*, PEFileTreeItem*> loadedPeFiles;
|
|
PEFileTreeItem* root;
|
|
};
|
|
|
|
class PEStructureView : public TreeCpView
|
|
{
|
|
Q_OBJECT
|
|
|
|
signals:
|
|
void handlerSelected(PeHandler *);
|
|
|
|
public:
|
|
PEStructureView(QWidget *parent);
|
|
void setModel(PEFileTreeModel *model);
|
|
void selectionChanged(const QItemSelection &newSel, const QItemSelection &prevSel);
|
|
bool selectHandler(PeHandler *hndl);
|
|
|
|
protected slots:
|
|
virtual void onNeedReset() { reset(); expandAll(); }
|
|
virtual void onModelUpdated() { emit handlerSelected(NULL); onNeedReset(); }
|
|
|
|
protected:
|
|
PEFileTreeModel* peTreeModel;
|
|
};
|