diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-02-11 02:16:40 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-02-11 02:16:40 -0500 |
| commit | 47ad9dfe54195807ed67a2ec4b03fdc1e698310d (patch) | |
| tree | 78d8bbd7a85577d6dcc9ef2445aa529957b5fdef /binaryninjaapi.cpp | |
| parent | 6277a83d956dad6f7cab7ee6193b9326680f8e1f (diff) | |
More ELF parsing, and a view type registration system
Diffstat (limited to 'binaryninjaapi.cpp')
| -rw-r--r-- | binaryninjaapi.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp index 95bb71be..f9a9ac9c 100644 --- a/binaryninjaapi.cpp +++ b/binaryninjaapi.cpp @@ -619,6 +619,103 @@ BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor): } +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): m_type(nullptr), m_nameForRegister(name) +{ +} + + +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(), &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(BinaryData* 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; +} + + +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()); |
