diff options
| -rw-r--r-- | binaryninjaapi.h | 27 | ||||
| -rw-r--r-- | binaryninjacore.h | 25 | ||||
| -rw-r--r-- | binaryview.cpp | 20 | ||||
| -rw-r--r-- | filemetadata.cpp | 40 | ||||
| -rw-r--r-- | python/binaryview.py | 14 | ||||
| -rw-r--r-- | python/filemetadata.py | 34 | ||||
| -rw-r--r-- | ui/uitypes.h | 1 |
7 files changed, 118 insertions, 43 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 0328b58f..195f9089 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -874,6 +874,17 @@ __attribute__ ((format (printf, 1, 2))) MergeResult(const BNMergeResult& result); }; + class SaveSettings: public CoreRefCountObject<BNSaveSettings, + BNNewSaveSettingsReference, BNFreeSaveSettings> + { + public: + SaveSettings(); + SaveSettings(BNSaveSettings* settings); + + bool IsOptionSet(BNSaveOption option) const; + void SetOption(BNSaveOption option, bool state = true); + }; + class FileMetadata: public CoreRefCountObject<BNFileMetadata, BNNewFileReference, BNFreeFileMetadata> { public: @@ -897,16 +908,16 @@ __attribute__ ((format (printf, 1, 2))) void MarkFileSaved(); bool IsBackedByDatabase() const; - bool CreateDatabase(const std::string& name, BinaryView* data, bool clean = false); + bool CreateDatabase(const std::string& name, BinaryView* data, Ref<SaveSettings> settings); bool CreateDatabase(const std::string& name, BinaryView* data, - const std::function<void(size_t progress, size_t total)>& progressCallback, bool clean = false); + const std::function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings); Ref<BinaryView> OpenExistingDatabase(const std::string& path); Ref<BinaryView> OpenExistingDatabase(const std::string& path, const std::function<void(size_t progress, size_t total)>& progressCallback); Ref<BinaryView> OpenDatabaseForConfiguration(const std::string& path); - bool SaveAutoSnapshot(BinaryView* data, bool clean = false); + bool SaveAutoSnapshot(BinaryView* data, Ref<SaveSettings> settings); bool SaveAutoSnapshot(BinaryView* data, - const std::function<void(size_t progress, size_t total)>& progressCallback, bool clean = false); + const std::function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings); bool Rebase(BinaryView* data, uint64_t address); bool Rebase(BinaryView* data, uint64_t address, const std::function<void(size_t progress, size_t total)>& progressCallback); @@ -1450,11 +1461,11 @@ __attribute__ ((format (printf, 1, 2))) bool IsModified() const; bool IsAnalysisChanged() const; bool IsBackedByDatabase() const; - bool CreateDatabase(const std::string& path, bool clean = false); + bool CreateDatabase(const std::string& path, Ref<SaveSettings> settings = new SaveSettings()); bool CreateDatabase(const std::string& path, - const std::function<void(size_t progress, size_t total)>& progressCallback, bool clean = false); - bool SaveAutoSnapshot(bool clean = false); - bool SaveAutoSnapshot(const std::function<void(size_t progress, size_t total)>& progressCallback, bool clean = false); + const std::function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings = new SaveSettings()); + bool SaveAutoSnapshot(Ref<SaveSettings> settings = new SaveSettings()); + bool SaveAutoSnapshot(const std::function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings = new SaveSettings()); void BeginUndoActions(); void AddUndoAction(UndoAction* action); diff --git a/binaryninjacore.h b/binaryninjacore.h index a6e2c0c1..6a683bd5 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -151,6 +151,7 @@ extern "C" struct BNPlatform; struct BNAnalysisCompletionEvent; struct BNDisassemblySettings; + struct BNSaveSettings; struct BNScriptingProvider; struct BNScriptingInstance; struct BNMainThreadAction; @@ -2003,6 +2004,12 @@ extern "C" BNMetadata** values; }; + enum BNSaveOption + { + RemoveUndoData, + TrimSnapshots, + }; + enum BNMessageBoxIcon { InformationIcon, @@ -2385,6 +2392,16 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI BNDataBuffer* BNZlibCompress(BNDataBuffer* buf); BINARYNINJACOREAPI BNDataBuffer* BNZlibDecompress(BNDataBuffer* buf); + // Save settings + BINARYNINJACOREAPI BNSaveSettings* BNCreateSaveSettings(void); + BINARYNINJACOREAPI BNSaveSettings* BNNewSaveSettingsReference(BNSaveSettings* settings); + BINARYNINJACOREAPI void BNFreeSaveSettings(BNSaveSettings* settings); + + BINARYNINJACOREAPI bool BNIsSaveSettingsOptionSet(BNSaveSettings* settings, + BNSaveOption option); + BINARYNINJACOREAPI void BNSetSaveSettingsOption(BNSaveSettings* settings, + BNSaveOption option, bool state); + // File metadata object BINARYNINJACOREAPI BNFileMetadata* BNCreateFileMetadata(void); BINARYNINJACOREAPI BNFileMetadata* BNNewFileReference(BNFileMetadata* file); @@ -2397,16 +2414,16 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI void BNMarkFileSaved(BNFileMetadata* file); BINARYNINJACOREAPI bool BNIsBackedByDatabase(BNFileMetadata* file); - BINARYNINJACOREAPI bool BNCreateDatabase(BNBinaryView* data, const char* path, bool clean); + BINARYNINJACOREAPI bool BNCreateDatabase(BNBinaryView* data, const char* path, BNSaveSettings* settings); BINARYNINJACOREAPI bool BNCreateDatabaseWithProgress(BNBinaryView* data, const char* path, - void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total), bool clean); + void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total), BNSaveSettings* settings); BINARYNINJACOREAPI BNBinaryView* BNOpenExistingDatabase(BNFileMetadata* file, const char* path); BINARYNINJACOREAPI BNBinaryView* BNOpenExistingDatabaseWithProgress(BNFileMetadata* file, const char* path, void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total)); BINARYNINJACOREAPI BNBinaryView* BNOpenDatabaseForConfiguration(BNFileMetadata* file, const char* path); - BINARYNINJACOREAPI bool BNSaveAutoSnapshot(BNBinaryView* data, bool clean); + BINARYNINJACOREAPI bool BNSaveAutoSnapshot(BNBinaryView* data, BNSaveSettings* settings); BINARYNINJACOREAPI bool BNSaveAutoSnapshotWithProgress(BNBinaryView* data, void* ctxt, - void (*progress)(void* ctxt, size_t progress, size_t total), bool clean); + void (*progress)(void* ctxt, size_t progress, size_t total), BNSaveSettings* settings); BINARYNINJACOREAPI bool BNRebase(BNBinaryView* data, uint64_t address); BINARYNINJACOREAPI bool BNRebaseWithProgress(BNBinaryView* data, uint64_t address, void* ctxt, void (*progress)(void* ctxt, size_t progress, size_t total)); diff --git a/binaryview.cpp b/binaryview.cpp index a9b25a3c..102578b7 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1126,34 +1126,34 @@ bool BinaryView::IsBackedByDatabase() const } -bool BinaryView::CreateDatabase(const string& path, bool clean) +bool BinaryView::CreateDatabase(const string& path, Ref<SaveSettings> settings) { auto parent = GetParentView(); if (parent) - return parent->CreateDatabase(path, clean); - return m_file->CreateDatabase(path, this, clean); + return parent->CreateDatabase(path, settings); + return m_file->CreateDatabase(path, this, settings); } bool BinaryView::CreateDatabase(const string& path, - const function<void(size_t progress, size_t total)>& progressCallback, bool clean) + const function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings) { auto parent = GetParentView(); if (parent) - return parent->CreateDatabase(path, clean); - return m_file->CreateDatabase(path, this, progressCallback, clean); + return parent->CreateDatabase(path, settings); + return m_file->CreateDatabase(path, this, progressCallback, settings); } -bool BinaryView::SaveAutoSnapshot(bool clean) +bool BinaryView::SaveAutoSnapshot(Ref<SaveSettings> settings) { - return m_file->SaveAutoSnapshot(this, clean); + return m_file->SaveAutoSnapshot(this, settings); } -bool BinaryView::SaveAutoSnapshot(const function<void(size_t progress, size_t total)>& progressCallback, bool clean) +bool BinaryView::SaveAutoSnapshot(const function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings) { - return m_file->SaveAutoSnapshot(this, progressCallback, clean); + return m_file->SaveAutoSnapshot(this, progressCallback, settings); } diff --git a/filemetadata.cpp b/filemetadata.cpp index e9433b15..956205bb 100644 --- a/filemetadata.cpp +++ b/filemetadata.cpp @@ -163,18 +163,18 @@ bool FileMetadata::IsBackedByDatabase() const } -bool FileMetadata::CreateDatabase(const string& name, BinaryView* data, bool clean) +bool FileMetadata::CreateDatabase(const string& name, BinaryView* data, Ref<SaveSettings> settings) { - return BNCreateDatabase(data->GetObject(), name.c_str(), clean); + return BNCreateDatabase(data->GetObject(), name.c_str(), settings ? settings->GetObject() : nullptr); } bool FileMetadata::CreateDatabase(const string& name, BinaryView* data, - const function<void(size_t progress, size_t total)>& progressCallback, bool clean) + const function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings) { DatabaseProgressCallbackContext cb; cb.func = progressCallback; - return BNCreateDatabaseWithProgress(data->GetObject(), name.c_str(), &cb, DatabaseProgressCallback, clean); + return BNCreateDatabaseWithProgress(data->GetObject(), name.c_str(), &cb, DatabaseProgressCallback, settings ? settings->GetObject() : nullptr); } @@ -208,18 +208,18 @@ Ref<BinaryView> FileMetadata::OpenDatabaseForConfiguration(const string& path) } -bool FileMetadata::SaveAutoSnapshot(BinaryView* data, bool clean) +bool FileMetadata::SaveAutoSnapshot(BinaryView* data, Ref<SaveSettings> settings) { - return BNSaveAutoSnapshot(data->GetObject(), clean); + return BNSaveAutoSnapshot(data->GetObject(), settings ? settings->GetObject() : nullptr); } bool FileMetadata::SaveAutoSnapshot(BinaryView* data, - const function<void(size_t progress, size_t total)>& progressCallback, bool clean) + const function<void(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings) { DatabaseProgressCallbackContext cb; cb.func = progressCallback; - return BNSaveAutoSnapshotWithProgress(data->GetObject(), &cb, DatabaseProgressCallback, clean); + return BNSaveAutoSnapshotWithProgress(data->GetObject(), &cb, DatabaseProgressCallback, settings ? settings->GetObject() : nullptr); } @@ -348,3 +348,27 @@ Ref<BinaryView> FileMetadata::GetViewOfType(const string& name) return nullptr; return new BinaryView(view); } + + +SaveSettings::SaveSettings() +{ + m_object = BNCreateSaveSettings(); +} + + +SaveSettings::SaveSettings(BNSaveSettings* settings) +{ + m_object = settings; +} + + +bool SaveSettings::IsOptionSet(BNSaveOption option) const +{ + return BNIsSaveSettingsOptionSet(m_object, option); +} + + +void SaveSettings::SetOption(BNSaveOption option, bool state) +{ + BNSetSaveSettingsOption(m_object, option, state); +} diff --git a/python/binaryview.py b/python/binaryview.py index 3e1478be..1e7f7a44 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -32,7 +32,7 @@ from collections import OrderedDict # Binary Ninja components from binaryninja import _binaryninjacore as core from binaryninja.enums import (AnalysisState, SymbolType, InstructionTextTokenType, - Endianness, ModificationStatus, StringType, SegmentFlag, SectionSemantics, FindFlag, TypeClass) + Endianness, ModificationStatus, StringType, SegmentFlag, SectionSemantics, FindFlag, TypeClass, SaveOption) import binaryninja from binaryninja import associateddatastore # required for _BinaryViewAssociatedDataStore from binaryninja import log @@ -2480,30 +2480,30 @@ class BinaryView(object): """ return False - def create_database(self, filename, progress_func=None, clean=False): + def create_database(self, filename, progress_func=None, settings=None): """ ``create_database`` writes the current database (.bndb) file out to the specified file. :param str filename: path and filename to write the bndb to, this string `should` have ".bndb" appended to it. :param callback progress_func: optional function to be called with the current progress and total count. - :param bool clean: optional argument to determine if undo data is saved in the database. + :param SaveSettings settings: optional argument for special save options. :return: true on success, false on failure :rtype: bool """ - return self._file.create_database(filename, progress_func, clean) + return self._file.create_database(filename, progress_func, settings) - def save_auto_snapshot(self, progress_func=None, clean=False): + def save_auto_snapshot(self, progress_func=None, settings=None): """ ``save_auto_snapshot`` saves the current database to the already created file. .. note:: :py:meth:`create_database` should have been called prior to executing this method :param callback progress_func: optional function to be called with the current progress and total count. - :param bool clean: optional argument to determine if undo data is saved in the database. + :param SaveSettings settings: optional argument for special save options. :return: True if it successfully saved the snapshot, False otherwise :rtype: bool """ - return self._file.save_auto_snapshot(progress_func, clean) + return self._file.save_auto_snapshot(progress_func, settings) def get_view_of_type(self, name): """ diff --git a/python/filemetadata.py b/python/filemetadata.py index 937686b7..2b50f23b 100644 --- a/python/filemetadata.py +++ b/python/filemetadata.py @@ -27,6 +27,7 @@ import binaryninja from binaryninja import _binaryninjacore as core from binaryninja import associateddatastore #required for _FileMetadataAssociatedDataStore from binaryninja import log +from binaryninja.enums import SaveOption class NavigationHandler(object): def _register(self, handle): @@ -60,6 +61,27 @@ class NavigationHandler(object): return False +class SaveSettings(object): + def __init__(self, handle = None): + if handle is None: + self.handle = core.BNCreateSaveSettings() + else: + self.handle = handle + + def __del__(self): + core.BNFreeSaveSettings(self.handle) + + def is_option_set(self, option): + if isinstance(option, str): + option = SaveOption[option] + return core.BNIsSaveSettingsOptionSet(self.handle, option) + + def set_option(self, option, state = True): + if isinstance(option, str): + option = SaveOption[option] + core.BNSetSaveSettingsOption(self.handle, option, state) + + class _FileMetadataAssociatedDataStore(associateddatastore._AssociatedDataStore): _defaults = {} @@ -331,13 +353,13 @@ class FileMetadata(object): def navigate(self, view, offset): return core.BNNavigate(self.handle, str(view), offset) - def create_database(self, filename, progress_func = None, clean = False): + def create_database(self, filename, progress_func = None, settings = None): if progress_func is None: - return core.BNCreateDatabase(self.raw.handle, str(filename), clean) + return core.BNCreateDatabase(self.raw.handle, str(filename), settings) else: return core.BNCreateDatabaseWithProgress(self.raw.handle, str(filename), None, ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_ulonglong, ctypes.c_ulonglong)( - lambda ctxt, cur, total: progress_func(cur, total)), clean) + lambda ctxt, cur, total: progress_func(cur, total)), settings) def open_existing_database(self, filename, progress_func = None): if progress_func is None: @@ -356,13 +378,13 @@ class FileMetadata(object): return None return binaryninja.binaryview.BinaryView(file_metadata = self, handle = view) - def save_auto_snapshot(self, progress_func = None, clean = False): + def save_auto_snapshot(self, progress_func = None, settings = None): if progress_func is None: - return core.BNSaveAutoSnapshot(self.raw.handle, clean) + return core.BNSaveAutoSnapshot(self.raw.handle, settings) else: return core.BNSaveAutoSnapshotWithProgress(self.raw.handle, None, ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_ulonglong, ctypes.c_ulonglong)( - lambda ctxt, cur, total: progress_func(cur, total)), clean) + lambda ctxt, cur, total: progress_func(cur, total)), settings) def merge_user_analysis(self, path, progress_func = None): return core.BNMergeUserAnalysis(self.handle, str(path), None, diff --git a/ui/uitypes.h b/ui/uitypes.h index bfdc9553..dd91d0ae 100644 --- a/ui/uitypes.h +++ b/ui/uitypes.h @@ -51,6 +51,7 @@ typedef BinaryNinja::Ref<BinaryNinja::MediumLevelILFunction> MediumLevelILFuncti typedef BinaryNinja::Ref<BinaryNinja::HighLevelILFunction> HighLevelILFunctionRef; typedef BinaryNinja::Ref<BinaryNinja::Platform> PlatformRef; typedef BinaryNinja::Ref<BinaryNinja::ReportCollection> ReportCollectionRef; +typedef BinaryNinja::Ref<BinaryNinja::SaveSettings> SaveSettingsRef; typedef BinaryNinja::Ref<BinaryNinja::ScriptingInstance> ScriptingInstanceRef; typedef BinaryNinja::Ref<BinaryNinja::ScriptingProvider> ScriptingProviderRef; typedef BinaryNinja::Ref<BinaryNinja::Section> SectionRef; |
