summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2026-06-02 09:00:15 -0400
committerBrandon Miller <brandon@vector35.com>2026-06-02 09:00:15 -0400
commit5953d087a9a104e7abb63c5739091214edf2faca (patch)
treeabd95a2698f32b8e1f6ae7feaa9647cff8d218ae /binaryview.cpp
parent68215ea14cfbaa4966f830d85d98f7f49b416455 (diff)
Add support for multiple global pointer registers
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp92
1 files changed, 81 insertions, 11 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
index da6f5b0f..36761bff 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -5795,32 +5795,102 @@ std::vector<Ref<ExternalLocation>> BinaryView::GetExternalLocations()
Confidence<RegisterValue> BinaryView::GetGlobalPointerValue() const
{
- BNRegisterValueWithConfidence value = BNGetGlobalPointerValue(m_object);
- return Confidence<RegisterValue>(RegisterValue::FromAPIObject(value.value), value.confidence);
+ auto values = GetGlobalPointerValues();
+ if (values.empty())
+ return Confidence<RegisterValue>();
+ return values[0].second;
+}
+
+
+static vector<pair<uint32_t, Confidence<RegisterValue>>> ConvertGlobalPointerValues(
+ BNRegisterValueWithConfidenceAndRegister* values, size_t count)
+{
+ vector<pair<uint32_t, Confidence<RegisterValue>>> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.emplace_back(values[i].reg,
+ Confidence<RegisterValue>(RegisterValue::FromAPIObject(values[i].value.value), values[i].value.confidence));
+ BNFreeRegisterValueWithConfidenceAndRegisterList(values);
+ return result;
+}
+
+
+vector<pair<uint32_t, Confidence<RegisterValue>>> BinaryView::GetGlobalPointerValues() const
+{
+ size_t count;
+ BNRegisterValueWithConfidenceAndRegister* values = BNGetGlobalPointerValues(m_object, &count);
+ return ConvertGlobalPointerValues(values, count);
+}
+
+
+vector<pair<uint32_t, Confidence<RegisterValue>>> BinaryView::GetDefaultGlobalPointerValues() const
+{
+ size_t count;
+ BNRegisterValueWithConfidenceAndRegister* values = BNGetDefaultGlobalPointerValues(m_object, &count);
+ return ConvertGlobalPointerValues(values, count);
+}
+
+
+vector<pair<uint32_t, Confidence<RegisterValue>>> BinaryView::GetUserGlobalPointerValues() const
+{
+ size_t count;
+ BNRegisterValueWithConfidenceAndRegister* values = BNGetUserGlobalPointerValues(m_object, &count);
+ return ConvertGlobalPointerValues(values, count);
}
bool BinaryView::UserGlobalPointerValueSet() const
{
- return BNUserGlobalPointerValueSet(m_object);
+ return UserGlobalPointerValuesSet();
+}
+
+
+bool BinaryView::UserGlobalPointerValuesSet() const
+{
+ return BNUserGlobalPointerValuesSet(m_object);
}
void BinaryView::ClearUserGlobalPointerValue()
{
- return BNClearUserGlobalPointerValue(m_object);
+ ClearUserGlobalPointerValues();
+}
+
+
+void BinaryView::ClearUserGlobalPointerValues()
+{
+ return BNClearUserGlobalPointerValues(m_object);
}
void BinaryView::SetUserGlobalPointerValue(const Confidence<RegisterValue>& value)
{
- BNRegisterValueWithConfidence v;
- v.confidence = value.GetConfidence();
- v.value.value = value.GetValue().value;
- v.value.state = value.GetValue().state;
- v.value.size = value.GetValue().size;
- v.value.offset = value.GetValue().offset;
- BNSetUserGlobalPointerValue(m_object, v);
+ vector<pair<uint32_t, Confidence<RegisterValue>>> values;
+ for (auto& [reg, _] : GetGlobalPointerValues())
+ if (reg != BN_INVALID_REGISTER)
+ values.emplace_back(reg, value);
+ if (values.empty())
+ values.emplace_back(BN_INVALID_REGISTER, value);
+ SetUserGlobalPointerValues(values);
+}
+
+
+void BinaryView::SetUserGlobalPointerValues(const vector<pair<uint32_t, Confidence<RegisterValue>>>& values)
+{
+ vector<BNRegisterValueWithConfidenceAndRegister> apiValues;
+ apiValues.reserve(values.size());
+ for (auto& [reg, value] : values)
+ {
+ BNRegisterValueWithConfidenceAndRegister v;
+ v.reg = reg;
+ v.value.confidence = value.GetConfidence();
+ v.value.value.value = value.GetValue().value;
+ v.value.value.state = value.GetValue().state;
+ v.value.value.size = value.GetValue().size;
+ v.value.value.offset = value.GetValue().offset;
+ apiValues.push_back(v);
+ }
+ BNSetUserGlobalPointerValues(m_object, apiValues.data(), apiValues.size());
}