summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-02-12 14:34:50 -0500
committerRusty Wagner <rusty@vector35.com>2015-02-12 14:34:50 -0500
commit83b01dd50407731d14938ac96894c3a4d9065295 (patch)
tree2e3ded7103b51aef0d5cd22434e35f4461aeaeba
parent6b431b32e32f00f9203ba2a4ca07cc962cdb22aa (diff)
Place API code with the associated class
-rw-r--r--api.pro10
-rw-r--r--binaryninjaapi.cpp1433
-rw-r--r--binaryreader.cpp248
-rw-r--r--binaryview.cpp332
-rw-r--r--binaryviewtype.cpp112
-rw-r--r--binarywriter.cpp214
-rw-r--r--databuffer.cpp103
-rw-r--r--fileaccessor.cpp63
-rw-r--r--filemetadata.cpp148
-rw-r--r--transform.cpp242
10 files changed, 1471 insertions, 1434 deletions
diff --git a/api.pro b/api.pro
index 017b4d55..449c53d0 100644
--- a/api.pro
+++ b/api.pro
@@ -10,7 +10,15 @@ TARGET = binaryninjaapi
TEMPLATE = lib
CONFIG += staticlib
-SOURCES += binaryninjaapi.cpp
+SOURCES += \
+ databuffer.cpp \
+ filemetadata.cpp \
+ fileaccessor.cpp \
+ binaryview.cpp \
+ binaryviewtype.cpp \
+ binaryreader.cpp \
+ binarywriter.cpp \
+ transform.cpp
HEADERS += binaryninjaapi.h
unix {
diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp
deleted file mode 100644
index 677c7c27..00000000
--- a/binaryninjaapi.cpp
+++ /dev/null
@@ -1,1433 +0,0 @@
-#include "binaryninjaapi.h"
-
-using namespace BinaryNinja;
-using namespace std;
-
-
-DataBuffer::DataBuffer()
-{
- m_buffer = BNCreateDataBuffer(nullptr, 0);
-}
-
-
-DataBuffer::DataBuffer(size_t len)
-{
- m_buffer = BNCreateDataBuffer(nullptr, len);
-}
-
-
-DataBuffer::DataBuffer(const DataBuffer& buf)
-{
- m_buffer = BNDuplicateDataBuffer(buf.m_buffer);
-}
-
-
-DataBuffer::DataBuffer(BNDataBuffer* buf)
-{
- m_buffer = buf;
-}
-
-
-DataBuffer::~DataBuffer()
-{
- BNFreeDataBuffer(m_buffer);
-}
-
-
-DataBuffer& DataBuffer::operator=(const DataBuffer& buf)
-{
- BNFreeDataBuffer(m_buffer);
- m_buffer = BNDuplicateDataBuffer(buf.m_buffer);
- return *this;
-}
-
-
-void* DataBuffer::GetData()
-{
- return BNGetDataBufferContents(m_buffer);
-}
-
-
-const void* DataBuffer::GetData() const
-{
- return BNGetDataBufferContents(m_buffer);
-}
-
-
-void* DataBuffer::GetDataAt(size_t offset)
-{
- return BNGetDataBufferContentsAt(m_buffer, offset);
-}
-
-
-size_t DataBuffer::GetLength() const
-{
- return BNGetDataBufferLength(m_buffer);
-}
-
-
-void DataBuffer::SetSize(size_t len)
-{
- BNSetDataBufferLength(m_buffer, len);
-}
-
-
-void DataBuffer::Append(const void* data, size_t len)
-{
- BNAppendDataBufferContents(m_buffer, data, len);
-}
-
-
-void DataBuffer::Append(const DataBuffer& buf)
-{
- BNAppendDataBuffer(m_buffer, buf.m_buffer);
-}
-
-
-DataBuffer DataBuffer::GetSlice(size_t start, size_t len)
-{
- BNDataBuffer* result = BNGetDataBufferSlice(m_buffer, start, len);
- return DataBuffer(result);
-}
-
-
-uint8_t& DataBuffer::operator[](size_t offset)
-{
- return ((uint8_t*)GetData())[offset];
-}
-
-
-const uint8_t& DataBuffer::operator[](size_t offset) const
-{
- return ((const uint8_t*)GetData())[offset];
-}
-
-
-char* NavigationHandler::GetCurrentViewCallback(void* ctxt)
-{
- NavigationHandler* handler = (NavigationHandler*)ctxt;
- string result = handler->GetCurrentView();
- return BNAllocString(result.c_str());
-}
-
-
-uint64_t NavigationHandler::GetCurrentOffsetCallback(void* ctxt)
-{
- NavigationHandler* handler = (NavigationHandler*)ctxt;
- return handler->GetCurrentOffset();
-}
-
-
-bool NavigationHandler::NavigateCallback(void* ctxt, const char* view, uint64_t offset)
-{
- NavigationHandler* handler = (NavigationHandler*)ctxt;
- return handler->Navigate(view, offset);
-}
-
-
-NavigationHandler::NavigationHandler()
-{
- m_callbacks.context = this;
- m_callbacks.getCurrentView = GetCurrentViewCallback;
- m_callbacks.getCurrentOffset = GetCurrentOffsetCallback;
- m_callbacks.navigate = NavigateCallback;
-}
-
-
-void UndoAction::UndoCallback(void* ctxt)
-{
- UndoAction* action = (UndoAction*)ctxt;
- action->Undo();
-}
-
-
-void UndoAction::RedoCallback(void* ctxt)
-{
- UndoAction* action = (UndoAction*)ctxt;
- action->Redo();
-}
-
-
-void UndoAction::Add(BNFileMetadata* file)
-{
- BNAddUndoAction(file, this, UndoCallback, RedoCallback);
-}
-
-
-FileMetadata::FileMetadata()
-{
- m_file = BNCreateFileMetadata();
-}
-
-
-FileMetadata::FileMetadata(BNFileMetadata* file)
-{
- m_file = file;
-}
-
-
-FileMetadata::~FileMetadata()
-{
- BNFreeFileMetadata(m_file);
-}
-
-
-void FileMetadata::SetNavigationHandler(NavigationHandler* handler)
-{
- BNSetFileMetadataNavigationHandler(m_file, handler->GetCallbacks());
-}
-
-
-bool FileMetadata::IsModified() const
-{
- return BNIsFileModified(m_file);
-}
-
-
-void FileMetadata::MarkFileModified()
-{
- BNMarkFileModified(m_file);
-}
-
-
-void FileMetadata::MarkFileSaved()
-{
- BNMarkFileSaved(m_file);
-}
-
-
-void FileMetadata::BeginUndoActions()
-{
- BNBeginUndoActions(m_file);
-}
-
-
-void FileMetadata::AddUndoAction(UndoAction* action)
-{
- action->Add(m_file);
-}
-
-
-void FileMetadata::CommitUndoActions()
-{
- BNCommitUndoActions(m_file);
-}
-
-
-bool FileMetadata::Undo()
-{
- return BNUndo(m_file);
-}
-
-
-bool FileMetadata::Redo()
-{
- return BNRedo(m_file);
-}
-
-
-string FileMetadata::GetCurrentView()
-{
- char* view = BNGetCurrentView(m_file);
- string result = view;
- BNFreeString(view);
- return result;
-}
-
-
-uint64_t FileMetadata::GetCurrentOffset()
-{
- return BNGetCurrentOffset(m_file);
-}
-
-
-bool FileMetadata::Navigate(const string& view, uint64_t offset)
-{
- return BNNavigate(m_file, view.c_str(), offset);
-}
-
-
-void BinaryDataNotification::DataWrittenCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len)
-{
- BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
- Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
- notify->OnBinaryDataWritten(view, offset, len);
-}
-
-
-void BinaryDataNotification::DataInsertedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len)
-{
- BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
- Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
- notify->OnBinaryDataInserted(view, offset, len);
-}
-
-
-void BinaryDataNotification::DataRemovedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, uint64_t len)
-{
- BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
- Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
- notify->OnBinaryDataRemoved(view, offset, len);
-}
-
-
-BinaryDataNotification::BinaryDataNotification()
-{
- m_callbacks.context = this;
- m_callbacks.dataWritten = DataWrittenCallback;
- m_callbacks.dataInserted = DataInsertedCallback;
- m_callbacks.dataRemoved = DataRemovedCallback;
-}
-
-
-uint64_t FileAccessor::GetLengthCallback(void* ctxt)
-{
- FileAccessor* file = (FileAccessor*)ctxt;
- return file->GetLength();
-}
-
-
-size_t FileAccessor::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len)
-{
- FileAccessor* file = (FileAccessor*)ctxt;
- return file->Read(dest, offset, len);
-}
-
-
-size_t FileAccessor::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
-{
- FileAccessor* file = (FileAccessor*)ctxt;
- return file->Write(offset, src, len);
-}
-
-
-FileAccessor::FileAccessor()
-{
- m_callbacks.context = this;
- m_callbacks.getLength = GetLengthCallback;
- m_callbacks.read = ReadCallback;
- m_callbacks.write = WriteCallback;
-}
-
-
-FileAccessor::FileAccessor(BNFileAccessor* accessor): m_callbacks(*accessor)
-{
-}
-
-
-CoreFileAccessor::CoreFileAccessor(BNFileAccessor* accessor): FileAccessor(accessor)
-{
-}
-
-
-uint64_t CoreFileAccessor::GetLength() const
-{
- return m_callbacks.getLength(m_callbacks.context);
-}
-
-
-size_t CoreFileAccessor::Read(void* dest, uint64_t offset, size_t len)
-{
- return m_callbacks.read(m_callbacks.context, dest, offset, len);
-}
-
-
-size_t CoreFileAccessor::Write(uint64_t offset, const void* src, size_t len)
-{
- return m_callbacks.write(m_callbacks.context, offset, src, len);
-}
-
-
-BinaryView::BinaryView(FileMetadata* file)
-{
- BNCustomBinaryView view;
- view.context = this;
- view.read = ReadCallback;
- view.write = WriteCallback;
- view.insert = InsertCallback;
- view.remove = RemoveCallback;
- view.getModification = GetModificationCallback;
- view.getStart = GetStartCallback;
- view.getLength = GetLengthCallback;
- view.isExecutable = IsExecutableCallback;
- view.save = SaveCallback;
-
- m_file = file;
- m_view = BNCreateCustomBinaryView(m_file->GetFileObject(), &view);
-}
-
-
-BinaryView::BinaryView(BNBinaryView* view)
-{
- m_view = view;
- m_file = new FileMetadata(BNNewFileReference(BNGetFileForView(m_view)));
-}
-
-
-BinaryView::~BinaryView()
-{
- BNFreeBinaryView(m_view);
-}
-
-
-size_t BinaryView::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->Read(dest, offset, len);
-}
-
-
-size_t BinaryView::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->Write(offset, src, len);
-}
-
-
-size_t BinaryView::InsertCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->Insert(offset, src, len);
-}
-
-
-size_t BinaryView::RemoveCallback(void* ctxt, uint64_t offset, uint64_t len)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->Remove(offset, len);
-}
-
-
-BNModificationStatus BinaryView::GetModificationCallback(void* ctxt, uint64_t offset)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->GetModification(offset);
-}
-
-
-uint64_t BinaryView::GetStartCallback(void* ctxt)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->GetStart();
-}
-
-
-uint64_t BinaryView::GetLengthCallback(void* ctxt)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->GetLength();
-}
-
-
-bool BinaryView::IsExecutableCallback(void* ctxt)
-{
- BinaryView* view = (BinaryView*)ctxt;
- return view->IsExecutable();
-}
-
-
-bool BinaryView::SaveCallback(void* ctxt, BNFileAccessor* file)
-{
- BinaryView* view = (BinaryView*)ctxt;
- CoreFileAccessor accessor(file);
- return view->Save(&accessor);
-}
-
-
-bool BinaryView::IsModified() const
-{
- return m_file->IsModified();
-}
-
-
-void BinaryView::BeginUndoActions()
-{
- m_file->BeginUndoActions();
-}
-
-
-void BinaryView::AddUndoAction(UndoAction* action)
-{
- m_file->AddUndoAction(action);
-}
-
-
-void BinaryView::CommitUndoActions()
-{
- m_file->CommitUndoActions();
-}
-
-
-bool BinaryView::Undo()
-{
- return m_file->Undo();
-}
-
-
-bool BinaryView::Redo()
-{
- return m_file->Redo();
-}
-
-
-string BinaryView::GetCurrentView()
-{
- return m_file->GetCurrentView();
-}
-
-
-uint64_t BinaryView::GetCurrentOffset()
-{
- return m_file->GetCurrentOffset();
-}
-
-
-bool BinaryView::Navigate(const string& view, uint64_t offset)
-{
- return m_file->Navigate(view, offset);
-}
-
-
-DataBuffer BinaryView::ReadBuffer(uint64_t offset, size_t len)
-{
- BNDataBuffer* result = BNReadViewBuffer(m_view, offset, len);
- return DataBuffer(result);
-}
-
-
-size_t BinaryView::WriteBuffer(uint64_t offset, const DataBuffer& data)
-{
- return BNWriteViewBuffer(m_view, offset, data.GetBufferObject());
-}
-
-
-size_t BinaryView::InsertBuffer(uint64_t offset, const DataBuffer& data)
-{
- return BNInsertViewBuffer(m_view, offset, data.GetBufferObject());
-}
-
-
-vector<BNModificationStatus> BinaryView::GetModification(uint64_t offset, size_t len)
-{
- BNModificationStatus* mod = new BNModificationStatus[len];
- len = BNGetModificationArray(m_view, offset, mod, len);
-
- vector<BNModificationStatus> result;
- for (size_t i = 0; i < len; i++)
- result.push_back(mod[i]);
-
- delete[] mod;
- return result;
-}
-
-
-uint64_t BinaryView::GetEnd() const
-{
- return BNGetEndOffset(m_view);
-}
-
-
-bool BinaryView::Save(const string& path)
-{
- return BNSaveToFilename(m_view, path.c_str());
-}
-
-
-void BinaryView::RegisterNotification(BinaryDataNotification* notify)
-{
- BNRegisterDataNotification(m_view, notify->GetCallbacks());
-}
-
-
-void BinaryView::UnregisterNotification(BinaryDataNotification* notify)
-{
- BNUnregisterDataNotification(m_view, notify->GetCallbacks());
-}
-
-
-CoreBinaryView::CoreBinaryView(BNBinaryView* view): BinaryView(view)
-{
-}
-
-
-size_t CoreBinaryView::Read(void* dest, uint64_t offset, size_t len)
-{
- return BNReadViewData(m_view, dest, offset, len);
-}
-
-
-size_t CoreBinaryView::Write(uint64_t offset, const void* data, size_t len)
-{
- return BNWriteViewData(m_view, offset, data, len);
-}
-
-
-size_t CoreBinaryView::Insert(uint64_t offset, const void* data, size_t len)
-{
- return BNInsertViewData(m_view, offset, data, len);
-}
-
-
-size_t CoreBinaryView::Remove(uint64_t offset, uint64_t len)
-{
- return BNRemoveViewData(m_view, offset, len);
-}
-
-
-BNModificationStatus CoreBinaryView::GetModification(uint64_t offset)
-{
- return BNGetModification(m_view, offset);
-}
-
-
-uint64_t CoreBinaryView::GetStart() const
-{
- return BNGetStartOffset(m_view);
-}
-
-
-uint64_t CoreBinaryView::GetLength() const
-{
- return BNGetViewLength(m_view);
-}
-
-
-bool CoreBinaryView::IsExecutable() const
-{
- return BNIsExecutableView(m_view);
-}
-
-
-bool CoreBinaryView::Save(FileAccessor* file)
-{
- return BNSaveToFile(m_view, file->GetCallbacks());
-}
-
-
-BinaryData::BinaryData(FileMetadata* file): CoreBinaryView(BNCreateBinaryDataView(file->GetFileObject()))
-{
-}
-
-
-BinaryData::BinaryData(FileMetadata* file, const DataBuffer& data):
- CoreBinaryView(BNCreateBinaryDataViewFromBuffer(file->GetFileObject(), data.GetBufferObject()))
-{
-}
-
-
-BinaryData::BinaryData(FileMetadata* file, const void* data, size_t len):
- CoreBinaryView(BNCreateBinaryDataViewFromData(file->GetFileObject(), data, len))
-{
-}
-
-
-BinaryData::BinaryData(FileMetadata* file, const string& path):
- CoreBinaryView(BNCreateBinaryDataViewFromFilename(file->GetFileObject(), path.c_str()))
-{
-}
-
-
-BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor):
- CoreBinaryView(BNCreateBinaryDataViewFromFile(file->GetFileObject(), accessor->GetCallbacks()))
-{
-}
-
-
-BNBinaryView* BinaryViewType::CreateCallback(void* ctxt, BNBinaryView* data)
-{
- BinaryViewType* type = (BinaryViewType*)ctxt;
- Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data));
- Ref<BinaryView> result = type->Create(view);
- return BNNewViewReference(result->GetViewObject());
-}
-
-
-bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data)
-{
- BinaryViewType* type = (BinaryViewType*)ctxt;
- Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data));
- return type->IsTypeValidForData(view);
-}
-
-
-BinaryViewType::BinaryViewType(BNBinaryViewType* type): m_type(type)
-{
-}
-
-
-BinaryViewType::BinaryViewType(const string& name, const string& longName):
- m_type(nullptr), m_nameForRegister(name), m_longNameForRegister(longName)
-{
-}
-
-
-BinaryViewType::~BinaryViewType()
-{
- BNFreeBinaryViewType(m_type);
-}
-
-
-void BinaryViewType::Register(BinaryViewType* type)
-{
- BNCustomBinaryViewType callbacks;
- callbacks.context = type;
- callbacks.create = CreateCallback;
- callbacks.isValidForData = IsValidCallback;
-
- type->m_type = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(),
- type->m_longNameForRegister.c_str(), &callbacks);
-}
-
-
-Ref<BinaryViewType> BinaryViewType::GetByName(const string& name)
-{
- BNBinaryViewType* type = BNGetBinaryViewTypeByName(name.c_str());
- if (!type)
- return nullptr;
- return new CoreBinaryViewType(type);
-}
-
-
-vector<Ref<BinaryViewType>> BinaryViewType::GetViewTypesForData(BinaryView* data)
-{
- BNBinaryViewType** types;
- size_t count;
- types = BNGetBinaryViewTypesForData(data->GetViewObject(), &count);
-
- vector<Ref<BinaryViewType>> result;
- for (size_t i = 0; i < count; i++)
- result.push_back(new CoreBinaryViewType(BNNewViewTypeReference(types[i])));
-
- BNFreeBinaryViewTypeList(types, count);
- return result;
-}
-
-
-string BinaryViewType::GetName()
-{
- char* contents = BNGetBinaryViewTypeName(m_type);
- string result = contents;
- BNFreeString(contents);
- return result;
-}
-
-
-string BinaryViewType::GetLongName()
-{
- char* contents = BNGetBinaryViewTypeLongName(m_type);
- string result = contents;
- BNFreeString(contents);
- return result;
-}
-
-
-CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type): BinaryViewType(type)
-{
-}
-
-
-BinaryView* CoreBinaryViewType::Create(BinaryView* data)
-{
- BNBinaryView* view = BNCreateBinaryViewOfType(m_type, data->GetViewObject());
- if (!view)
- return nullptr;
- return new CoreBinaryView(view);
-}
-
-
-bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data)
-{
- return BNIsBinaryViewTypeValidForData(m_type, data->GetViewObject());
-}
-
-
-BinaryReader::BinaryReader(BinaryView* data, BNEndianness endian): m_view(data)
-{
- m_stream = BNCreateBinaryReader(data->GetViewObject());
- BNSetBinaryReaderEndianness(m_stream, endian);
-}
-
-
-BinaryReader::~BinaryReader()
-{
- BNFreeBinaryReader(m_stream);
-}
-
-
-BNEndianness BinaryReader::GetEndianness() const
-{
- return BNGetBinaryReaderEndianness(m_stream);
-}
-
-
-void BinaryReader::SetEndianness(BNEndianness endian)
-{
- BNSetBinaryReaderEndianness(m_stream, endian);
-}
-
-
-void BinaryReader::Read(void* dest, size_t len)
-{
- if (!BNReadData(m_stream, dest, len))
- throw ReadException();
-}
-
-
-DataBuffer BinaryReader::Read(size_t len)
-{
- DataBuffer result(len);
- Read(result.GetData(), len);
- return result;
-}
-
-
-string BinaryReader::ReadString(size_t len)
-{
- DataBuffer result = Read(len);
- return string((const char*)result.GetData(), len);
-}
-
-
-uint8_t BinaryReader::Read8()
-{
- uint8_t result;
- if (!BNRead8(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint16_t BinaryReader::Read16()
-{
- uint16_t result;
- if (!BNRead16(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint32_t BinaryReader::Read32()
-{
- uint32_t result;
- if (!BNRead32(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint64_t BinaryReader::Read64()
-{
- uint64_t result;
- if (!BNRead64(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint16_t BinaryReader::ReadLE16()
-{
- uint16_t result;
- if (!BNReadLE16(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint32_t BinaryReader::ReadLE32()
-{
- uint32_t result;
- if (!BNReadLE32(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint64_t BinaryReader::ReadLE64()
-{
- uint64_t result;
- if (!BNReadLE64(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint16_t BinaryReader::ReadBE16()
-{
- uint16_t result;
- if (!BNReadBE16(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint32_t BinaryReader::ReadBE32()
-{
- uint32_t result;
- if (!BNReadBE32(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-uint64_t BinaryReader::ReadBE64()
-{
- uint64_t result;
- if (!BNReadBE64(m_stream, &result))
- throw ReadException();
- return result;
-}
-
-
-bool BinaryReader::TryRead(void* dest, size_t len)
-{
- return BNReadData(m_stream, dest, len);
-}
-
-
-bool BinaryReader::TryRead(DataBuffer& dest, size_t len)
-{
- dest.SetSize(len);
- return TryRead(dest.GetData(), len);
-}
-
-
-bool BinaryReader::TryReadString(string& dest, size_t len)
-{
- DataBuffer result(len);
- if (!TryRead(result.GetData(), len))
- return false;
- dest = string((const char*)result.GetData(), len);
- return true;
-}
-
-
-bool BinaryReader::TryRead8(uint8_t& result)
-{
- return BNRead8(m_stream, &result);
-}
-
-
-bool BinaryReader::TryRead16(uint16_t& result)
-{
- return BNRead16(m_stream, &result);
-}
-
-
-bool BinaryReader::TryRead32(uint32_t& result)
-{
- return BNRead32(m_stream, &result);
-}
-
-
-bool BinaryReader::TryRead64(uint64_t& result)
-{
- return BNRead64(m_stream, &result);
-}
-
-
-bool BinaryReader::TryReadLE16(uint16_t& result)
-{
- return BNReadLE16(m_stream, &result);
-}
-
-
-bool BinaryReader::TryReadLE32(uint32_t& result)
-{
- return BNReadLE32(m_stream, &result);
-}
-
-
-bool BinaryReader::TryReadLE64(uint64_t& result)
-{
- return BNReadLE64(m_stream, &result);
-}
-
-
-bool BinaryReader::TryReadBE16(uint16_t& result)
-{
- return BNReadBE16(m_stream, &result);
-}
-
-
-bool BinaryReader::TryReadBE32(uint32_t& result)
-{
- return BNReadBE32(m_stream, &result);
-}
-
-
-bool BinaryReader::TryReadBE64(uint64_t& result)
-{
- return BNReadBE64(m_stream, &result);
-}
-
-
-uint64_t BinaryReader::GetOffset() const
-{
- return BNGetReaderPosition(m_stream);
-}
-
-
-void BinaryReader::Seek(uint64_t offset)
-{
- BNSeekBinaryReader(m_stream, offset);
-}
-
-
-void BinaryReader::SeekRelative(int64_t offset)
-{
- BNSeekBinaryReaderRelative(m_stream, offset);
-}
-
-
-bool BinaryReader::IsEndOfFile() const
-{
- return BNIsEndOfFile(m_stream);
-}
-
-
-BinaryWriter::BinaryWriter(BinaryView* data, BNEndianness endian): m_view(data)
-{
- m_stream = BNCreateBinaryWriter(data->GetViewObject());
- BNSetBinaryWriterEndianness(m_stream, endian);
-}
-
-
-BinaryWriter::~BinaryWriter()
-{
- BNFreeBinaryWriter(m_stream);
-}
-
-
-BNEndianness BinaryWriter::GetEndianness() const
-{
- return BNGetBinaryWriterEndianness(m_stream);
-}
-
-
-void BinaryWriter::SetEndianness(BNEndianness endian)
-{
- BNSetBinaryWriterEndianness(m_stream, endian);
-}
-
-
-void BinaryWriter::Write(const void* src, size_t len)
-{
- if (!BNWriteData(m_stream, src, len))
- throw WriteException();
-}
-
-
-void BinaryWriter::Write(const DataBuffer& buf)
-{
- Write(buf.GetData(), buf.GetLength());
-}
-
-
-void BinaryWriter::Write(const string& str)
-{
- Write(str.c_str(), str.size());
-}
-
-
-void BinaryWriter::Write8(uint8_t val)
-{
- if (!BNWrite8(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::Write16(uint16_t val)
-{
- if (!BNWrite16(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::Write32(uint32_t val)
-{
- if (!BNWrite32(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::Write64(uint64_t val)
-{
- if (!BNWrite64(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::WriteLE16(uint16_t val)
-{
- if (!BNWriteLE16(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::WriteLE32(uint32_t val)
-{
- if (!BNWriteLE32(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::WriteLE64(uint64_t val)
-{
- if (!BNWriteLE64(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::WriteBE16(uint16_t val)
-{
- if (!BNWriteBE16(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::WriteBE32(uint32_t val)
-{
- if (!BNWriteBE32(m_stream, val))
- throw WriteException();
-}
-
-
-void BinaryWriter::WriteBE64(uint64_t val)
-{
- if (!BNWriteBE64(m_stream, val))
- throw WriteException();
-}
-
-
-bool BinaryWriter::TryWrite(const void* src, size_t len)
-{
- return BNWriteData(m_stream, src, len);
-}
-
-
-bool BinaryWriter::TryWrite(const DataBuffer& buf)
-{
- return TryWrite(buf.GetData(), buf.GetLength());
-}
-
-
-bool BinaryWriter::TryWrite(const string& str)
-{
- return TryWrite(str.c_str(), str.size());
-}
-
-
-bool BinaryWriter::TryWrite8(uint8_t val)
-{
- return BNWrite8(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWrite16(uint16_t val)
-{
- return BNWrite16(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWrite32(uint32_t val)
-{
- return BNWrite32(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWrite64(uint64_t val)
-{
- return BNWrite64(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWriteLE16(uint16_t val)
-{
- return BNWriteLE16(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWriteLE32(uint32_t val)
-{
- return BNWriteLE32(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWriteLE64(uint64_t val)
-{
- return BNWriteLE64(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWriteBE16(uint16_t val)
-{
- return BNWriteBE16(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWriteBE32(uint32_t val)
-{
- return BNWriteBE32(m_stream, val);
-}
-
-
-bool BinaryWriter::TryWriteBE64(uint64_t val)
-{
- return BNWriteBE64(m_stream, val);
-}
-
-
-uint64_t BinaryWriter::GetOffset() const
-{
- return BNGetWriterPosition(m_stream);
-}
-
-
-void BinaryWriter::Seek(uint64_t offset)
-{
- BNSeekBinaryWriter(m_stream, offset);
-}
-
-
-void BinaryWriter::SeekRelative(int64_t offset)
-{
- BNSeekBinaryWriterRelative(m_stream, offset);
-}
-
-
-Transform::Transform(BNTransform* xform): m_xform(xform)
-{
-}
-
-
-Transform::Transform(BNTransformType type, const string& name, const string& longName):
- m_xform(nullptr), m_typeForRegister(type), m_nameForRegister(name), m_longNameForRegister(longName)
-{
-}
-
-
-BNTransformParameterInfo* Transform::GetParametersCallback(void* ctxt, size_t* count)
-{
- Transform* xform = (Transform*)ctxt;
- vector<TransformParameter> params = xform->GetParameters();
- *count = params.size();
- BNTransformParameterInfo* result = new BNTransformParameterInfo[params.size()];
-
- for (size_t i = 0; i < params.size(); i++)
- {
- result[i].name = BNAllocString(params[i].name.c_str());
- result[i].longName = BNAllocString(params[i].longName.c_str());
- result[i].fixedLength = params[i].fixedLength;
- }
-
- return result;
-}
-
-
-void Transform::FreeParametersCallback(BNTransformParameterInfo* params, size_t count)
-{
- for (size_t i = 0; i < count; i++)
- {
- BNFreeString(params[i].name);
- BNFreeString(params[i].longName);
- }
- delete[] params;
-}
-
-
-bool Transform::DecodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount)
-{
- map<string, DataBuffer> paramMap;
- for (size_t i = 0; i < paramCount; i++)
- paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value));
-
- DataBuffer inputBuf(BNDuplicateDataBuffer(input));
- DataBuffer outputBuf;
-
- Transform* xform = (Transform*)ctxt;
- bool result = xform->Decode(inputBuf, outputBuf, paramMap);
- BNAssignDataBuffer(output, outputBuf.GetBufferObject());
- return result;
-}
-
-
-bool Transform::EncodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount)
-{
- map<string, DataBuffer> paramMap;
- for (size_t i = 0; i < paramCount; i++)
- paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value));
-
- DataBuffer inputBuf(BNDuplicateDataBuffer(input));
- DataBuffer outputBuf;
-
- Transform* xform = (Transform*)ctxt;
- bool result = xform->Encode(inputBuf, outputBuf, paramMap);
- BNAssignDataBuffer(output, outputBuf.GetBufferObject());
- return result;
-}
-
-
-vector<TransformParameter> Transform::EncryptionKeyParameters(size_t fixedKeyLength)
-{
- vector<TransformParameter> params;
- TransformParameter key;
- key.name = "key";
- key.longName = "Encryption key";
- key.fixedLength = fixedKeyLength;
- params.push_back(key);
- return params;
-}
-
-
-vector<TransformParameter> Transform::EncryptionKeyAndIVParameters(size_t fixedKeyLength, size_t fixedIVLength)
-{
- vector<TransformParameter> params;
- TransformParameter key, iv;
- key.name = "key";
- key.longName = "Encryption key";
- key.fixedLength = fixedKeyLength;
- iv.name = "iv";
- iv.longName = "Initialization vector";
- iv.fixedLength = fixedIVLength;
- params.push_back(key);
- params.push_back(iv);
- return params;
-}
-
-
-void Transform::Register(Transform* xform)
-{
- BNCustomTransform callbacks;
- callbacks.context = xform;
- callbacks.getParameters = GetParametersCallback;
- callbacks.freeParameters = FreeParametersCallback;
- callbacks.decode = DecodeCallback;
- callbacks.encode = EncodeCallback;
- xform->m_xform = BNRegisterTransformType(xform->m_typeForRegister, xform->m_nameForRegister.c_str(),
- xform->m_longNameForRegister.c_str(), &callbacks);
-}
-
-
-Ref<Transform> Transform::GetByName(const string& name)
-{
- BNTransform* result = BNGetTransformByName(name.c_str());
- if (!result)
- return nullptr;
- return new CoreTransform(result);
-}
-
-
-vector<Ref<Transform>> Transform::GetTransformTypes()
-{
- size_t count;
- BNTransform** list = BNGetTransformTypeList(&count);
-
- vector<Ref<Transform>> result;
- for (size_t i = 0; i < count; i++)
- result.push_back(new CoreTransform(BNNewTransformReference(list[i])));
-
- BNFreeTransformTypeList(list, count);
- return result;
-}
-
-
-BNTransformType Transform::GetType() const
-{
- return BNGetTransformType(m_xform);
-}
-
-
-string Transform::GetName() const
-{
- char* name = BNGetTransformName(m_xform);
- string result = name;
- BNFreeString(name);
- return result;
-}
-
-
-string Transform::GetLongName() const
-{
- char* name = BNGetTransformLongName(m_xform);
- string result = name;
- BNFreeString(name);
- return result;
-}
-
-
-vector<TransformParameter> Transform::GetParameters() const
-{
- return vector<TransformParameter>();
-}
-
-
-bool Transform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
-{
- if (GetType() == InvertingTransform)
- return Encode(input, output, params);
- return false;
-}
-
-
-bool Transform::Encode(const DataBuffer&, DataBuffer&, const map<string, DataBuffer>&)
-{
- return false;
-}
-
-
-CoreTransform::CoreTransform(BNTransform* xform): Transform(xform)
-{
-}
-
-
-vector<TransformParameter> CoreTransform::GetParameters() const
-{
- size_t count;
- BNTransformParameterInfo* list = BNGetTransformParameterList(m_xform, &count);
-
- vector<TransformParameter> result;
- for (size_t i = 0; i < count; i++)
- {
- TransformParameter param;
- param.name = list[i].name;
- param.longName = list[i].longName;
- param.fixedLength = list[i].fixedLength;
- }
-
- BNFreeTransformParameterList(list, count);
- return result;
-}
-
-
-bool CoreTransform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
-{
- BNTransformParameter* list = new BNTransformParameter[params.size()];
- size_t idx = 0;
- for (auto i : params)
- {
- list[idx].name = i.first.c_str();
- list[idx].value = i.second.GetBufferObject();
- }
-
- bool result = BNDecode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx);
-
- delete[] list;
- return result;
-}
-
-
-bool CoreTransform::Encode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
-{
- BNTransformParameter* list = new BNTransformParameter[params.size()];
- size_t idx = 0;
- for (auto i : params)
- {
- list[idx].name = i.first.c_str();
- list[idx].value = i.second.GetBufferObject();
- }
-
- bool result = BNEncode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx);
-
- delete[] list;
- return result;
-}
diff --git a/binaryreader.cpp b/binaryreader.cpp
new file mode 100644
index 00000000..b30a64b0
--- /dev/null
+++ b/binaryreader.cpp
@@ -0,0 +1,248 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+BinaryReader::BinaryReader(BinaryView* data, BNEndianness endian): m_view(data)
+{
+ m_stream = BNCreateBinaryReader(data->GetViewObject());
+ BNSetBinaryReaderEndianness(m_stream, endian);
+}
+
+
+BinaryReader::~BinaryReader()
+{
+ BNFreeBinaryReader(m_stream);
+}
+
+
+BNEndianness BinaryReader::GetEndianness() const
+{
+ return BNGetBinaryReaderEndianness(m_stream);
+}
+
+
+void BinaryReader::SetEndianness(BNEndianness endian)
+{
+ BNSetBinaryReaderEndianness(m_stream, endian);
+}
+
+
+void BinaryReader::Read(void* dest, size_t len)
+{
+ if (!BNReadData(m_stream, dest, len))
+ throw ReadException();
+}
+
+
+DataBuffer BinaryReader::Read(size_t len)
+{
+ DataBuffer result(len);
+ Read(result.GetData(), len);
+ return result;
+}
+
+
+string BinaryReader::ReadString(size_t len)
+{
+ DataBuffer result = Read(len);
+ return string((const char*)result.GetData(), len);
+}
+
+
+uint8_t BinaryReader::Read8()
+{
+ uint8_t result;
+ if (!BNRead8(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint16_t BinaryReader::Read16()
+{
+ uint16_t result;
+ if (!BNRead16(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint32_t BinaryReader::Read32()
+{
+ uint32_t result;
+ if (!BNRead32(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint64_t BinaryReader::Read64()
+{
+ uint64_t result;
+ if (!BNRead64(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint16_t BinaryReader::ReadLE16()
+{
+ uint16_t result;
+ if (!BNReadLE16(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint32_t BinaryReader::ReadLE32()
+{
+ uint32_t result;
+ if (!BNReadLE32(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint64_t BinaryReader::ReadLE64()
+{
+ uint64_t result;
+ if (!BNReadLE64(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint16_t BinaryReader::ReadBE16()
+{
+ uint16_t result;
+ if (!BNReadBE16(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint32_t BinaryReader::ReadBE32()
+{
+ uint32_t result;
+ if (!BNReadBE32(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+uint64_t BinaryReader::ReadBE64()
+{
+ uint64_t result;
+ if (!BNReadBE64(m_stream, &result))
+ throw ReadException();
+ return result;
+}
+
+
+bool BinaryReader::TryRead(void* dest, size_t len)
+{
+ return BNReadData(m_stream, dest, len);
+}
+
+
+bool BinaryReader::TryRead(DataBuffer& dest, size_t len)
+{
+ dest.SetSize(len);
+ return TryRead(dest.GetData(), len);
+}
+
+
+bool BinaryReader::TryReadString(string& dest, size_t len)
+{
+ DataBuffer result(len);
+ if (!TryRead(result.GetData(), len))
+ return false;
+ dest = string((const char*)result.GetData(), len);
+ return true;
+}
+
+
+bool BinaryReader::TryRead8(uint8_t& result)
+{
+ return BNRead8(m_stream, &result);
+}
+
+
+bool BinaryReader::TryRead16(uint16_t& result)
+{
+ return BNRead16(m_stream, &result);
+}
+
+
+bool BinaryReader::TryRead32(uint32_t& result)
+{
+ return BNRead32(m_stream, &result);
+}
+
+
+bool BinaryReader::TryRead64(uint64_t& result)
+{
+ return BNRead64(m_stream, &result);
+}
+
+
+bool BinaryReader::TryReadLE16(uint16_t& result)
+{
+ return BNReadLE16(m_stream, &result);
+}
+
+
+bool BinaryReader::TryReadLE32(uint32_t& result)
+{
+ return BNReadLE32(m_stream, &result);
+}
+
+
+bool BinaryReader::TryReadLE64(uint64_t& result)
+{
+ return BNReadLE64(m_stream, &result);
+}
+
+
+bool BinaryReader::TryReadBE16(uint16_t& result)
+{
+ return BNReadBE16(m_stream, &result);
+}
+
+
+bool BinaryReader::TryReadBE32(uint32_t& result)
+{
+ return BNReadBE32(m_stream, &result);
+}
+
+
+bool BinaryReader::TryReadBE64(uint64_t& result)
+{
+ return BNReadBE64(m_stream, &result);
+}
+
+
+uint64_t BinaryReader::GetOffset() const
+{
+ return BNGetReaderPosition(m_stream);
+}
+
+
+void BinaryReader::Seek(uint64_t offset)
+{
+ BNSeekBinaryReader(m_stream, offset);
+}
+
+
+void BinaryReader::SeekRelative(int64_t offset)
+{
+ BNSeekBinaryReaderRelative(m_stream, offset);
+}
+
+
+bool BinaryReader::IsEndOfFile() const
+{
+ return BNIsEndOfFile(m_stream);
+}
diff --git a/binaryview.cpp b/binaryview.cpp
new file mode 100644
index 00000000..23ff8c56
--- /dev/null
+++ b/binaryview.cpp
@@ -0,0 +1,332 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+void BinaryDataNotification::DataWrittenCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
+ notify->OnBinaryDataWritten(view, offset, len);
+}
+
+
+void BinaryDataNotification::DataInsertedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
+ notify->OnBinaryDataInserted(view, offset, len);
+}
+
+
+void BinaryDataNotification::DataRemovedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, uint64_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
+ notify->OnBinaryDataRemoved(view, offset, len);
+}
+
+
+BinaryDataNotification::BinaryDataNotification()
+{
+ m_callbacks.context = this;
+ m_callbacks.dataWritten = DataWrittenCallback;
+ m_callbacks.dataInserted = DataInsertedCallback;
+ m_callbacks.dataRemoved = DataRemovedCallback;
+}
+
+
+BinaryView::BinaryView(FileMetadata* file)
+{
+ BNCustomBinaryView view;
+ view.context = this;
+ view.read = ReadCallback;
+ view.write = WriteCallback;
+ view.insert = InsertCallback;
+ view.remove = RemoveCallback;
+ view.getModification = GetModificationCallback;
+ view.getStart = GetStartCallback;
+ view.getLength = GetLengthCallback;
+ view.isExecutable = IsExecutableCallback;
+ view.save = SaveCallback;
+
+ m_file = file;
+ m_view = BNCreateCustomBinaryView(m_file->GetFileObject(), &view);
+}
+
+
+BinaryView::BinaryView(BNBinaryView* view)
+{
+ m_view = view;
+ m_file = new FileMetadata(BNNewFileReference(BNGetFileForView(m_view)));
+}
+
+
+BinaryView::~BinaryView()
+{
+ BNFreeBinaryView(m_view);
+}
+
+
+size_t BinaryView::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Read(dest, offset, len);
+}
+
+
+size_t BinaryView::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Write(offset, src, len);
+}
+
+
+size_t BinaryView::InsertCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Insert(offset, src, len);
+}
+
+
+size_t BinaryView::RemoveCallback(void* ctxt, uint64_t offset, uint64_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Remove(offset, len);
+}
+
+
+BNModificationStatus BinaryView::GetModificationCallback(void* ctxt, uint64_t offset)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->GetModification(offset);
+}
+
+
+uint64_t BinaryView::GetStartCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->GetStart();
+}
+
+
+uint64_t BinaryView::GetLengthCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->GetLength();
+}
+
+
+bool BinaryView::IsExecutableCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->IsExecutable();
+}
+
+
+bool BinaryView::SaveCallback(void* ctxt, BNFileAccessor* file)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ CoreFileAccessor accessor(file);
+ return view->Save(&accessor);
+}
+
+
+bool BinaryView::IsModified() const
+{
+ return m_file->IsModified();
+}
+
+
+void BinaryView::BeginUndoActions()
+{
+ m_file->BeginUndoActions();
+}
+
+
+void BinaryView::AddUndoAction(UndoAction* action)
+{
+ m_file->AddUndoAction(action);
+}
+
+
+void BinaryView::CommitUndoActions()
+{
+ m_file->CommitUndoActions();
+}
+
+
+bool BinaryView::Undo()
+{
+ return m_file->Undo();
+}
+
+
+bool BinaryView::Redo()
+{
+ return m_file->Redo();
+}
+
+
+string BinaryView::GetCurrentView()
+{
+ return m_file->GetCurrentView();
+}
+
+
+uint64_t BinaryView::GetCurrentOffset()
+{
+ return m_file->GetCurrentOffset();
+}
+
+
+bool BinaryView::Navigate(const string& view, uint64_t offset)
+{
+ return m_file->Navigate(view, offset);
+}
+
+
+DataBuffer BinaryView::ReadBuffer(uint64_t offset, size_t len)
+{
+ BNDataBuffer* result = BNReadViewBuffer(m_view, offset, len);
+ return DataBuffer(result);
+}
+
+
+size_t BinaryView::WriteBuffer(uint64_t offset, const DataBuffer& data)
+{
+ return BNWriteViewBuffer(m_view, offset, data.GetBufferObject());
+}
+
+
+size_t BinaryView::InsertBuffer(uint64_t offset, const DataBuffer& data)
+{
+ return BNInsertViewBuffer(m_view, offset, data.GetBufferObject());
+}
+
+
+vector<BNModificationStatus> BinaryView::GetModification(uint64_t offset, size_t len)
+{
+ BNModificationStatus* mod = new BNModificationStatus[len];
+ len = BNGetModificationArray(m_view, offset, mod, len);
+
+ vector<BNModificationStatus> result;
+ for (size_t i = 0; i < len; i++)
+ result.push_back(mod[i]);
+
+ delete[] mod;
+ return result;
+}
+
+
+uint64_t BinaryView::GetEnd() const
+{
+ return BNGetEndOffset(m_view);
+}
+
+
+bool BinaryView::Save(const string& path)
+{
+ return BNSaveToFilename(m_view, path.c_str());
+}
+
+
+void BinaryView::RegisterNotification(BinaryDataNotification* notify)
+{
+ BNRegisterDataNotification(m_view, notify->GetCallbacks());
+}
+
+
+void BinaryView::UnregisterNotification(BinaryDataNotification* notify)
+{
+ BNUnregisterDataNotification(m_view, notify->GetCallbacks());
+}
+
+
+CoreBinaryView::CoreBinaryView(BNBinaryView* view): BinaryView(view)
+{
+}
+
+
+size_t CoreBinaryView::Read(void* dest, uint64_t offset, size_t len)
+{
+ return BNReadViewData(m_view, dest, offset, len);
+}
+
+
+size_t CoreBinaryView::Write(uint64_t offset, const void* data, size_t len)
+{
+ return BNWriteViewData(m_view, offset, data, len);
+}
+
+
+size_t CoreBinaryView::Insert(uint64_t offset, const void* data, size_t len)
+{
+ return BNInsertViewData(m_view, offset, data, len);
+}
+
+
+size_t CoreBinaryView::Remove(uint64_t offset, uint64_t len)
+{
+ return BNRemoveViewData(m_view, offset, len);
+}
+
+
+BNModificationStatus CoreBinaryView::GetModification(uint64_t offset)
+{
+ return BNGetModification(m_view, offset);
+}
+
+
+uint64_t CoreBinaryView::GetStart() const
+{
+ return BNGetStartOffset(m_view);
+}
+
+
+uint64_t CoreBinaryView::GetLength() const
+{
+ return BNGetViewLength(m_view);
+}
+
+
+bool CoreBinaryView::IsExecutable() const
+{
+ return BNIsExecutableView(m_view);
+}
+
+
+bool CoreBinaryView::Save(FileAccessor* file)
+{
+ return BNSaveToFile(m_view, file->GetCallbacks());
+}
+
+
+BinaryData::BinaryData(FileMetadata* file): CoreBinaryView(BNCreateBinaryDataView(file->GetFileObject()))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, const DataBuffer& data):
+ CoreBinaryView(BNCreateBinaryDataViewFromBuffer(file->GetFileObject(), data.GetBufferObject()))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, const void* data, size_t len):
+ CoreBinaryView(BNCreateBinaryDataViewFromData(file->GetFileObject(), data, len))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, const string& path):
+ CoreBinaryView(BNCreateBinaryDataViewFromFilename(file->GetFileObject(), path.c_str()))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor):
+ CoreBinaryView(BNCreateBinaryDataViewFromFile(file->GetFileObject(), accessor->GetCallbacks()))
+{
+}
diff --git a/binaryviewtype.cpp b/binaryviewtype.cpp
new file mode 100644
index 00000000..636a8856
--- /dev/null
+++ b/binaryviewtype.cpp
@@ -0,0 +1,112 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+BNBinaryView* BinaryViewType::CreateCallback(void* ctxt, BNBinaryView* data)
+{
+ BinaryViewType* type = (BinaryViewType*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data));
+ Ref<BinaryView> result = type->Create(view);
+ return BNNewViewReference(result->GetViewObject());
+}
+
+
+bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data)
+{
+ BinaryViewType* type = (BinaryViewType*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data));
+ return type->IsTypeValidForData(view);
+}
+
+
+BinaryViewType::BinaryViewType(BNBinaryViewType* type): m_type(type)
+{
+}
+
+
+BinaryViewType::BinaryViewType(const string& name, const string& longName):
+ m_type(nullptr), m_nameForRegister(name), m_longNameForRegister(longName)
+{
+}
+
+
+BinaryViewType::~BinaryViewType()
+{
+ BNFreeBinaryViewType(m_type);
+}
+
+
+void BinaryViewType::Register(BinaryViewType* type)
+{
+ BNCustomBinaryViewType callbacks;
+ callbacks.context = type;
+ callbacks.create = CreateCallback;
+ callbacks.isValidForData = IsValidCallback;
+
+ type->m_type = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(),
+ type->m_longNameForRegister.c_str(), &callbacks);
+}
+
+
+Ref<BinaryViewType> BinaryViewType::GetByName(const string& name)
+{
+ BNBinaryViewType* type = BNGetBinaryViewTypeByName(name.c_str());
+ if (!type)
+ return nullptr;
+ return new CoreBinaryViewType(type);
+}
+
+
+vector<Ref<BinaryViewType>> BinaryViewType::GetViewTypesForData(BinaryView* data)
+{
+ BNBinaryViewType** types;
+ size_t count;
+ types = BNGetBinaryViewTypesForData(data->GetViewObject(), &count);
+
+ vector<Ref<BinaryViewType>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new CoreBinaryViewType(BNNewViewTypeReference(types[i])));
+
+ BNFreeBinaryViewTypeList(types, count);
+ return result;
+}
+
+
+string BinaryViewType::GetName()
+{
+ char* contents = BNGetBinaryViewTypeName(m_type);
+ string result = contents;
+ BNFreeString(contents);
+ return result;
+}
+
+
+string BinaryViewType::GetLongName()
+{
+ char* contents = BNGetBinaryViewTypeLongName(m_type);
+ string result = contents;
+ BNFreeString(contents);
+ return result;
+}
+
+
+CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type): BinaryViewType(type)
+{
+}
+
+
+BinaryView* CoreBinaryViewType::Create(BinaryView* data)
+{
+ BNBinaryView* view = BNCreateBinaryViewOfType(m_type, data->GetViewObject());
+ if (!view)
+ return nullptr;
+ return new CoreBinaryView(view);
+}
+
+
+bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data)
+{
+ return BNIsBinaryViewTypeValidForData(m_type, data->GetViewObject());
+}
diff --git a/binarywriter.cpp b/binarywriter.cpp
new file mode 100644
index 00000000..808d0d5f
--- /dev/null
+++ b/binarywriter.cpp
@@ -0,0 +1,214 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+BinaryWriter::BinaryWriter(BinaryView* data, BNEndianness endian): m_view(data)
+{
+ m_stream = BNCreateBinaryWriter(data->GetViewObject());
+ BNSetBinaryWriterEndianness(m_stream, endian);
+}
+
+
+BinaryWriter::~BinaryWriter()
+{
+ BNFreeBinaryWriter(m_stream);
+}
+
+
+BNEndianness BinaryWriter::GetEndianness() const
+{
+ return BNGetBinaryWriterEndianness(m_stream);
+}
+
+
+void BinaryWriter::SetEndianness(BNEndianness endian)
+{
+ BNSetBinaryWriterEndianness(m_stream, endian);
+}
+
+
+void BinaryWriter::Write(const void* src, size_t len)
+{
+ if (!BNWriteData(m_stream, src, len))
+ throw WriteException();
+}
+
+
+void BinaryWriter::Write(const DataBuffer& buf)
+{
+ Write(buf.GetData(), buf.GetLength());
+}
+
+
+void BinaryWriter::Write(const string& str)
+{
+ Write(str.c_str(), str.size());
+}
+
+
+void BinaryWriter::Write8(uint8_t val)
+{
+ if (!BNWrite8(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::Write16(uint16_t val)
+{
+ if (!BNWrite16(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::Write32(uint32_t val)
+{
+ if (!BNWrite32(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::Write64(uint64_t val)
+{
+ if (!BNWrite64(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::WriteLE16(uint16_t val)
+{
+ if (!BNWriteLE16(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::WriteLE32(uint32_t val)
+{
+ if (!BNWriteLE32(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::WriteLE64(uint64_t val)
+{
+ if (!BNWriteLE64(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::WriteBE16(uint16_t val)
+{
+ if (!BNWriteBE16(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::WriteBE32(uint32_t val)
+{
+ if (!BNWriteBE32(m_stream, val))
+ throw WriteException();
+}
+
+
+void BinaryWriter::WriteBE64(uint64_t val)
+{
+ if (!BNWriteBE64(m_stream, val))
+ throw WriteException();
+}
+
+
+bool BinaryWriter::TryWrite(const void* src, size_t len)
+{
+ return BNWriteData(m_stream, src, len);
+}
+
+
+bool BinaryWriter::TryWrite(const DataBuffer& buf)
+{
+ return TryWrite(buf.GetData(), buf.GetLength());
+}
+
+
+bool BinaryWriter::TryWrite(const string& str)
+{
+ return TryWrite(str.c_str(), str.size());
+}
+
+
+bool BinaryWriter::TryWrite8(uint8_t val)
+{
+ return BNWrite8(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWrite16(uint16_t val)
+{
+ return BNWrite16(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWrite32(uint32_t val)
+{
+ return BNWrite32(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWrite64(uint64_t val)
+{
+ return BNWrite64(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWriteLE16(uint16_t val)
+{
+ return BNWriteLE16(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWriteLE32(uint32_t val)
+{
+ return BNWriteLE32(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWriteLE64(uint64_t val)
+{
+ return BNWriteLE64(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWriteBE16(uint16_t val)
+{
+ return BNWriteBE16(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWriteBE32(uint32_t val)
+{
+ return BNWriteBE32(m_stream, val);
+}
+
+
+bool BinaryWriter::TryWriteBE64(uint64_t val)
+{
+ return BNWriteBE64(m_stream, val);
+}
+
+
+uint64_t BinaryWriter::GetOffset() const
+{
+ return BNGetWriterPosition(m_stream);
+}
+
+
+void BinaryWriter::Seek(uint64_t offset)
+{
+ BNSeekBinaryWriter(m_stream, offset);
+}
+
+
+void BinaryWriter::SeekRelative(int64_t offset)
+{
+ BNSeekBinaryWriterRelative(m_stream, offset);
+}
diff --git a/databuffer.cpp b/databuffer.cpp
new file mode 100644
index 00000000..dcc94f90
--- /dev/null
+++ b/databuffer.cpp
@@ -0,0 +1,103 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+DataBuffer::DataBuffer()
+{
+ m_buffer = BNCreateDataBuffer(nullptr, 0);
+}
+
+
+DataBuffer::DataBuffer(size_t len)
+{
+ m_buffer = BNCreateDataBuffer(nullptr, len);
+}
+
+
+DataBuffer::DataBuffer(const DataBuffer& buf)
+{
+ m_buffer = BNDuplicateDataBuffer(buf.m_buffer);
+}
+
+
+DataBuffer::DataBuffer(BNDataBuffer* buf)
+{
+ m_buffer = buf;
+}
+
+
+DataBuffer::~DataBuffer()
+{
+ BNFreeDataBuffer(m_buffer);
+}
+
+
+DataBuffer& DataBuffer::operator=(const DataBuffer& buf)
+{
+ BNFreeDataBuffer(m_buffer);
+ m_buffer = BNDuplicateDataBuffer(buf.m_buffer);
+ return *this;
+}
+
+
+void* DataBuffer::GetData()
+{
+ return BNGetDataBufferContents(m_buffer);
+}
+
+
+const void* DataBuffer::GetData() const
+{
+ return BNGetDataBufferContents(m_buffer);
+}
+
+
+void* DataBuffer::GetDataAt(size_t offset)
+{
+ return BNGetDataBufferContentsAt(m_buffer, offset);
+}
+
+
+size_t DataBuffer::GetLength() const
+{
+ return BNGetDataBufferLength(m_buffer);
+}
+
+
+void DataBuffer::SetSize(size_t len)
+{
+ BNSetDataBufferLength(m_buffer, len);
+}
+
+
+void DataBuffer::Append(const void* data, size_t len)
+{
+ BNAppendDataBufferContents(m_buffer, data, len);
+}
+
+
+void DataBuffer::Append(const DataBuffer& buf)
+{
+ BNAppendDataBuffer(m_buffer, buf.m_buffer);
+}
+
+
+DataBuffer DataBuffer::GetSlice(size_t start, size_t len)
+{
+ BNDataBuffer* result = BNGetDataBufferSlice(m_buffer, start, len);
+ return DataBuffer(result);
+}
+
+
+uint8_t& DataBuffer::operator[](size_t offset)
+{
+ return ((uint8_t*)GetData())[offset];
+}
+
+
+const uint8_t& DataBuffer::operator[](size_t offset) const
+{
+ return ((const uint8_t*)GetData())[offset];
+}
diff --git a/fileaccessor.cpp b/fileaccessor.cpp
new file mode 100644
index 00000000..4a90d8dc
--- /dev/null
+++ b/fileaccessor.cpp
@@ -0,0 +1,63 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+uint64_t FileAccessor::GetLengthCallback(void* ctxt)
+{
+ FileAccessor* file = (FileAccessor*)ctxt;
+ return file->GetLength();
+}
+
+
+size_t FileAccessor::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len)
+{
+ FileAccessor* file = (FileAccessor*)ctxt;
+ return file->Read(dest, offset, len);
+}
+
+
+size_t FileAccessor::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
+{
+ FileAccessor* file = (FileAccessor*)ctxt;
+ return file->Write(offset, src, len);
+}
+
+
+FileAccessor::FileAccessor()
+{
+ m_callbacks.context = this;
+ m_callbacks.getLength = GetLengthCallback;
+ m_callbacks.read = ReadCallback;
+ m_callbacks.write = WriteCallback;
+}
+
+
+FileAccessor::FileAccessor(BNFileAccessor* accessor): m_callbacks(*accessor)
+{
+}
+
+
+CoreFileAccessor::CoreFileAccessor(BNFileAccessor* accessor): FileAccessor(accessor)
+{
+}
+
+
+uint64_t CoreFileAccessor::GetLength() const
+{
+ return m_callbacks.getLength(m_callbacks.context);
+}
+
+
+size_t CoreFileAccessor::Read(void* dest, uint64_t offset, size_t len)
+{
+ return m_callbacks.read(m_callbacks.context, dest, offset, len);
+}
+
+
+size_t CoreFileAccessor::Write(uint64_t offset, const void* src, size_t len)
+{
+ return m_callbacks.write(m_callbacks.context, offset, src, len);
+}
+
diff --git a/filemetadata.cpp b/filemetadata.cpp
new file mode 100644
index 00000000..b214e826
--- /dev/null
+++ b/filemetadata.cpp
@@ -0,0 +1,148 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+char* NavigationHandler::GetCurrentViewCallback(void* ctxt)
+{
+ NavigationHandler* handler = (NavigationHandler*)ctxt;
+ string result = handler->GetCurrentView();
+ return BNAllocString(result.c_str());
+}
+
+
+uint64_t NavigationHandler::GetCurrentOffsetCallback(void* ctxt)
+{
+ NavigationHandler* handler = (NavigationHandler*)ctxt;
+ return handler->GetCurrentOffset();
+}
+
+
+bool NavigationHandler::NavigateCallback(void* ctxt, const char* view, uint64_t offset)
+{
+ NavigationHandler* handler = (NavigationHandler*)ctxt;
+ return handler->Navigate(view, offset);
+}
+
+
+NavigationHandler::NavigationHandler()
+{
+ m_callbacks.context = this;
+ m_callbacks.getCurrentView = GetCurrentViewCallback;
+ m_callbacks.getCurrentOffset = GetCurrentOffsetCallback;
+ m_callbacks.navigate = NavigateCallback;
+}
+
+
+void UndoAction::UndoCallback(void* ctxt)
+{
+ UndoAction* action = (UndoAction*)ctxt;
+ action->Undo();
+}
+
+
+void UndoAction::RedoCallback(void* ctxt)
+{
+ UndoAction* action = (UndoAction*)ctxt;
+ action->Redo();
+}
+
+
+void UndoAction::Add(BNFileMetadata* file)
+{
+ BNAddUndoAction(file, this, UndoCallback, RedoCallback);
+}
+
+
+FileMetadata::FileMetadata()
+{
+ m_file = BNCreateFileMetadata();
+}
+
+
+FileMetadata::FileMetadata(BNFileMetadata* file)
+{
+ m_file = file;
+}
+
+
+FileMetadata::~FileMetadata()
+{
+ BNFreeFileMetadata(m_file);
+}
+
+
+void FileMetadata::SetNavigationHandler(NavigationHandler* handler)
+{
+ BNSetFileMetadataNavigationHandler(m_file, handler->GetCallbacks());
+}
+
+
+bool FileMetadata::IsModified() const
+{
+ return BNIsFileModified(m_file);
+}
+
+
+void FileMetadata::MarkFileModified()
+{
+ BNMarkFileModified(m_file);
+}
+
+
+void FileMetadata::MarkFileSaved()
+{
+ BNMarkFileSaved(m_file);
+}
+
+
+void FileMetadata::BeginUndoActions()
+{
+ BNBeginUndoActions(m_file);
+}
+
+
+void FileMetadata::AddUndoAction(UndoAction* action)
+{
+ action->Add(m_file);
+}
+
+
+void FileMetadata::CommitUndoActions()
+{
+ BNCommitUndoActions(m_file);
+}
+
+
+bool FileMetadata::Undo()
+{
+ return BNUndo(m_file);
+}
+
+
+bool FileMetadata::Redo()
+{
+ return BNRedo(m_file);
+}
+
+
+string FileMetadata::GetCurrentView()
+{
+ char* view = BNGetCurrentView(m_file);
+ string result = view;
+ BNFreeString(view);
+ return result;
+}
+
+
+uint64_t FileMetadata::GetCurrentOffset()
+{
+ return BNGetCurrentOffset(m_file);
+}
+
+
+bool FileMetadata::Navigate(const string& view, uint64_t offset)
+{
+ return BNNavigate(m_file, view.c_str(), offset);
+}
diff --git a/transform.cpp b/transform.cpp
new file mode 100644
index 00000000..4f8fe71d
--- /dev/null
+++ b/transform.cpp
@@ -0,0 +1,242 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+Transform::Transform(BNTransform* xform): m_xform(xform)
+{
+}
+
+
+Transform::Transform(BNTransformType type, const string& name, const string& longName):
+ m_xform(nullptr), m_typeForRegister(type), m_nameForRegister(name), m_longNameForRegister(longName)
+{
+}
+
+
+BNTransformParameterInfo* Transform::GetParametersCallback(void* ctxt, size_t* count)
+{
+ Transform* xform = (Transform*)ctxt;
+ vector<TransformParameter> params = xform->GetParameters();
+ *count = params.size();
+ BNTransformParameterInfo* result = new BNTransformParameterInfo[params.size()];
+
+ for (size_t i = 0; i < params.size(); i++)
+ {
+ result[i].name = BNAllocString(params[i].name.c_str());
+ result[i].longName = BNAllocString(params[i].longName.c_str());
+ result[i].fixedLength = params[i].fixedLength;
+ }
+
+ return result;
+}
+
+
+void Transform::FreeParametersCallback(BNTransformParameterInfo* params, size_t count)
+{
+ for (size_t i = 0; i < count; i++)
+ {
+ BNFreeString(params[i].name);
+ BNFreeString(params[i].longName);
+ }
+ delete[] params;
+}
+
+
+bool Transform::DecodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount)
+{
+ map<string, DataBuffer> paramMap;
+ for (size_t i = 0; i < paramCount; i++)
+ paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value));
+
+ DataBuffer inputBuf(BNDuplicateDataBuffer(input));
+ DataBuffer outputBuf;
+
+ Transform* xform = (Transform*)ctxt;
+ bool result = xform->Decode(inputBuf, outputBuf, paramMap);
+ BNAssignDataBuffer(output, outputBuf.GetBufferObject());
+ return result;
+}
+
+
+bool Transform::EncodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount)
+{
+ map<string, DataBuffer> paramMap;
+ for (size_t i = 0; i < paramCount; i++)
+ paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value));
+
+ DataBuffer inputBuf(BNDuplicateDataBuffer(input));
+ DataBuffer outputBuf;
+
+ Transform* xform = (Transform*)ctxt;
+ bool result = xform->Encode(inputBuf, outputBuf, paramMap);
+ BNAssignDataBuffer(output, outputBuf.GetBufferObject());
+ return result;
+}
+
+
+vector<TransformParameter> Transform::EncryptionKeyParameters(size_t fixedKeyLength)
+{
+ vector<TransformParameter> params;
+ TransformParameter key;
+ key.name = "key";
+ key.longName = "Encryption key";
+ key.fixedLength = fixedKeyLength;
+ params.push_back(key);
+ return params;
+}
+
+
+vector<TransformParameter> Transform::EncryptionKeyAndIVParameters(size_t fixedKeyLength, size_t fixedIVLength)
+{
+ vector<TransformParameter> params;
+ TransformParameter key, iv;
+ key.name = "key";
+ key.longName = "Encryption key";
+ key.fixedLength = fixedKeyLength;
+ iv.name = "iv";
+ iv.longName = "Initialization vector";
+ iv.fixedLength = fixedIVLength;
+ params.push_back(key);
+ params.push_back(iv);
+ return params;
+}
+
+
+void Transform::Register(Transform* xform)
+{
+ BNCustomTransform callbacks;
+ callbacks.context = xform;
+ callbacks.getParameters = GetParametersCallback;
+ callbacks.freeParameters = FreeParametersCallback;
+ callbacks.decode = DecodeCallback;
+ callbacks.encode = EncodeCallback;
+ xform->m_xform = BNRegisterTransformType(xform->m_typeForRegister, xform->m_nameForRegister.c_str(),
+ xform->m_longNameForRegister.c_str(), &callbacks);
+}
+
+
+Ref<Transform> Transform::GetByName(const string& name)
+{
+ BNTransform* result = BNGetTransformByName(name.c_str());
+ if (!result)
+ return nullptr;
+ return new CoreTransform(result);
+}
+
+
+vector<Ref<Transform>> Transform::GetTransformTypes()
+{
+ size_t count;
+ BNTransform** list = BNGetTransformTypeList(&count);
+
+ vector<Ref<Transform>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new CoreTransform(BNNewTransformReference(list[i])));
+
+ BNFreeTransformTypeList(list, count);
+ return result;
+}
+
+
+BNTransformType Transform::GetType() const
+{
+ return BNGetTransformType(m_xform);
+}
+
+
+string Transform::GetName() const
+{
+ char* name = BNGetTransformName(m_xform);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+string Transform::GetLongName() const
+{
+ char* name = BNGetTransformLongName(m_xform);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+vector<TransformParameter> Transform::GetParameters() const
+{
+ return vector<TransformParameter>();
+}
+
+
+bool Transform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
+{
+ if (GetType() == InvertingTransform)
+ return Encode(input, output, params);
+ return false;
+}
+
+
+bool Transform::Encode(const DataBuffer&, DataBuffer&, const map<string, DataBuffer>&)
+{
+ return false;
+}
+
+
+CoreTransform::CoreTransform(BNTransform* xform): Transform(xform)
+{
+}
+
+
+vector<TransformParameter> CoreTransform::GetParameters() const
+{
+ size_t count;
+ BNTransformParameterInfo* list = BNGetTransformParameterList(m_xform, &count);
+
+ vector<TransformParameter> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ TransformParameter param;
+ param.name = list[i].name;
+ param.longName = list[i].longName;
+ param.fixedLength = list[i].fixedLength;
+ }
+
+ BNFreeTransformParameterList(list, count);
+ return result;
+}
+
+
+bool CoreTransform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
+{
+ BNTransformParameter* list = new BNTransformParameter[params.size()];
+ size_t idx = 0;
+ for (auto i : params)
+ {
+ list[idx].name = i.first.c_str();
+ list[idx].value = i.second.GetBufferObject();
+ }
+
+ bool result = BNDecode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx);
+
+ delete[] list;
+ return result;
+}
+
+
+bool CoreTransform::Encode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params)
+{
+ BNTransformParameter* list = new BNTransformParameter[params.size()];
+ size_t idx = 0;
+ for (auto i : params)
+ {
+ list[idx].name = i.first.c_str();
+ list[idx].value = i.second.GetBufferObject();
+ }
+
+ bool result = BNEncode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx);
+
+ delete[] list;
+ return result;
+}