From 3d7bb5ada00ac4650a916cdb59d3418e5db7f3eb Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Wed, 29 Jun 2016 16:41:36 -0400 Subject: Add analysis completion event and wait API --- binaryview.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'binaryview.cpp') diff --git a/binaryview.cpp b/binaryview.cpp index 21a502ba..9a9461a4 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -180,6 +180,30 @@ Ref Symbol::ImportedFunctionFromImportAddressSymbol(Symbol* sym, uint64_ } +AnalysisCompletionEvent::AnalysisCompletionEvent(BinaryView* view, const std::function& callback): + m_callback(callback) +{ + m_object = BNAddAnalysisCompletionEvent(view->GetObject(), this, CompletionCallback); +} + + +void AnalysisCompletionEvent::CompletionCallback(void* ctxt) +{ + AnalysisCompletionEvent* event = (AnalysisCompletionEvent*)ctxt; + + unique_lock lock(event->m_mutex); + event->m_callback(); + event->m_callback = []() {}; +} + + +void AnalysisCompletionEvent::Cancel() +{ + unique_lock lock(m_mutex); + m_callback = []() {}; +} + + BinaryView::BinaryView(const std::string& typeName, FileMetadata* file) { BNCustomBinaryView view; @@ -1064,6 +1088,12 @@ vector BinaryView::GetStrings(uint64_t start, uint64_t len) } +Ref BinaryView::AddAnalysisCompletionEvent(const function& callback) +{ + return new AnalysisCompletionEvent(this, callback); +} + + BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetObject())) { } -- cgit v1.3.1 From a7eaa72caa4a5e3e7cd7ea7c32236c93b06d1442 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 30 Jun 2016 17:15:19 -0400 Subject: Add API for analysis progress --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 15 +++++++++++++++ binaryview.cpp | 6 ++++++ python/__init__.py | 22 ++++++++++++++++++++++ 4 files changed, 45 insertions(+) (limited to 'binaryview.cpp') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index f0ad784f..3f0b1f4b 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -809,6 +809,8 @@ namespace BinaryNinja std::vector GetStrings(uint64_t start, uint64_t len); Ref AddAnalysisCompletionEvent(const std::function& callback); + + BNAnalysisProgress GetAnalysisProgress(); }; class BinaryData: public BinaryView diff --git a/binaryninjacore.h b/binaryninjacore.h index 6a1e6a63..048255b1 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -735,6 +735,19 @@ extern "C" uint64_t address; }; + enum BNAnalysisState + { + IdleState, + DisassembleState, + AnalyzeState + }; + + struct BNAnalysisProgress + { + BNAnalysisState state; + size_t count, total; + }; + BINARYNINJACOREAPI char* BNAllocString(const char* contents); BINARYNINJACOREAPI void BNFreeString(char* str); @@ -1211,6 +1224,8 @@ extern "C" BINARYNINJACOREAPI void BNFreeAnalysisCompletionEvent(BNAnalysisCompletionEvent* event); BINARYNINJACOREAPI void BNCancelAnalysisCompletionEvent(BNAnalysisCompletionEvent* event); + BINARYNINJACOREAPI BNAnalysisProgress BNGetAnalysisProgress(BNBinaryView* view); + // Function graph BINARYNINJACOREAPI BNFunctionGraph* BNCreateFunctionGraph(BNFunction* func); BINARYNINJACOREAPI BNFunctionGraph* BNNewFunctionGraphReference(BNFunctionGraph* graph); diff --git a/binaryview.cpp b/binaryview.cpp index 9a9461a4..a3abc02a 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1094,6 +1094,12 @@ Ref BinaryView::AddAnalysisCompletionEvent(const functi } +BNAnalysisProgress BinaryView::GetAnalysisProgress() +{ + return BNGetAnalysisProgress(m_object); +} + + BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetObject())) { } diff --git a/python/__init__.py b/python/__init__.py index 3d2123b3..e07bd7c5 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -650,6 +650,22 @@ class AnalysisCompletionEvent(object): self.callback = self._empty_callback core.BNCancelAnalysisCompletionEvent(self.handle) +class AnalysisProgress(object): + def __init__(self, state, count, total): + self.state = state + self.count = count + self.total = total + + def __str__(self): + if self.state == core.DisassembleState: + return "Disassembling (%d/%d)" % (self.count, self.total) + if self.state == core.AnalyzeState: + return "Analyzing (%d/%d)" % (self.count, self.total) + return "Idle" + + def __repr__(self): + return "" % str(self) + class BinaryView(object): name = None """Binary View name""" @@ -928,6 +944,12 @@ class BinaryView(object): def saved(self, value): self.file.saved = value + @property + def analysis_progress(self): + """Status of current analysis (read-only)""" + result = core.BNGetAnalysisProgress(self.handle) + return AnalysisProgress(result.state, result.count, result.total) + def __len__(self): return int(core.BNGetViewLength(self.handle)) -- cgit v1.3.1