1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#pragma once
#include <QtGui/QColor>
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#include <QtWidgets/QAction>
#else
#include <QtGui/QAction>
#endif
#include <QtGui/QImage>
#include <QtWidgets/QMenu>
#include <QtGui/QPainter>
#include <QtCore/QRect>
#include <QtCore/QPointer>
#include <QtCore/QTimer>
#include <QtCore/QVector>
#include <QtWidgets/QWidget>
#include <mutex>
#include <tuple>
#include <vector>
#include "binaryninjaapi.h"
#include "dockhandler.h"
#include "uitypes.h"
class ContextMenuManager;
class Menu;
class View;
class SplitPaneWidget;
class BINARYNINJAUIAPI FeatureMap : public QWidget, public BinaryNinja::BinaryDataNotification
{
Q_OBJECT
QImage* m_image = nullptr;
QImage* m_staticImage = nullptr;
std::vector<std::pair<uint64_t, uint64_t>> m_regions;
SplitPaneWidget* m_owner = nullptr;
BinaryViewRef m_data;
bool m_updatesPending = false;
QTimer* m_updateTimer = nullptr;
size_t m_bvWidth = 0;
size_t m_bvHeight = 0;
uint64_t m_bvLength = 0;
int m_defaultWidth = 64;
bool m_naturalOrientation;
int m_curLocX = 0;
int m_curLocY = 0;
uint64_t m_curAddr = 0;
bool m_navigationInProgress = false;
QVector<QColor> m_colors;
QVector<QRgb> m_colorTable;
Menu m_menu;
ContextMenuManager* m_contextMenuManager;
class BackgroundRefresh : public BinaryNinja::RefCountObject
{
std::mutex m_mutex;
bool m_valid;
QPointer<FeatureMap> m_featureMap;
public:
BackgroundRefresh(FeatureMap* featureMap);
void start();
void abort();
};
BinaryNinja::Ref<BackgroundRefresh> m_backgroundRefresh = nullptr;
void updateCoordinates();
public:
FeatureMap(SplitPaneWidget* owner, BinaryViewRef data, bool vertical = true);
virtual ~FeatureMap();
void backgroundRefresh();
std::pair<uint64_t, bool> getLinearOffsetForAddress(uint64_t addr);
void notifyOffsetChanged(uint64_t offset);
void notifyThemeChanged();
void renderDataVariable(const BinaryNinja::DataVariable& var, bool ignoreString = false);
virtual void OnAnalysisFunctionAdded(BinaryNinja::BinaryView* data, BinaryNinja::Function* func) override;
virtual void OnAnalysisFunctionRemoved(BinaryNinja::BinaryView* data, BinaryNinja::Function* func) override;
virtual void OnAnalysisFunctionUpdated(BinaryNinja::BinaryView* data, BinaryNinja::Function* func) override;
virtual void OnDataVariableAdded(BinaryNinja::BinaryView* data, const BinaryNinja::DataVariable& var) override;
virtual void OnDataVariableRemoved(BinaryNinja::BinaryView* data, const BinaryNinja::DataVariable& var) override;
virtual void OnDataVariableUpdated(BinaryNinja::BinaryView* data, const BinaryNinja::DataVariable& var) override;
virtual void OnStringFound(BinaryNinja::BinaryView* data, BNStringType type, uint64_t offset, size_t len) override;
virtual void OnStringRemoved(
BinaryNinja::BinaryView* data, BNStringType type, uint64_t offset, size_t len) override;
void drawImageRect(uint64_t addr, size_t len, uint8_t color);
virtual QSize sizeHint() const override;
protected:
virtual void contextMenuEvent(QContextMenuEvent* event) override;
virtual void mouseMoveEvent(QMouseEvent* event) override;
virtual void mousePressEvent(QMouseEvent* event) override;
virtual void resizeEvent(QResizeEvent* event) override;
virtual void paintEvent(QPaintEvent* event) override;
void scrollTo(int x, int y, bool addHistoryEntry = false);
Q_SIGNALS:
void notifyThemeUpdated();
private Q_SLOTS:
void refresh();
void updateThemeInternal();
void updateTimerEvent();
};
|