diff options
| author | Brandon Miller <brandon@vector35.com> | 2026-06-02 09:00:15 -0400 |
|---|---|---|
| committer | Brandon Miller <brandon@vector35.com> | 2026-06-02 09:00:15 -0400 |
| commit | 5953d087a9a104e7abb63c5739091214edf2faca (patch) | |
| tree | abd95a2698f32b8e1f6ae7feaa9647cff8d218ae /binaryview.cpp | |
| parent | 68215ea14cfbaa4966f830d85d98f7f49b416455 (diff) | |
Add support for multiple global pointer registers
Diffstat (limited to 'binaryview.cpp')
| -rw-r--r-- | binaryview.cpp | 92 |
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()); } |
