From 8ba7106948272275534309d10a5a444f26df01ee Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Wed, 22 Jan 2025 10:48:44 -0500 Subject: Support eligibility callbacks through the API for Workflow actions. --- activity.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'activity.cpp') diff --git a/activity.cpp b/activity.cpp index fcc7386a..0bb5858f 100644 --- a/activity.cpp +++ b/activity.cpp @@ -5,10 +5,14 @@ using namespace BinaryNinja; using namespace std; -Activity::Activity(const string& configuration, const std::function analysisContext)>& action) : m_action(action) +Activity::Activity(const string& configuration, const std::function analysisContext)>& action, + const std::function, Ref)>& eligibility) : m_action(action), m_eligibility(eligibility) { // LogError("API-Side Activity Constructed!"); - m_object = BNCreateActivity(configuration.c_str(), this, Run); + if (eligibility) + m_object = BNCreateActivityWithEligibility(configuration.c_str(), this, RunAction, CheckEligibility); + else + m_object = BNCreateActivity(configuration.c_str(), this, RunAction); } @@ -25,12 +29,21 @@ Activity::~Activity() } -void Activity::Run(void* ctxt, BNAnalysisContext* analysisContext) +void Activity::RunAction(void* ctxt, BNAnalysisContext* analysisContext) { - // LogError("API-Side Activity Run!"); - Activity* activity = (Activity*)ctxt; + // LogError("API-Side Activity RunAction!"); + auto boundActivity = static_cast(ctxt); Ref ac = new AnalysisContext(BNNewAnalysisContextReference(analysisContext)); - activity->m_action(ac); + boundActivity->m_action(ac); +} + + +bool Activity::CheckEligibility(void* ctxt, BNActivity* activity, BNAnalysisContext* analysisContext) +{ + auto boundActivity = static_cast(ctxt); + Ref act = new Activity(BNNewActivityReference(activity)); + Ref ac = new AnalysisContext(BNNewAnalysisContextReference(analysisContext)); + return boundActivity->m_eligibility(act, ac); } -- cgit v1.3.1