diff options
| author | Brandon Miller <brandon@vector35.com> | 2025-02-03 16:33:46 -0500 |
|---|---|---|
| committer | Brandon Miller <brandon@vector35.com> | 2025-02-04 08:56:37 -0500 |
| commit | ed08160e6782b3f8b371370bfad3a04e80e94f4d (patch) | |
| tree | cc73ad9a24301aed63b51b28a90a44cc4ac2550b /firmwareninja.cpp | |
| parent | 60ae03fed8aee9bc88c6d04023bcd3c922ec273e (diff) | |
Firmware Ninja relationships API
Diffstat (limited to 'firmwareninja.cpp')
| -rw-r--r-- | firmwareninja.cpp | 300 |
1 files changed, 289 insertions, 11 deletions
diff --git a/firmwareninja.cpp b/firmwareninja.cpp index 8e13fccd..9fd53930 100644 --- a/firmwareninja.cpp +++ b/firmwareninja.cpp @@ -58,6 +58,248 @@ static void FreeMemoryInfoArray(BNFirmwareNinjaFunctionMemoryAccesses** fma, siz } +FirmwareNinjaRelationship::FirmwareNinjaRelationship(Ref<BinaryView> view, BNFirmwareNinjaRelationship* handle) +{ + if (handle) + m_object = handle; + else + m_object = BNNewFirmwareNinjaRelationshipReference(BNCreateFirmwareNinjaRelationship(view->GetObject())); +} + + +FirmwareNinjaRelationship::~FirmwareNinjaRelationship() +{ + BNFreeFirmwareNinjaRelationship(m_object); +} + + +void FirmwareNinjaRelationship::SetPrimaryAddress(uint64_t address) +{ + BNFirmwareNinjaRelationshipSetPrimaryAddress(m_object, address); +} + + +void FirmwareNinjaRelationship::SetPrimaryDataVariable(DataVariable& variable) +{ + BNFirmwareNinjaRelationshipSetPrimaryDataVariable(m_object, variable.address); +} + + +void FirmwareNinjaRelationship::SetPrimaryFunction(Ref<Function> function) +{ + BNFirmwareNinjaRelationshipSetPrimaryFunction(m_object, function->GetObject()); +} + + +bool FirmwareNinjaRelationship::PrimaryIsAddress() const +{ + return BNFirmwareNinjaRelationshipPrimaryIsAddress(m_object); +} + + +bool FirmwareNinjaRelationship::PrimaryIsDataVariable() const +{ + return BNFirmwareNinjaRelationshipPrimaryIsDataVariable(m_object); +} + + +bool FirmwareNinjaRelationship::PrimaryIsFunction() const +{ + return BNFirmwareNinjaRelationshipPrimaryIsFunction(m_object); +} + + +bool FirmwareNinjaRelationship::GetPrimaryDataVariable(DataVariable& variable) +{ + BNDataVariable bnVariable; + if (!BNFirmwareNinjaRelationshipGetPrimaryDataVariable(m_object, &bnVariable)) + return false; + + variable.address = bnVariable.address; + variable.type = Confidence(new Type(BNNewTypeReference(bnVariable.type)), bnVariable.typeConfidence); + variable.autoDiscovered = bnVariable.autoDiscovered; + BNFreeDataVariable(&bnVariable); + return true; +} + + +std::optional<uint64_t> FirmwareNinjaRelationship::GetPrimaryAddress() const +{ + std::optional<uint64_t> result; + uint64_t tmp; + if (BNFirmwareNinjaRelationshipGetPrimaryAddress(m_object, &tmp)) + result = tmp; + + return result; +} + + +Ref<Function> FirmwareNinjaRelationship::GetPrimaryFunction() const +{ + auto bnFunction = BNFirmwareNinjaRelationshipGetPrimaryFunction(m_object); + if (!bnFunction) + return nullptr; + + return new Function(BNNewFunctionReference(bnFunction)); +} + + +void FirmwareNinjaRelationship::SetSecondaryAddress(uint64_t address) +{ + BNFirmwareNinjaRelationshipSetSecondaryAddress(m_object, address); +} + + +void FirmwareNinjaRelationship::SetSecondaryDataVariable(DataVariable& variable) +{ + BNFirmwareNinjaRelationshipSetSecondaryDataVariable(m_object, variable.address); +} + + +void FirmwareNinjaRelationship::SetSecondaryFunction(Ref<Function> function) +{ + BNFirmwareNinjaRelationshipSetSecondaryFunction(m_object, function->GetObject()); +} + + +void FirmwareNinjaRelationship::SetSecondaryExternalAddress(Ref<ProjectFile> projectFile, uint64_t address) +{ + BNFirmwareNinjaRelationshipSetSecondaryExternalAddress(m_object, projectFile->GetObject(), address); +} + + +void FirmwareNinjaRelationship::SetSecondaryExternalSymbol(Ref<ProjectFile> projectFile, const std::string& symbol) +{ + BNFirmwareNinjaRelationshipSetSecondaryExternalSymbol(m_object, projectFile->GetObject(), symbol.c_str()); +} + + +bool FirmwareNinjaRelationship::SecondaryIsAddress() const +{ + return BNFirmwareNinjaRelationshipSecondaryIsAddress(m_object); +} + + +bool FirmwareNinjaRelationship::SecondaryIsDataVariable() const +{ + return BNFirmwareNinjaRelationshipSecondaryIsDataVariable(m_object); +} + + +bool FirmwareNinjaRelationship::SecondaryIsFunction() const +{ + return BNFirmwareNinjaRelationshipSecondaryIsFunction(m_object); +} + + +bool FirmwareNinjaRelationship::SecondaryIsExternalAddress() const +{ + return BNFirmwareNinjaRelationshipSecondaryIsExternalAddress(m_object); +} + + +bool FirmwareNinjaRelationship::SecondaryIsExternalSymbol() const +{ + return BNFirmwareNinjaRelationshipSecondaryIsExternalSymbol(m_object); +} + + +Ref<ProjectFile> FirmwareNinjaRelationship::GetSecondaryExternalProjectFile() const +{ + auto bnProjectFile = BNFirmwareNinjaRelationshipGetSecondaryExternalProjectFile(m_object); + if (!bnProjectFile) + return nullptr; + + return new ProjectFile(BNNewProjectFileReference(bnProjectFile)); +} + + +std::optional<uint64_t> FirmwareNinjaRelationship::GetSecondaryAddress() const +{ + std::optional<uint64_t> result; + uint64_t tmp; + if (BNFirmwareNinjaRelationshipGetSecondaryAddress(m_object, &tmp)) + result = tmp; + + return result; +} + + +bool FirmwareNinjaRelationship::GetSecondaryDataVariable(DataVariable& variable) +{ + BNDataVariable bnVariable; + if (!BNFirmwareNinjaRelationshipGetSecondaryDataVariable(m_object, &bnVariable)) + return false; + + variable.address = bnVariable.address; + variable.type = Confidence(new Type(BNNewTypeReference(bnVariable.type)), bnVariable.typeConfidence); + variable.autoDiscovered = bnVariable.autoDiscovered; + BNFreeDataVariable(&bnVariable); + return true; +} + + +Ref<Function> FirmwareNinjaRelationship::GetSecondaryFunction() const +{ + auto bnFunction = BNFirmwareNinjaRelationshipGetSecondaryFunction(m_object); + if (!bnFunction) + return nullptr; + + return new Function(BNNewFunctionReference(bnFunction)); +} + + +std::string FirmwareNinjaRelationship::GetSecondaryExternalSymbol() const +{ + std::string result = ""; + auto bnSymbol = BNFirmwareNinjaRelationshipGetSecondaryExternalSymbol(m_object); + if (bnSymbol) + result = std::string(bnSymbol); + + return result; +} + + +void FirmwareNinjaRelationship::SetDescription(const std::string& description) +{ + BNFirmwareNinjaRelationshipSetDescription(m_object, description.c_str()); +} + + +std::string FirmwareNinjaRelationship::GetDescription() const +{ + std::string result = ""; + auto bnDescription = BNFirmwareNinjaRelationshipGetDescription(m_object); + if (bnDescription) + result = std::string(bnDescription); + + return result; +} + + +void FirmwareNinjaRelationship::SetProvenance(const std::string& provenance) +{ + BNFirmwareNinjaRelationshipSetProvenance(m_object, provenance.c_str()); +} + + +std::string FirmwareNinjaRelationship::GetProvenance() const +{ + std::string result = ""; + auto bnProvenance = BNFirmwareNinjaRelationshipGetProvenance(m_object); + if (bnProvenance) + result = std::string(bnProvenance); + + return result; +} + + +std::string FirmwareNinjaRelationship::GetGuid() const +{ + return BNFirmwareNinjaRelationshipGetGuid(m_object); +} + + FirmwareNinjaReferenceNode::FirmwareNinjaReferenceNode(BNFirmwareNinjaReferenceNode* node) { m_object = node; @@ -101,14 +343,14 @@ bool FirmwareNinjaReferenceNode::GetFunction(Ref<Function>& function) bool FirmwareNinjaReferenceNode::GetDataVariable(DataVariable& variable) { - auto bnVariable = BNFirmwareNinjaReferenceNodeGetDataVariable(m_object); - if (!bnVariable) + BNDataVariable bnVariable; + if (!BNFirmwareNinjaReferenceNodeGetDataVariable(m_object, &bnVariable)) return false; - variable.address = bnVariable->address; - variable.type = Confidence(new Type(BNNewTypeReference(bnVariable->type)), bnVariable->typeConfidence); - variable.autoDiscovered = bnVariable->autoDiscovered; - BNFreeDataVariable(bnVariable); + variable.address = bnVariable.address; + variable.type = Confidence(new Type(BNNewTypeReference(bnVariable.type)), bnVariable.typeConfidence); + variable.autoDiscovered = bnVariable.autoDiscovered; + BNFreeDataVariable(&bnVariable); return true; } @@ -125,8 +367,6 @@ std::vector<Ref<FirmwareNinjaReferenceNode>> FirmwareNinjaReferenceNode::GetChil BNNewFirmwareNinjaReferenceNodeReference(bnChildren[i]))); } - if (count) - BNFreeFirmwareNinjaReferenceNodes(bnChildren, count); return result; } @@ -383,7 +623,7 @@ Ref<FirmwareNinjaReferenceNode> FirmwareNinja::GetReferenceTree( if (!bnReferenceTree) return nullptr; - return new FirmwareNinjaReferenceNode(bnReferenceTree); + return new FirmwareNinjaReferenceNode(BNNewFirmwareNinjaReferenceNodeReference(bnReferenceTree)); } @@ -401,7 +641,7 @@ Ref<FirmwareNinjaReferenceNode> FirmwareNinja::GetReferenceTree( if (!bnReferenceTree) return nullptr; - return new FirmwareNinjaReferenceNode(bnReferenceTree); + return new FirmwareNinjaReferenceNode(BNNewFirmwareNinjaReferenceNodeReference(bnReferenceTree)); } @@ -418,5 +658,43 @@ Ref<FirmwareNinjaReferenceNode> FirmwareNinja::GetReferenceTree( if (!bnReferenceTree) return nullptr; - return new FirmwareNinjaReferenceNode(bnReferenceTree); + return new FirmwareNinjaReferenceNode(BNNewFirmwareNinjaReferenceNodeReference(bnReferenceTree)); +} + + +std::vector<Ref<FirmwareNinjaRelationship>> FirmwareNinja::QueryRelationships() +{ + std::vector<Ref<FirmwareNinjaRelationship>> result; + size_t count = 0; + auto bnRelationships = BNFirmwareNinjaQueryRelationships(m_object, &count); + result.reserve(count); + for (size_t i = 0; i < count; ++i) + { + result.push_back(new FirmwareNinjaRelationship(m_view, + BNNewFirmwareNinjaRelationshipReference(bnRelationships[i]))); + } + + return result; +} + + +void FirmwareNinja::AddRelationship(Ref<FirmwareNinjaRelationship> relationship) +{ + BNFirmwareNinjaAddRelationship(m_object, relationship->GetObject()); +} + + +Ref<FirmwareNinjaRelationship> FirmwareNinja::GetRelationshipByGuid(const std::string& guid) +{ + auto bnRelationship = BNFirmwareNinjaGetRelationshipByGuid(m_object, guid.c_str()); + if (!bnRelationship) + return nullptr; + + return new FirmwareNinjaRelationship(m_view, BNNewFirmwareNinjaRelationshipReference(bnRelationship)); +} + + +void FirmwareNinja::RemoveRelationshipByGuid(const std::string& guid) +{ + BNFirmwareNinjaRemoveRelationshipByGuid(m_object, guid.c_str()); } |
