From 5953d087a9a104e7abb63c5739091214edf2faca Mon Sep 17 00:00:00 2001 From: Brandon Miller Date: Tue, 2 Jun 2026 09:00:15 -0400 Subject: Add support for multiple global pointer registers --- binaryview.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 11 deletions(-) (limited to 'binaryview.cpp') diff --git a/binaryview.cpp b/binaryview.cpp index da6f5b0f..36761bff 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -5795,32 +5795,102 @@ std::vector> BinaryView::GetExternalLocations() Confidence BinaryView::GetGlobalPointerValue() const { - BNRegisterValueWithConfidence value = BNGetGlobalPointerValue(m_object); - return Confidence(RegisterValue::FromAPIObject(value.value), value.confidence); + auto values = GetGlobalPointerValues(); + if (values.empty()) + return Confidence(); + return values[0].second; +} + + +static vector>> ConvertGlobalPointerValues( + BNRegisterValueWithConfidenceAndRegister* values, size_t count) +{ + vector>> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.emplace_back(values[i].reg, + Confidence(RegisterValue::FromAPIObject(values[i].value.value), values[i].value.confidence)); + BNFreeRegisterValueWithConfidenceAndRegisterList(values); + return result; +} + + +vector>> BinaryView::GetGlobalPointerValues() const +{ + size_t count; + BNRegisterValueWithConfidenceAndRegister* values = BNGetGlobalPointerValues(m_object, &count); + return ConvertGlobalPointerValues(values, count); +} + + +vector>> BinaryView::GetDefaultGlobalPointerValues() const +{ + size_t count; + BNRegisterValueWithConfidenceAndRegister* values = BNGetDefaultGlobalPointerValues(m_object, &count); + return ConvertGlobalPointerValues(values, count); +} + + +vector>> 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& 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>> 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>>& values) +{ + vector 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()); } -- cgit v1.3.1