summaryrefslogtreecommitdiff
path: root/type.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'type.cpp')
-rw-r--r--type.cpp357
1 files changed, 357 insertions, 0 deletions
diff --git a/type.cpp b/type.cpp
new file mode 100644
index 00000000..62176deb
--- /dev/null
+++ b/type.cpp
@@ -0,0 +1,357 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+Type::Type(BNType* type): m_type(type)
+{
+}
+
+
+Type::~Type()
+{
+ BNFreeType(m_type);
+}
+
+
+BNTypeClass Type::GetClass() const
+{
+ return BNGetTypeClass(m_type);
+}
+
+
+uint64_t Type::GetWidth() const
+{
+ return BNGetTypeWidth(m_type);
+}
+
+
+size_t Type::GetAlignment() const
+{
+ return BNGetTypeAlignment(m_type);
+}
+
+
+bool Type::IsSigned() const
+{
+ return BNIsTypeSigned(m_type);
+}
+
+
+bool Type::IsConst() const
+{
+ return BNIsTypeConst(m_type);
+}
+
+
+bool Type::IsFloat() const
+{
+ return BNIsTypeFloatingPoint(m_type);
+}
+
+
+Ref<Type> Type::GetChildType() const
+{
+ BNType* type = BNGetChildType(m_type);
+ if (type)
+ return new Type(type);
+ return nullptr;
+}
+
+
+vector<NameAndType> Type::GetParameters() const
+{
+ size_t count;
+ BNNameAndType* types = BNGetTypeParameters(m_type, &count);
+
+ vector<NameAndType> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ NameAndType param;
+ param.name = types[i].name;
+ param.type = new Type(BNNewTypeReference(types[i].type));
+ result.push_back(param);
+ }
+
+ BNFreeTypeParameterList(types, count);
+ return result;
+}
+
+
+bool Type::HasVariableArguments() const
+{
+ return BNTypeHasVariableArguments(m_type);
+}
+
+
+Ref<Structure> Type::GetStructure() const
+{
+ BNStructure* s = BNGetTypeStructure(m_type);
+ if (s)
+ return new Structure(s);
+ return nullptr;
+}
+
+
+Ref<Enumeration> Type::GetEnumeration() const
+{
+ BNEnumeration* e = BNGetTypeEnumeration(m_type);
+ if (e)
+ return new Enumeration(e);
+ return nullptr;
+}
+
+
+uint64_t Type::GetElementCount() const
+{
+ return BNGetTypeElementCount(m_type);
+}
+
+
+string Type::GetString() const
+{
+ char* str = BNGetTypeString(m_type);
+ string result = str;
+ BNFreeString(str);
+ return result;
+}
+
+
+string Type::GetStringBeforeName() const
+{
+ char* str = BNGetTypeStringBeforeName(m_type);
+ string result = str;
+ BNFreeString(str);
+ return result;
+}
+
+
+string Type::GetStringAfterName() const
+{
+ char* str = BNGetTypeStringAfterName(m_type);
+ string result = str;
+ BNFreeString(str);
+ return result;
+}
+
+
+Ref<Type> Type::VoidType()
+{
+ return new Type(BNCreateVoidType());
+}
+
+
+Ref<Type> Type::BoolType()
+{
+ return new Type(BNCreateBoolType());
+}
+
+
+Ref<Type> Type::IntegerType(size_t width, bool sign)
+{
+ return new Type(BNCreateIntegerType(width, sign));
+}
+
+
+Ref<Type> Type::FloatType(size_t width)
+{
+ return new Type(BNCreateFloatType(width));
+}
+
+
+Ref<Type> Type::StructureType(Structure* strct)
+{
+ return new Type(BNCreateStructureType(strct->GetStructureObject()));
+}
+
+
+Ref<Type> Type::EnumerationType(Architecture* arch, Enumeration* enm, size_t width)
+{
+ return new Type(BNCreateEnumerationType(arch->GetArchitectureObject(), enm->GetEnumerationObject(), width));
+}
+
+
+Ref<Type> Type::PointerType(Architecture* arch, Type* type, bool cnst)
+{
+ return new Type(BNCreatePointerType(arch->GetArchitectureObject(), type->GetTypeObject(), cnst));
+}
+
+
+Ref<Type> Type::ArrayType(Type* type, uint64_t elem)
+{
+ return new Type(BNCreateArrayType(type->GetTypeObject(), elem));
+}
+
+
+Ref<Type> Type::FunctionType(Type* returnValue, const std::vector<NameAndType>& params, bool varArg)
+{
+ BNNameAndType* paramArray = new BNNameAndType[params.size()];
+ for (size_t i = 0; i < params.size(); i++)
+ {
+ paramArray[i].name = (char*)params[i].name.c_str();
+ paramArray[i].type = params[i].type->GetTypeObject();
+ }
+
+ Type* type = new Type(BNCreateFunctionType(returnValue->GetTypeObject(), paramArray, params.size(), varArg));
+ delete[] paramArray;
+ return type;
+}
+
+
+Structure::Structure(BNStructure* s): m_struct(s)
+{
+}
+
+
+Structure::~Structure()
+{
+ BNFreeStructure(m_struct);
+}
+
+
+string Structure::GetName() const
+{
+ char* name = BNGetStructureName(m_struct);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+void Structure::SetName(const string& name)
+{
+ BNSetStructureName(m_struct, name.c_str());
+}
+
+
+vector<StructureMember> Structure::GetMembers() const
+{
+ size_t count;
+ BNStructureMember* members = BNGetStructureMembers(m_struct, &count);
+
+ vector<StructureMember> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ StructureMember member;
+ member.type = new Type(BNNewTypeReference(members[i].type));
+ member.name = members[i].name;
+ member.offset = members[i].offset;
+ result.push_back(member);
+ }
+
+ BNFreeStructureMemberList(members, count);
+ return result;
+}
+
+
+uint64_t Structure::GetWidth() const
+{
+ return BNGetStructureWidth(m_struct);
+}
+
+
+size_t Structure::GetAlignment() const
+{
+ return BNGetStructureAlignment(m_struct);
+}
+
+
+bool Structure::IsPacked() const
+{
+ return BNIsStructurePacked(m_struct);
+}
+
+
+void Structure::SetPacked(bool packed)
+{
+ BNSetStructurePacked(m_struct, packed);
+}
+
+
+bool Structure::IsUnion() const
+{
+ return BNIsStructureUnion(m_struct);
+}
+
+
+void Structure::SetUnion(bool u)
+{
+ BNSetStructureUnion(m_struct, u);
+}
+
+
+void Structure::AddMember(Type* type, const string& name)
+{
+ BNAddStructureMember(m_struct, type->GetTypeObject(), name.c_str());
+}
+
+
+void Structure::AddMemberAtOffset(Type* type, const string& name, uint64_t offset)
+{
+ BNAddStructureMemberAtOffset(m_struct, type->GetTypeObject(), name.c_str(), offset);
+}
+
+
+void Structure::RemoveMember(size_t idx)
+{
+ BNRemoveStructureMember(m_struct, idx);
+}
+
+
+Enumeration::Enumeration(BNEnumeration* e): m_enum(e)
+{
+}
+
+
+Enumeration::~Enumeration()
+{
+ BNFreeEnumeration(m_enum);
+}
+
+
+string Enumeration::GetName() const
+{
+ char* name = BNGetEnumerationName(m_enum);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+void Enumeration::SetName(const string& name)
+{
+ BNSetEnumerationName(m_enum, name.c_str());
+}
+
+
+vector<EnumerationMember> Enumeration::GetMembers() const
+{
+ size_t count;
+ BNEnumerationMember* members = BNGetEnumerationMembers(m_enum, &count);
+
+ vector<EnumerationMember> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ EnumerationMember member;
+ member.name = members[i].name;
+ member.value = members[i].value;
+ member.isDefault = members[i].isDefault;
+ result.push_back(member);
+ }
+
+ BNFreeEnumerationMemberList(members, count);
+ return result;
+}
+
+
+void Enumeration::AddMember(const string& name)
+{
+ BNAddEnumerationMember(m_enum, name.c_str());
+}
+
+
+void Enumeration::AddMemberWithValue(const string& name, uint64_t value)
+{
+ BNAddEnumerationMemberWithValue(m_enum, name.c_str(), value);
+}