summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-09-16 19:09:01 -0400
committerRusty Wagner <rusty@vector35.com>2016-09-16 19:09:01 -0400
commit2ec606fab8754dad2135deec2e72e87d39382978 (patch)
tree4c923368406312f0366e27ac10f9a02f5e001c22
parent124cf1bc4f465a915621b7ac81af94b9a69a937a (diff)
Add APIs for user interaction from plugins
-rw-r--r--binaryninjaapi.h50
-rw-r--r--binaryninjacore.h39
-rw-r--r--binaryview.cpp33
-rw-r--r--interaction.cpp286
-rw-r--r--python/__init__.py248
5 files changed, 656 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 3400cca7..720a8eb6 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -275,6 +275,7 @@ namespace BinaryNinja
class DataBuffer;
class MainThreadAction;
class MainThreadActionHandler;
+ class InteractionHandler;
/*! Logs to the error console with the given BNLogLevel.
@@ -381,6 +382,26 @@ namespace BinaryNinja
size_t GetWorkerThreadCount();
void SetWorkerThreadCount(size_t count);
+ std::string MarkdownToHTML(const std::string& contents);
+
+ void RegisterInteractionHandler(InteractionHandler* handler);
+
+ void ShowPlainTextReport(const std::string& title, const std::string& contents);
+ void ShowMarkdownReport(const std::string& title, const std::string& contents,
+ const std::string& plainText = "");
+ void ShowHTMLReport(const std::string& title, const std::string& contents,
+ const std::string& plainText = "");
+
+ bool GetTextLineInput(std::string& result, const std::string& prompt, const std::string& title);
+ bool GetIntegerInput(int64_t& result, const std::string& prompt, const std::string& title);
+ bool GetAddressInput(uint64_t& result, const std::string& prompt, const std::string& title);
+ bool GetChoiceInput(size_t& idx, const std::string& prompt, const std::string& title,
+ const std::vector<std::string>& choices);
+ bool GetOpenFileNameInput(std::string& result, const std::string& prompt, const std::string& ext = "");
+ bool GetSaveFileNameInput(std::string& result, const std::string& prompt, const std::string& ext = "",
+ const std::string& defaultName = "");
+ bool GetDirectoryNameInput(std::string& result, const std::string& prompt, const std::string& defaultName = "");
+
class DataBuffer
{
BNDataBuffer* m_buffer;
@@ -935,6 +956,13 @@ namespace BinaryNinja
bool FindNextData(uint64_t start, const DataBuffer& data, uint64_t& result, BNFindFlag flags = NoFindFlags);
void Reanalyze();
+
+ void ShowPlainTextReport(const std::string& title, const std::string& contents);
+ void ShowMarkdownReport(const std::string& title, const std::string& contents, const std::string& plainText);
+ void ShowHTMLReport(const std::string& title, const std::string& contents, const std::string& plainText);
+ bool GetAddressInput(uint64_t& result, const std::string& prompt, const std::string& title);
+ bool GetAddressInput(uint64_t& result, const std::string& prompt, const std::string& title,
+ uint64_t currentAddress);
};
class BinaryData: public BinaryView
@@ -2279,4 +2307,26 @@ namespace BinaryNinja
static std::vector<Ref<BackgroundTask>> GetRunningTasks();
};
+
+ class InteractionHandler
+ {
+ public:
+ virtual void ShowPlainTextReport(Ref<BinaryView> view, const std::string& title, const std::string& contents) = 0;
+ virtual void ShowMarkdownReport(Ref<BinaryView> view, const std::string& title, const std::string& contents,
+ const std::string& plainText);
+ virtual void ShowHTMLReport(Ref<BinaryView> view, const std::string& title, const std::string& contents,
+ const std::string& plainText);
+
+ virtual bool GetTextLineInput(std::string& result, const std::string& prompt, const std::string& title) = 0;
+ virtual bool GetIntegerInput(int64_t& result, const std::string& prompt, const std::string& title);
+ virtual bool GetAddressInput(uint64_t& result, const std::string& prompt, const std::string& title,
+ Ref<BinaryView> view, uint64_t currentAddr);
+ virtual bool GetChoiceInput(size_t& idx, const std::string& prompt, const std::string& title,
+ const std::vector<std::string>& choices) = 0;
+ virtual bool GetOpenFileNameInput(std::string& result, const std::string& prompt, const std::string& ext = "");
+ virtual bool GetSaveFileNameInput(std::string& result, const std::string& prompt,
+ const std::string& ext = "", const std::string& defaultName = "");
+ virtual bool GetDirectoryNameInput(std::string& result, const std::string& prompt,
+ const std::string& defaultName = "");
+ };
}
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 89dceba1..34806b6c 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -1050,6 +1050,26 @@ extern "C"
uint8_t mix, r, g, b, alpha;
};
+ struct BNInteractionHandlerCallbacks
+ {
+ void* context;
+ void (*showPlainTextReport)(void* ctxt, BNBinaryView* view, const char* title, const char* contents);
+ void (*showMarkdownReport)(void* ctxt, BNBinaryView* view, const char* title, const char* contents,
+ const char* plaintext);
+ void (*showHTMLReport)(void* ctxt, BNBinaryView* view, const char* title, const char* contents,
+ const char* plaintext);
+ bool (*getTextLineInput)(void* ctxt, char** result, const char* prompt, const char* title);
+ bool (*getIntegerInput)(void* ctxt, int64_t* result, const char* prompt, const char* title);
+ bool (*getAddressInput)(void* ctxt, uint64_t* result, const char* prompt, const char* title,
+ BNBinaryView* view, uint64_t currentAddr);
+ bool (*getChoiceInput)(void* ctxt, size_t* result, const char* prompt, const char* title,
+ const char** choices, size_t count);
+ bool (*getOpenFileNameInput)(void* ctxt, char** result, const char* prompt, const char* ext);
+ bool (*getSaveFileNameInput)(void* ctxt, char** result, const char* prompt, const char* ext,
+ const char* defaultName);
+ bool (*getDirectoryNameInput)(void* ctxt, char** result, const char* prompt, const char* defaultName);
+ };
+
BINARYNINJACOREAPI char* BNAllocString(const char* contents);
BINARYNINJACOREAPI void BNFreeString(char* str);
@@ -2030,6 +2050,25 @@ extern "C"
BINARYNINJACOREAPI void BNCancelBackgroundTask(BNBackgroundTask* task);
BINARYNINJACOREAPI bool BNIsBackgroundTaskFinished(BNBackgroundTask* task);
+ // Interaction APIs
+ BINARYNINJACOREAPI void BNRegisterInteractionHandler(BNInteractionHandlerCallbacks* callbacks);
+ BINARYNINJACOREAPI char* BNMarkdownToHTML(const char* contents);
+ BINARYNINJACOREAPI void BNShowPlainTextReport(BNBinaryView* view, const char* title, const char* contents);
+ BINARYNINJACOREAPI void BNShowMarkdownReport(BNBinaryView* view, const char* title, const char* contents,
+ const char* plaintext);
+ BINARYNINJACOREAPI void BNShowHTMLReport(BNBinaryView* view, const char* title, const char* contents,
+ const char* plaintext);
+ BINARYNINJACOREAPI bool BNGetTextLineInput(char** result, const char* prompt, const char* title);
+ BINARYNINJACOREAPI bool BNGetIntegerInput(int64_t* result, const char* prompt, const char* title);
+ BINARYNINJACOREAPI bool BNGetAddressInput(uint64_t* result, const char* prompt, const char* title,
+ BNBinaryView* view, uint64_t currentAddr);
+ BINARYNINJACOREAPI bool BNGetChoiceInput(size_t* result, const char* prompt, const char* title,
+ const char** choices, size_t count);
+ BINARYNINJACOREAPI bool BNGetOpenFileNameInput(char** result, const char* prompt, const char* ext);
+ BINARYNINJACOREAPI bool BNGetSaveFileNameInput(char** result, const char* prompt, const char* ext,
+ const char* defaultName);
+ BINARYNINJACOREAPI bool BNGetDirectoryNameInput(char** result, const char* prompt, const char* defaultName);
+
#ifdef __cplusplus
}
#endif
diff --git a/binaryview.cpp b/binaryview.cpp
index 0a7f23ce..863d57b2 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -1480,6 +1480,39 @@ void BinaryView::Reanalyze()
}
+void BinaryView::ShowPlainTextReport(const string& title, const string& contents)
+{
+ BNShowPlainTextReport(m_object, title.c_str(), contents.c_str());
+}
+
+
+void BinaryView::ShowMarkdownReport(const string& title, const string& contents, const string& plainText)
+{
+ BNShowMarkdownReport(m_object, title.c_str(), contents.c_str(), plainText.c_str());
+}
+
+
+void BinaryView::ShowHTMLReport(const string& title, const string& contents, const string& plainText)
+{
+ BNShowHTMLReport(m_object, title.c_str(), contents.c_str(), plainText.c_str());
+}
+
+
+bool BinaryView::GetAddressInput(uint64_t& result, const string& prompt, const string& title)
+{
+ uint64_t currentAddress = 0;
+ if (m_file)
+ currentAddress = m_file->GetCurrentOffset();
+ return BNGetAddressInput(&result, prompt.c_str(), title.c_str(), m_object, currentAddress);
+}
+
+
+bool BinaryView::GetAddressInput(uint64_t& result, const string& prompt, const string& title, uint64_t currentAddress)
+{
+ return BNGetAddressInput(&result, prompt.c_str(), title.c_str(), m_object, currentAddress);
+}
+
+
BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetObject()))
{
}
diff --git a/interaction.cpp b/interaction.cpp
new file mode 100644
index 00000000..f7763679
--- /dev/null
+++ b/interaction.cpp
@@ -0,0 +1,286 @@
+#include <stdlib.h>
+#include <string.h>
+#include "binaryninjaapi.h"
+
+using namespace std;
+using namespace BinaryNinja;
+
+
+void InteractionHandler::ShowMarkdownReport(Ref<BinaryView> view, const string& title, const string& contents,
+ const string& plainText)
+{
+ ShowHTMLReport(view, title, MarkdownToHTML(contents), plainText);
+}
+
+
+void InteractionHandler::ShowHTMLReport(Ref<BinaryView> view, const string& title, const string&,
+ const string& plainText)
+{
+ if (plainText.size() != 0)
+ ShowPlainTextReport(view, title, plainText);
+}
+
+
+bool InteractionHandler::GetIntegerInput(int64_t& result, const string& prompt, const string& title)
+{
+ string input;
+
+ while (true)
+ {
+ string input;
+ if (!GetTextLineInput(input, prompt, title))
+ return false;
+ if (input.size() == 0)
+ return false;
+
+ errno = 0;
+ result = strtoll(input.c_str(), nullptr, 0);
+ if (errno != 0)
+ {
+ errno = 0;
+ result = strtoull(input.c_str(), nullptr, 0);
+ if (errno != 0)
+ continue;
+ }
+
+ return true;
+ }
+}
+
+
+bool InteractionHandler::GetAddressInput(uint64_t& result, const string& prompt, const string& title,
+ Ref<BinaryView>, uint64_t)
+{
+ int64_t value;
+ if (!GetIntegerInput(value, prompt, title))
+ return false;
+ result = (uint64_t)value;
+ return true;
+}
+
+
+bool InteractionHandler::GetOpenFileNameInput(string& result, const string& prompt, const string&)
+{
+ return GetTextLineInput(result, prompt, "Open File");
+}
+
+
+bool InteractionHandler::GetSaveFileNameInput(string& result, const string& prompt, const string&, const string&)
+{
+ return GetTextLineInput(result, prompt, "Save File");
+}
+
+
+bool InteractionHandler::GetDirectoryNameInput(string& result, const string& prompt, const string&)
+{
+ return GetTextLineInput(result, prompt, "Select Directory");
+}
+
+
+static void ShowPlainTextReportCallback(void* ctxt, BNBinaryView* view, const char* title, const char* contents)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ handler->ShowPlainTextReport(view ? new BinaryView(BNNewViewReference(view)) : nullptr, title, contents);
+}
+
+
+static void ShowMarkdownReportCallback(void* ctxt, BNBinaryView* view, const char* title, const char* contents,
+ const char* plaintext)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ handler->ShowMarkdownReport(view ? new BinaryView(BNNewViewReference(view)) : nullptr, title, contents, plaintext);
+}
+
+
+static void ShowHTMLReportCallback(void* ctxt, BNBinaryView* view, const char* title, const char* contents,
+ const char* plaintext)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ handler->ShowHTMLReport(view ? new BinaryView(BNNewViewReference(view)) : nullptr, title, contents, plaintext);
+}
+
+
+static bool GetTextLineInputCallback(void* ctxt, char** result, const char* prompt, const char* title)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ string value;
+ if (!handler->GetTextLineInput(value, prompt, title))
+ return false;
+ *result = BNAllocString(value.c_str());
+ return true;
+}
+
+
+static bool GetIntegerInputCallback(void* ctxt, int64_t* result, const char* prompt, const char* title)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ return handler->GetIntegerInput(*result, prompt, title);
+}
+
+
+static bool GetAddressInputCallback(void* ctxt, uint64_t* result, const char* prompt, const char* title,
+ BNBinaryView* view, uint64_t currentAddr)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ return handler->GetAddressInput(*result, prompt, title, view ? new BinaryView(BNNewViewReference(view)) : nullptr,
+ currentAddr);
+}
+
+
+static bool GetChoiceInputCallback(void* ctxt, size_t* result, const char* prompt, const char* title,
+ const char** choices, size_t count)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ vector<string> choiceStrs;
+ for (size_t i = 0; i < count; i++)
+ choiceStrs.push_back(choices[i]);
+ return handler->GetChoiceInput(*result, prompt, title, choiceStrs);
+}
+
+
+static bool GetOpenFileNameInputCallback(void* ctxt, char** result, const char* prompt, const char* ext)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ string value;
+ if (!handler->GetOpenFileNameInput(value, prompt, ext))
+ return false;
+ *result = BNAllocString(value.c_str());
+ return true;
+}
+
+
+static bool GetSaveFileNameInputCallback(void* ctxt, char** result, const char* prompt, const char* ext,
+ const char* defaultName)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ string value;
+ if (!handler->GetSaveFileNameInput(value, prompt, ext, defaultName))
+ return false;
+ *result = BNAllocString(value.c_str());
+ return true;
+}
+
+
+static bool GetDirectoryNameInputCallback(void* ctxt, char** result, const char* prompt, const char* defaultName)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ string value;
+ if (!handler->GetDirectoryNameInput(value, prompt, defaultName))
+ return false;
+ *result = BNAllocString(value.c_str());
+ return true;
+}
+
+
+void BinaryNinja::RegisterInteractionHandler(InteractionHandler* handler)
+{
+ BNInteractionHandlerCallbacks cb;
+ cb.context = handler;
+ cb.showPlainTextReport = ShowPlainTextReportCallback;
+ cb.showMarkdownReport = ShowMarkdownReportCallback;
+ cb.showHTMLReport = ShowHTMLReportCallback;
+ cb.getTextLineInput = GetTextLineInputCallback;
+ cb.getIntegerInput = GetIntegerInputCallback;
+ cb.getAddressInput = GetAddressInputCallback;
+ cb.getChoiceInput = GetChoiceInputCallback;
+ cb.getOpenFileNameInput = GetOpenFileNameInputCallback;
+ cb.getSaveFileNameInput = GetSaveFileNameInputCallback;
+ cb.getDirectoryNameInput = GetDirectoryNameInputCallback;
+ BNRegisterInteractionHandler(&cb);
+}
+
+
+string BinaryNinja::MarkdownToHTML(const string& contents)
+{
+ char* str = BNMarkdownToHTML(contents.c_str());
+ string result = str;
+ BNFreeString(str);
+ return result;
+}
+
+
+void BinaryNinja::ShowPlainTextReport(const string& title, const string& contents)
+{
+ BNShowPlainTextReport(nullptr, title.c_str(), contents.c_str());
+}
+
+
+void BinaryNinja::ShowMarkdownReport(const string& title, const string& contents, const string& plainText)
+{
+ BNShowMarkdownReport(nullptr, title.c_str(), contents.c_str(), plainText.c_str());
+}
+
+
+void BinaryNinja::ShowHTMLReport(const string& title, const string& contents, const string& plainText)
+{
+ BNShowHTMLReport(nullptr, title.c_str(), contents.c_str(), plainText.c_str());
+}
+
+
+bool BinaryNinja::GetTextLineInput(string& result, const string& prompt, const string& title)
+{
+ char* value = nullptr;
+ if (!BNGetTextLineInput(&value, prompt.c_str(), title.c_str()))
+ return false;
+ result = value;
+ BNFreeString(value);
+ return true;
+}
+
+
+bool BinaryNinja::GetIntegerInput(int64_t& result, const string& prompt, const string& title)
+{
+ return BNGetIntegerInput(&result, prompt.c_str(), title.c_str());
+}
+
+
+bool BinaryNinja::GetAddressInput(uint64_t& result, const string& prompt, const string& title)
+{
+ return BNGetAddressInput(&result, prompt.c_str(), title.c_str(), nullptr, 0);
+}
+
+
+bool BinaryNinja::GetChoiceInput(size_t& idx, const string& prompt, const string& title,
+ const vector<string>& choices)
+{
+ const char** choiceStrs = new const char*[choices.size()];
+ for (size_t i = 0; i < choices.size(); i++)
+ choiceStrs[i] = choices[i].c_str();
+ bool ok = BNGetChoiceInput(&idx, prompt.c_str(), title.c_str(), choiceStrs, choices.size());
+ delete[] choiceStrs;
+ return ok;
+}
+
+
+bool BinaryNinja::GetOpenFileNameInput(string& result, const string& prompt, const string& ext)
+{
+ char* value = nullptr;
+ if (!BNGetOpenFileNameInput(&value, prompt.c_str(), ext.c_str()))
+ return false;
+ result = value;
+ BNFreeString(value);
+ return true;
+}
+
+
+bool BinaryNinja::GetSaveFileNameInput(string& result, const string& prompt, const string& ext,
+ const string& defaultName)
+{
+ char* value = nullptr;
+ if (!BNGetSaveFileNameInput(&value, prompt.c_str(), ext.c_str(), defaultName.c_str()))
+ return false;
+ result = value;
+ BNFreeString(value);
+ return true;
+}
+
+
+bool BinaryNinja::GetDirectoryNameInput(string& result, const string& prompt, const string& defaultName)
+{
+ char* value = nullptr;
+ if (!BNGetDirectoryNameInput(&value, prompt.c_str(), defaultName.c_str()))
+ return false;
+ result = value;
+ BNFreeString(value);
+ return true;
+}
diff --git a/python/__init__.py b/python/__init__.py
index 6abbdfa6..854de5c7 100644
--- a/python/__init__.py
+++ b/python/__init__.py
@@ -3293,6 +3293,23 @@ class BinaryView(object):
"""
core.BNReanalyzeAllFunctions(self.handle)
+ def show_plain_text_report(self, title, contents):
+ core.BNShowPlainTextReport(self.handle, title, contents)
+
+ def show_markdown_report(self, title, contents, plaintext = ""):
+ core.BNShowMarkdownReport(self.handle, title, contents, plaintext)
+
+ def show_html_report(self, title, contents, plaintext = ""):
+ core.BNShowHTMLReport(self.handle, title, contents, plaintext)
+
+ def get_address_input(self, prompt, title, current_address = None):
+ if current_address is None:
+ current_address = self.file.offset
+ value = ctypes.c_ulonglong()
+ if not core.BNGetAddressInput(value, prompt, title, self.handle, current_address):
+ return None
+ return value.value
+
def __setattr__(self, name, value):
try:
object.__setattr__(self,name,value)
@@ -10059,6 +10076,172 @@ class BackgroundTaskThread(BackgroundTask):
def join(self):
self.thread.join()
+class InteractionHandler(object):
+ _interaction_handler = None
+
+ def __init__(self):
+ self._cb = core.BNInteractionHandlerCallbacks()
+ self._cb.context = 0
+ self._cb.showPlainTextReport = self._cb.showPlainTextReport.__class__(self._show_plain_text_report)
+ self._cb.showMarkdownReport = self._cb.showMarkdownReport.__class__(self._show_markdown_report)
+ self._cb.showHTMLReport = self._cb.showHTMLReport.__class__(self._show_html_report)
+ self._cb.getTextLineInput = self._cb.getTextLineInput.__class__(self._get_text_line_input)
+ self._cb.getIntegerInput = self._cb.getIntegerInput.__class__(self._get_int_input)
+ self._cb.getAddressInput = self._cb.getAddressInput.__class__(self._get_address_input)
+ self._cb.getChoiceInput = self._cb.getChoiceInput.__class__(self._get_choice_input)
+ self._cb.getOpenFileNameInput = self._cb.getOpenFileNameInput.__class__(self._get_open_filename_input)
+ self._cb.getSaveFileNameInput = self._cb.getSaveFileNameInput.__class__(self._get_save_filename_input)
+ self._cb.getDirectoryNameInput = self._cb.getDirectoryNameInput.__class__(self._get_directory_name_input)
+
+ def register(self):
+ self.__class__._interaction_handler = self
+ core.BNRegisterInteractionHandler(self._cb)
+
+ def _show_plain_text_report(self, ctxt, view, title, contents):
+ try:
+ if view:
+ view = BinaryView(None, handle = core.BNNewViewReference(view))
+ else:
+ view = None
+ self.show_plain_text_report(view, title, contents)
+ except:
+ log_error(traceback.format_exc())
+
+ def _show_markdown_report(self, ctxt, view, title, contents, plaintext):
+ try:
+ if view:
+ view = BinaryView(None, handle = core.BNNewViewReference(view))
+ else:
+ view = None
+ self.show_markdown_report(view, title, contents, plaintext)
+ except:
+ log_error(traceback.format_exc())
+
+ def _show_html_report(self, ctxt, view, title, contents, plaintext):
+ try:
+ if view:
+ view = BinaryView(None, handle = core.BNNewViewReference(view))
+ else:
+ view = None
+ self.show_html_report(view, title, contents, plaintext)
+ except:
+ log_error(traceback.format_exc())
+
+ def _get_text_line_input(self, ctxt, result, prompt, title):
+ try:
+ value = self.get_text_line_input(prompt, title)
+ if value is None:
+ return False
+ result[0] = core.BNAllocString(str(value))
+ return True
+ except:
+ log_error(traceback.format_exc())
+
+ def _get_int_input(self, ctxt, result, prompt, title):
+ try:
+ value = self.get_int_input(prompt, title)
+ if value is None:
+ return False
+ result[0] = value
+ return True
+ except:
+ log_error(traceback.format_exc())
+
+ def _get_address_input(self, ctxt, result, prompt, title, view, current_address):
+ try:
+ if view:
+ view = BinaryView(None, handle = core.BNNewViewReference(view))
+ else:
+ view = None
+ value = self.get_address_input(prompt, title, view, current_address)
+ if value is None:
+ return False
+ result[0] = value
+ return True
+ except:
+ log_error(traceback.format_exc())
+
+ def _get_choice_input(self, ctxt, result, prompt, title, choice_buf, count):
+ try:
+ choices = []
+ for i in xrange(0, count):
+ choices.append(choice_buf[i])
+ value = self.get_choice_input(prompt, title, choices)
+ if value is None:
+ return False
+ result[0] = value
+ return True
+ except:
+ log_error(traceback.format_exc())
+
+ def _get_open_filename_input(self, ctxt, result, prompt, ext):
+ try:
+ value = self.get_open_filename_input(prompt, ext)
+ if value is None:
+ return False
+ result[0] = core.BNAllocString(str(value))
+ return True
+ except:
+ log_error(traceback.format_exc())
+
+ def _get_save_filename_input(self, ctxt, result, prompt, ext, default_name):
+ try:
+ value = self.get_save_filename_input(prompt, ext, default_name)
+ if value is None:
+ return False
+ result[0] = core.BNAllocString(str(value))
+ return True
+ except:
+ log_error(traceback.format_exc())
+
+ def _get_directory_name_input(self, ctxt, result, prompt, default_name):
+ try:
+ value = self.get_directory_name_input(prompt, default_name)
+ if value is None:
+ return False
+ result[0] = core.BNAllocString(str(value))
+ return True
+ except:
+ log_error(traceback.format_exc())
+
+ def show_plain_text_report(self, view, title, contents):
+ pass
+
+ def show_markdown_report(self, view, title, contents, plaintext):
+ self.show_html_report(view, title, markdown_to_html(contents), plaintext)
+
+ def show_html_report(self, view, title, contents, plaintext):
+ if len(plaintext) != 0:
+ self.show_plain_text_report(view, title, plaintext)
+
+ def get_text_line_input(self, prompt, title):
+ return None
+
+ def get_int_input(self, prompt, title):
+ while True:
+ text = self.get_text_line_input(prompt, title)
+ if len(text) == 0:
+ return False
+ try:
+ return int(text)
+ except:
+ continue
+
+ def get_address_input(self, prompt, title, view, current_address):
+ return get_int_input(prompt, title)
+
+ def get_choice_input(self, prompt, title, choices):
+ return None
+
+ def get_open_filename_input(self, prompt, ext):
+ return get_text_line_input(prompt, "Open File")
+
+ def get_save_filename_input(self, prompt, ext, default_name):
+ return get_text_line_input(title, "Save File")
+
+ def get_directory_name_input(self, prompt, default_name):
+ return get_text_line_input(title, "Select Directory")
+
def LLIL_TEMP(n):
return n | 0x80000000
@@ -10374,6 +10557,71 @@ def get_worker_thread_count():
def set_worker_thread_count(count):
core.BNSetWorkerThreadCount(count)
+def markdown_to_html(contents):
+ return core.BNMarkdownToHTML(contents)
+
+def show_plain_text_report(title, contents):
+ core.BNShowPlainTextReport(None, title, contents)
+
+def show_markdown_report(title, contents, plaintext = ""):
+ core.BNShowMarkdownReport(None, title, contents, plaintext)
+
+def show_html_report(title, contents, plaintext = ""):
+ core.BNShowHTMLReport(None, title, contents, plaintext)
+
+def get_text_line_input(prompt, title):
+ value = ctypes.c_char_p()
+ if not core.BNGetTextLineInput(value, prompt, title):
+ return None
+ result = value.value
+ core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ return result
+
+def get_int_input(prompt, title):
+ value = ctypes.c_longlong()
+ if not core.BNGetIntegerInput(value, prompt, title):
+ return None
+ return value.value
+
+def get_address_input(prompt, title):
+ value = ctypes.c_ulonglong()
+ if not core.BNGetAddressInput(value, prompt, title, None, 0):
+ return None
+ return value.value
+
+def get_choice_input(prompt, title, choices):
+ choice_buf = (ctypes.c_char_p * len(choices))()
+ for i in xrange(0, len(choices)):
+ choice_buf[i] = str(choices[i])
+ value = ctypes.c_ulonglong()
+ if not core.BNGetChoiceInput(value, prompt, title, choice_buf, len(choices)):
+ return None
+ return value.value
+
+def get_open_filename_input(prompt, ext = ""):
+ value = ctypes.c_char_p()
+ if not core.BNGetOpenFileNameInput(value, prompt, ext):
+ return None
+ result = value.value
+ core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ return result
+
+def get_save_filename_input(prompt, ext = "", default_name = ""):
+ value = ctypes.c_char_p()
+ if not core.BNGetSaveFileNameInput(value, prompt, ext, default_name):
+ return None
+ result = value.value
+ core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ return result
+
+def get_directory_name_input(prompt, default_name = ""):
+ value = ctypes.c_char_p()
+ if not core.BNGetDirectoryNameInput(value, prompt, default_name):
+ return None
+ result = value.value
+ core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ return result
+
bundled_plugin_path = core.BNGetBundledPluginDirectory()
user_plugin_path = core.BNGetUserPluginDirectory()