summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h27
-rw-r--r--binaryninjacore.h25
-rw-r--r--binaryview.cpp20
-rw-r--r--filemetadata.cpp40
-rw-r--r--python/binaryview.py14
-rw-r--r--python/filemetadata.py34
-rw-r--r--ui/uitypes.h1
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;