From d8e3001e535fad178c621ff07418f81f25123dc4 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 22 Aug 2024 12:55:49 -0600 Subject: Allow multiple high level representations for display, add Pseudo Rust and a Pseudo Python example plugin --- type.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'type.cpp') diff --git a/type.cpp b/type.cpp index 45e20463..94319367 100644 --- a/type.cpp +++ b/type.cpp @@ -1116,6 +1116,19 @@ BNIntegerDisplayType Type::GetIntegerTypeDisplayType() const return BNGetIntegerTypeDisplayType(m_object); } + +BNNameType Type::GetNameType() const +{ + return BNTypeGetNameType(m_object); +} + + +bool Type::ShouldDisplayReturnType() const +{ + return BNTypeShouldDisplayReturnType(m_object); +} + + string Type::GenerateAutoTypeId(const string& source, const QualifiedName& name) { BNQualifiedName nameObj = name.GetAPIObject(); @@ -1215,6 +1228,15 @@ Ref Type::GetRegisteredName() const } +string Type::GetAlternateName() const +{ + char* name = BNGetTypeAlternateName(m_object); + string result = name; + BNFreeString(name); + return result; +} + + Ref Type::WithReplacedStructure(Structure* from, Structure* to) { BNType* result = BNTypeWithReplacedStructure(m_object, from->GetObject(), to->GetObject()); @@ -2544,6 +2566,40 @@ Ref Structure::WithReplacedNamedTypeReference(NamedTypeReference* fro } +struct ResolveMemberCallbackInfo +{ + const std::function* callback; +}; + + +static void ResolveMemberCallback(void* ctxt, BNNamedTypeReference* baseName, BNStructure* resolvedStruct, + size_t memberIndex, uint64_t structOffset, uint64_t adjustedOffset, BNStructureMember member) +{ + ResolveMemberCallbackInfo* resolveFunc = (ResolveMemberCallbackInfo*)ctxt; + Ref baseNameRef = baseName ? new NamedTypeReference(BNNewNamedTypeReference(baseName)) : nullptr; + Ref resolvedStructRef = resolvedStruct ? new Structure(BNNewStructureReference(resolvedStruct)) : nullptr; + StructureMember apiMember; + apiMember.type = Confidence>(new Type(BNNewTypeReference(member.type)), member.typeConfidence); + apiMember.name = member.name; + apiMember.offset = member.offset; + apiMember.access = member.access; + apiMember.scope = member.scope; + (*resolveFunc->callback)(baseNameRef, resolvedStructRef, memberIndex, structOffset, adjustedOffset, apiMember); +} + + +bool Structure::ResolveMemberOrBaseMember(BinaryView* data, uint64_t offset, size_t size, + const std::function& resolveFunc, + std::optional memberIndexHint) +{ + ResolveMemberCallbackInfo callbackInfo = { &resolveFunc }; + return BNResolveStructureMemberOrBaseMember(m_object, data ? data->GetObject() : nullptr, offset, size, + &callbackInfo, ResolveMemberCallback, memberIndexHint.has_value(), memberIndexHint.value_or(0)); +} + + StructureBuilder::StructureBuilder() { m_object = BNCreateStructureBuilder(); -- cgit v1.3.1