summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h4
-rw-r--r--binaryninjacore.h4
-rw-r--r--ui/workflowmonitor.h86
-rw-r--r--workflow.cpp12
4 files changed, 91 insertions, 15 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index e2275fdc..c911dc50 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -1177,7 +1177,7 @@ namespace BinaryNinja {
return result;
}
};
-
+
std::string EscapeString(const std::string& s);
std::string UnescapeString(const std::string& s);
@@ -10152,6 +10152,8 @@ namespace BinaryNinja {
bool PostJsonRequest(const std::string& request);
+ Ref<FlowGraph> GetGraph(const std::string& activity = "", bool sequential = false);
+
void ShowTopology();
WorkflowMachine::Status GetStatus();
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 4a75eeb1..91e366f4 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -37,7 +37,7 @@
// Current ABI version for linking to the core. This is incremented any time
// there are changes to the API that affect linking, including new functions,
// new types, or modifications to existing functions or types.
-#define BN_CURRENT_CORE_ABI_VERSION 104
+#define BN_CURRENT_CORE_ABI_VERSION 105
// Minimum ABI version that is supported for loading of plugins. Plugins that
// are linked to an ABI version less than this will not be able to load and
@@ -5547,11 +5547,13 @@ extern "C"
// BinaryView Workflow Machine
BINARYNINJACOREAPI BNWorkflow* BNGetWorkflowForBinaryView(BNBinaryView* view);
BINARYNINJACOREAPI char* BNPostWorkflowRequestForBinaryView(BNBinaryView* view, const char* request);
+ BINARYNINJACOREAPI BNFlowGraph* BNGetWorkflowGraphForBinaryView(BNBinaryView* view, const char* name, bool sequential);
BINARYNINJACOREAPI void BNShowWorkflowReportForBinaryView(BNBinaryView* view, const char* name);
// Function Workflow Machine
BINARYNINJACOREAPI BNWorkflow* BNGetWorkflowForFunction(BNFunction* func);
BINARYNINJACOREAPI char* BNPostWorkflowRequestForFunction(BNFunction* func, const char* request);
+ BINARYNINJACOREAPI BNFlowGraph* BNGetWorkflowGraphForFunction(BNFunction* func, const char* name, bool sequential);
BINARYNINJACOREAPI void BNShowWorkflowReportForFunction(BNFunction* func, const char* name);
// Provenance
diff --git a/ui/workflowmonitor.h b/ui/workflowmonitor.h
index 7dcb05a5..1a5a81f1 100644
--- a/ui/workflowmonitor.h
+++ b/ui/workflowmonitor.h
@@ -6,12 +6,17 @@
#include <QIcon>
#include <QLabel>
#include <QPropertyAnimation>
+#include <QTabWidget>
#include "binaryninjaapi.h"
+#include "flowgraphwidget.h"
+#include "fontsettings.h"
+#include "pane.h"
#include "sidebarwidget.h"
#include "uicontext.h"
+#include "viewframe.h"
-class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget
+class BINARYNINJAUIAPI WorkflowMonitorWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(qreal dotBrightness READ dotBrightness WRITE setDotBrightness)
@@ -21,10 +26,12 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget
WorkflowRef m_workflow;
Menu* m_menu;
- ContextMenuManager* m_contextMenuManager;
+ //ContextMenuManager* m_contextMenuManager;
UIActionHandler m_actionHandler;
QToolBar* m_toolbar;
+ QTabWidget* m_tabs;
+ FlowGraphWidget* m_flowGraphWidget;
QAction* m_startAction;
QAction* m_haltAction;
@@ -32,7 +39,6 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget
QAction* m_resetAction;
QAction* m_toggleSuspendAction;
QAction* m_toggleLogAction;
- QAction* m_topologyAction;
QPushButton* m_contextButton;
QLabel* m_contextLabel;
@@ -48,8 +54,6 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget
qreal m_dotBrightness;
bool m_animationRunning;
- virtual void contextMenuEvent(QContextMenuEvent*) override;
-
void updateToolbarActions(bool force = false);
void updateToolbarIcons();
void setupToolbar();
@@ -60,24 +64,80 @@ class BINARYNINJAUIAPI WorkflowMonitorWidget : public SidebarWidget
void setDotBrightness(qreal brightness);
public:
- WorkflowMonitorWidget(BinaryViewRef data);
+ WorkflowMonitorWidget(BinaryViewRef data, FunctionRef function = nullptr);
~WorkflowMonitorWidget();
- void notifyRefresh() override;
- void notifyFontChanged() override;
- void notifyThemeChanged() override;
- void notifyViewLocationChanged(View* view, const ViewLocation& viewLocation) override;
+ FunctionRef getCurrentFunction() const { return m_function; }
+
+ void notifyRefresh();
+ void notifyFontChanged();
+ void notifyThemeChanged();
+ void notifyViewLocationChanged(View* view, const ViewLocation& viewLocation);
void startDotAnimation();
void stopDotAnimation();
};
-class BINARYNINJAUIAPI WorkflowMonitorWidgetType : public SidebarWidgetType
+class BINARYNINJAUIAPI WorkflowMonitorSidebarWidget : public SidebarWidget
{
+ Q_OBJECT
+
+ WorkflowMonitorWidget* m_widget;
+
public:
- WorkflowMonitorWidgetType();
- SidebarWidget* createWidget(ViewFrame* frame, BinaryViewRef data) override;
+ WorkflowMonitorSidebarWidget(BinaryViewRef data);
+
+ void notifyRefresh() override { m_widget->notifyRefresh(); }
+ void notifyFontChanged() override { m_widget->notifyFontChanged(); }
+ void notifyThemeChanged() override { m_widget->notifyThemeChanged(); }
+ void notifyViewLocationChanged(View* view, const ViewLocation& viewLocation) override { m_widget->notifyViewLocationChanged(view, viewLocation); }
+};
+
+
+class BINARYNINJAUIAPI WorkflowMonitorSidebarWidgetType : public SidebarWidgetType
+{
+public:
+ WorkflowMonitorSidebarWidgetType();
+
SidebarWidgetLocation defaultLocation() const override { return SidebarWidgetLocation::LeftReference; }
SidebarContextSensitivity contextSensitivity() const override { return PerViewTypeSidebarContext; }
+
+ SidebarWidget* createWidget(ViewFrame* frame, BinaryViewRef data) override;
+
+ bool canUseAsPane(SplitPaneWidget* panes, BinaryViewRef data) const override { return true; }
+ Pane* createPane(SplitPaneWidget* panes, BinaryViewRef data) override;
+};
+
+
+class BINARYNINJAUIAPI WorkflowView : public QWidget, public View
+{
+ Q_OBJECT
+
+ BinaryViewRef m_data;
+ uint64_t m_currentOffset = 0;
+ WorkflowMonitorWidget* m_widget;
+
+public:
+ WorkflowView(BinaryViewRef data, ViewFrame* frame);
+
+ void notifyRefresh() override { m_widget->notifyRefresh(); }
+ BinaryViewRef getData() override { return m_data; }
+ uint64_t getCurrentOffset() override { return m_currentOffset; }
+ void setSelectionOffsets(BNAddressRange range) override { m_currentOffset = range.start; }
+ bool navigate(uint64_t offset) override;
+ QFont getFont() override { return getMonospaceFont(m_widget); }
+ FunctionRef getCurrentFunction() override { return m_widget->getCurrentFunction(); }
+};
+
+
+class BINARYNINJAUIAPI WorkflowViewType : public ViewType
+{
+ static WorkflowViewType* m_instance;
+
+public:
+ WorkflowViewType();
+ virtual int getPriority(BinaryViewRef data, const QString& filename);
+ virtual QWidget* create(BinaryViewRef data, ViewFrame* viewFrame);
+ static void init();
};
diff --git a/workflow.cpp b/workflow.cpp
index d4b94eb4..9c1c7d20 100644
--- a/workflow.cpp
+++ b/workflow.cpp
@@ -164,6 +164,18 @@ bool WorkflowMachine::PostJsonRequest(const std::string& request)
}
+Ref<FlowGraph> WorkflowMachine::GetGraph(const std::string& activity, bool sequential)
+{
+ BNFlowGraph* graph;
+ if (m_function)
+ graph = BNGetWorkflowGraphForFunction(m_function->GetObject(), activity.c_str(), sequential);
+ else
+ graph = BNGetWorkflowGraphForBinaryView(m_view->GetObject(), activity.c_str(), sequential);
+
+ return new CoreFlowGraph(graph);
+}
+
+
void WorkflowMachine::ShowTopology()
{
if (m_function)