diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-07-28 01:09:04 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-07-28 01:09:04 -0400 |
| commit | 3fc101f475a763a09d779f119dcbec3185a472a0 (patch) | |
| tree | 8705deb4f6745a7a29571a51df4c19691204c24b /type.cpp | |
| parent | 37bc7f679b870b169726e746b75e573db1f3e268 (diff) | |
Initial implementation of type info
Diffstat (limited to 'type.cpp')
| -rw-r--r-- | type.cpp | 357 |
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); +} |
