diff options
Diffstat (limited to 'function.cpp')
| -rw-r--r-- | function.cpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/function.cpp b/function.cpp index 50799191..b671f283 100644 --- a/function.cpp +++ b/function.cpp @@ -289,6 +289,34 @@ void Function::RemoveUserCodeReference(Architecture* fromArch, uint64_t fromAddr } +void Function::AddUserTypeReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name) +{ + BNQualifiedName nameObj = name.GetAPIObject(); + BNAddUserTypeReference(m_object, fromArch->GetObject(), fromAddr, &nameObj); +} + + +void Function::RemoveUserTypeReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name) +{ + BNQualifiedName nameObj = name.GetAPIObject(); + BNRemoveUserTypeReference(m_object, fromArch->GetObject(), fromAddr, &nameObj); +} + + +void Function::AddUserTypeFieldReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name, uint64_t offset) +{ + BNQualifiedName nameObj = name.GetAPIObject(); + BNAddUserTypeFieldReference(m_object, fromArch->GetObject(), fromAddr, &nameObj, offset); +} + + +void Function::RemoveUserTypeFieldReference(Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name, uint64_t offset) +{ + BNQualifiedName nameObj = name.GetAPIObject(); + BNRemoveUserTypeFieldReference(m_object, fromArch->GetObject(), fromAddr, &nameObj, offset); +} + + Ref<LowLevelILFunction> Function::GetLowLevelIL() const { return new LowLevelILFunction(BNGetFunctionLowLevelIL(m_object)); @@ -1971,6 +1999,176 @@ void Function::SetVariableDeadStoreElimination(const Variable& var, BNDeadStoreE } +vector<ILReferenceSource> Function::GetMediumLevelILVariableReferences(const Variable& var) +{ + size_t count; + + BNVariable varData; + varData.type = var.type; + varData.index = var.index; + varData.storage = var.storage; + + BNILReferenceSource* refs = BNGetMediumLevelILVariableReferences(m_object, &varData, &count); + + vector<ILReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ILReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + src.type = refs[i].type; + src.exprId = refs[i].exprId; + result.push_back(src); + } + + BNFreeILReferences(refs, count); + return result; +} + + +vector<VariableReferenceSource> Function::GetMediumLevelILVariableReferencesFrom(Architecture* arch, uint64_t addr) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetMediumLevelILVariableReferencesFrom(m_object, arch->GetObject(), addr, &count); + + vector<VariableReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + +vector<VariableReferenceSource> Function::GetMediumLevelILVariableReferencesInRange(Architecture* arch, uint64_t addr, uint64_t len) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetMediumLevelILVariableReferencesInRange(m_object, arch->GetObject(), addr, len, &count); + + vector<VariableReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + +vector<ILReferenceSource> Function::GetHighLevelILVariableReferences(const Variable& var) +{ + size_t count; + + BNVariable varData; + varData.type = var.type; + varData.index = var.index; + varData.storage = var.storage; + + BNILReferenceSource* refs = BNGetHighLevelILVariableReferences(m_object, &varData, &count); + + vector<ILReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ILReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + src.type = refs[i].type; + src.exprId = refs[i].exprId; + result.push_back(src); + } + + BNFreeILReferences(refs, count); + return result; +} + + +vector<VariableReferenceSource> Function::GetHighLevelILVariableReferencesFrom(Architecture* arch, uint64_t addr) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetHighLevelILVariableReferencesFrom(m_object, arch->GetObject(), addr, &count); + + vector<VariableReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + +vector<VariableReferenceSource> Function::GetHighLevelILVariableReferencesInRange(Architecture* arch, uint64_t addr, uint64_t len) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetHighLevelILVariableReferencesInRange(m_object, arch->GetObject(), addr, len, &count); + + vector<VariableReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + AdvancedFunctionAnalysisDataRequestor::AdvancedFunctionAnalysisDataRequestor(Function* func): m_func(func) { if (m_func) |
