summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorChinmay <chinmay1dd@gmail.com>2020-08-12 01:20:22 -0700
committerChinmay Deshpande <chinmay1dd@gmail.com>2020-08-13 19:31:20 -0700
commit139c90f93cb10317339fce1ad81ac61425498099 (patch)
tree25e90b6cfdc91580eba6017b55b5046bf1faae33 /function.cpp
parent153e9543984751449e64048a5acceff9524221ce (diff)
Update function names and change up API
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp40
1 files changed, 34 insertions, 6 deletions
diff --git a/function.cpp b/function.cpp
index 9dc9ea21..ecb81a67 100644
--- a/function.cpp
+++ b/function.cpp
@@ -1771,7 +1771,7 @@ Ref<FlowGraph> Function::GetUnresolvedStackAdjustmentGraph()
}
-void Function::SetVariableValue(const Variable& var, uint64_t defAddr, PossibleValueSet& value)
+void Function::SetUserVariableValue(const Variable& var, uint64_t defAddr, PossibleValueSet& value)
{
auto mlil = GetMediumLevelIL();
auto varDefs = mlil->GetVariableDefinitions(var);
@@ -1804,11 +1804,11 @@ void Function::SetVariableValue(const Variable& var, uint64_t defAddr, PossibleV
auto valueObj = value.ToAPIObject();
- BNSetVariableValue(m_object, &var_data, &defSite, &valueObj);
+ BNSetUserVariableValue(m_object, &var_data, &defSite, &valueObj);
}
-void Function::ClearInformedVariableValue(const Variable& var, uint64_t defAddr)
+void Function::ClearUserVariableValue(const Variable& var, uint64_t defAddr)
{
auto mlil = GetMediumLevelIL();
auto varDefs = mlil->GetVariableDefinitions(var);
@@ -1838,13 +1838,41 @@ void Function::ClearInformedVariableValue(const Variable& var, uint64_t defAddr)
var_data.index = var.index;
var_data.storage = var.storage;
- BNClearInformedVariableValue(m_object, &var_data, &defSite);
+ BNClearUserVariableValue(m_object, &var_data, &defSite);
}
-void Function::ClearInformedVariableValues()
+map<Variable, map<ArchAndAddr, PossibleValueSet>> Function::GetAllUserVariableValues()
{
- BNClearInformedVariableValues(m_object);
+ size_t count;
+ map<Variable, map<ArchAndAddr, PossibleValueSet>> result;
+ BNUserVariableValue* var_values = BNGetAllUserVariableValues(m_object, &count);
+
+ for (size_t i = 0; i < count; i++)
+ {
+ Variable var(var_values[i].var);
+ Architecture* arch = new CoreArchitecture(var_values[i].defSite.arch);
+ uint64_t address = var_values[i].defSite.address;
+ ArchAndAddr defSite(arch, address);
+ PossibleValueSet value = PossibleValueSet::FromAPIObject(var_values[i].value);
+ result[var][defSite] = value;
+ }
+
+ BNFreeUserVariableValues(var_values);
+ return result;
+}
+
+
+void Function::ClearAllUserVariableValues()
+{
+ const map<Variable, map<ArchAndAddr, PossibleValueSet>>& allValues = GetAllUserVariableValues();
+ for (auto& valuePair : allValues)
+ {
+ for (auto& valMap : valuePair.second)
+ {
+ ClearUserVariableValue(valuePair.first, valMap.first.address);
+ }
+ }
}