cutter/src/widgets/DisassemblerGraphView.h

219 lines
5.8 KiB
C
Raw Normal View History

#ifndef DISASSEMBLERGRAPHVIEW_H
#define DISASSEMBLERGRAPHVIEW_H
// Based on the DisassemblerGraphView from x64dbg
#include <QWidget>
#include <QPainter>
2017-12-14 21:07:48 +00:00
#include <QShortcut>
#include "widgets/GraphView.h"
#include "menus/DisassemblyContextMenu.h"
#include "utils/RichTextPainter.h"
class DisassemblerGraphView : public GraphView
{
Q_OBJECT
2018-03-21 20:32:32 +00:00
struct Token {
int start; //token[0]
int length; //token[1]
QString type; //token[2]
ut64 addr; //token[3]
QString name; //token[4]
};
2018-03-21 20:32:32 +00:00
struct HighlightToken {
QString type; //highlight_token[0]
ut64 addr; //highlight_token[1]
QString name; //highlight_token[2]
2018-03-21 20:32:32 +00:00
bool equalsToken(const Token &token)
{
return this->type == token.type &&
this->addr == token.addr &&
this->name == token.name;
}
2018-03-21 20:32:32 +00:00
static HighlightToken *fromToken(const Token &token)
{
//TODO: memory leaks
auto result = new HighlightToken();
result->type = token.type;
result->addr = token.addr;
result->name = token.name;
return result;
}
};
2018-03-21 20:32:32 +00:00
struct Text {
std::vector<RichTextPainter::List> lines;
Text() {}
2018-03-21 20:32:32 +00:00
Text(const QString &text, QColor color, QColor background)
{
RichTextPainter::List richText;
RichTextPainter::CustomRichText_t rt;
rt.highlight = false;
rt.text = text;
rt.textColor = color;
rt.textBackground = background;
rt.flags = rt.textBackground.alpha() ? RichTextPainter::FlagAll : RichTextPainter::FlagColor;
richText.push_back(rt);
lines.push_back(richText);
}
2018-03-21 20:32:32 +00:00
Text(const RichTextPainter::List &richText)
{
lines.push_back(richText);
}
QString ToQString() const
{
QString result;
2018-03-21 20:32:32 +00:00
for (auto &line : lines) {
for (auto &t : line) {
result += t.text;
}
}
return result;
}
};
2018-03-21 20:32:32 +00:00
struct Instr {
ut64 addr = 0;
ut64 size = 0;
Text text;
Text fullText;
std::vector<unsigned char> opcode; //instruction bytes
};
2018-03-21 20:32:32 +00:00
struct DisassemblyBlock {
Text header_text;
std::vector<Instr> instrs;
ut64 entry = 0;
ut64 true_path = 0;
ut64 false_path = 0;
bool terminal = false;
bool indirectcall = false;
};
2018-03-21 20:32:32 +00:00
struct Function {
bool ready;
ut64 entry;
ut64 update_id;
std::vector<DisassemblyBlock> blocks;
};
2018-03-21 20:32:32 +00:00
struct Analysis {
ut64 entry = 0;
std::unordered_map<ut64, Function> functions;
bool ready = false;
ut64 update_id = 0;
QString status = "Analyzing...";
2018-03-21 20:32:32 +00:00
bool find_instr(ut64 addr, ut64 &func, ut64 &instr)
{
//TODO implement
Q_UNUSED(addr);
Q_UNUSED(func);
Q_UNUSED(instr);
return false;
}
//dummy class
};
public:
DisassemblerGraphView(QWidget *parent);
2017-12-14 21:07:48 +00:00
~DisassemblerGraphView();
std::unordered_map<ut64, DisassemblyBlock> disassembly_blocks;
2018-03-21 20:32:32 +00:00
virtual void drawBlock(QPainter &p, GraphView::GraphBlock &block) override;
virtual void blockClicked(GraphView::GraphBlock &block, QMouseEvent *event, QPoint pos) override;
2018-03-21 20:32:32 +00:00
virtual void blockDoubleClicked(GraphView::GraphBlock &block, QMouseEvent *event,
QPoint pos) override;
virtual bool helpEvent(QHelpEvent *event) override;
virtual void blockHelpEvent(GraphView::GraphBlock &block, QHelpEvent *event, QPoint pos) override;
2018-03-21 20:32:32 +00:00
virtual GraphView::EdgeConfiguration edgeConfiguration(GraphView::GraphBlock &from,
GraphView::GraphBlock *to) override;
virtual void blockTransitionedTo(GraphView::GraphBlock *to) override;
void loadCurrentGraph();
// bool navigate(ut64 addr);
public slots:
void refreshView();
void colorsUpdatedSlot();
void fontsUpdatedSlot();
void onSeekChanged(RVA addr);
void zoomIn();
void zoomOut();
2017-12-13 22:57:36 +00:00
void zoomReset();
void takeTrue();
void takeFalse();
2017-12-14 21:07:48 +00:00
void nextInstr();
void prevInstr();
private slots:
void seekPrev();
2018-02-14 09:33:34 +00:00
void on_actionExportGraph_triggered();
private:
2017-12-14 21:07:48 +00:00
bool first_draw = true;
bool transition_dont_seek = false;
bool sent_seek = false;
2018-03-21 20:32:32 +00:00
HighlightToken *highlight_token;
// Font data
2018-03-21 20:32:32 +00:00
CachedFontMetrics *mFontMetrics;
qreal charWidth;
2017-12-14 21:07:48 +00:00
int charHeight;
int charOffset;
int baseline;
2018-03-21 20:32:32 +00:00
DisassemblyContextMenu *mMenu;
void initFont();
void prepareGraphNode(GraphBlock &block);
RVA getAddrForMouseEvent(GraphBlock &block, QPoint *point);
Instr *getInstrForMouseEvent(GraphBlock &block, QPoint *point);
DisassemblyBlock *blockForAddress(RVA addr);
2018-03-21 20:32:32 +00:00
void seek(RVA addr, bool update_viewport = true);
2017-12-14 21:07:48 +00:00
void seekInstruction(bool previous_instr);
2018-03-21 20:32:32 +00:00
QList<QShortcut *> shortcuts;
QColor disassemblyBackgroundColor;
QColor disassemblySelectedBackgroundColor;
QColor disassemblySelectionColor;
QColor disassemblyTracedColor;
QColor disassemblyTracedSelectionColor;
QColor jmpColor;
QColor brtrueColor;
QColor brfalseColor;
QColor retShadowColor;
QColor indirectcallShadowColor;
QColor mAutoCommentColor;
QColor mAutoCommentBackgroundColor;
QColor mCommentColor;
QColor mCommentBackgroundColor;
QColor mLabelColor;
QColor mLabelBackgroundColor;
QColor graphNodeColor;
QColor mAddressColor;
QColor mAddressBackgroundColor;
QColor mCipColor;
QColor mBreakpointColor;
QColor mDisabledBreakpointColor;
2018-02-14 09:33:34 +00:00
QAction actionExportGraph;
};
#endif // DISASSEMBLERGRAPHVIEW_H