@@ -5795,32 +5795,102 @@ std::vector<Ref<ExternalLocation>> BinaryView::GetExternalLocations()
57955795
57965796Confidence<RegisterValue> BinaryView::GetGlobalPointerValue () const
57975797{
5798- BNRegisterValueWithConfidence value = BNGetGlobalPointerValue (m_object);
5799- return Confidence<RegisterValue>(RegisterValue::FromAPIObject (value.value ), value.confidence );
5798+ auto values = GetGlobalPointerValues ();
5799+ if (values.empty ())
5800+ return Confidence<RegisterValue>();
5801+ return values[0 ].second ;
5802+ }
5803+
5804+
5805+ static vector<pair<uint32_t , Confidence<RegisterValue>>> ConvertGlobalPointerValues (
5806+ BNRegisterValueWithConfidenceAndRegister* values, size_t count)
5807+ {
5808+ vector<pair<uint32_t , Confidence<RegisterValue>>> result;
5809+ result.reserve (count);
5810+ for (size_t i = 0 ; i < count; i++)
5811+ result.emplace_back (values[i].reg ,
5812+ Confidence<RegisterValue>(RegisterValue::FromAPIObject (values[i].value .value ), values[i].value .confidence ));
5813+ BNFreeRegisterValueWithConfidenceAndRegisterList (values);
5814+ return result;
5815+ }
5816+
5817+
5818+ vector<pair<uint32_t , Confidence<RegisterValue>>> BinaryView::GetGlobalPointerValues () const
5819+ {
5820+ size_t count;
5821+ BNRegisterValueWithConfidenceAndRegister* values = BNGetGlobalPointerValues (m_object, &count);
5822+ return ConvertGlobalPointerValues (values, count);
5823+ }
5824+
5825+
5826+ vector<pair<uint32_t , Confidence<RegisterValue>>> BinaryView::GetDefaultGlobalPointerValues () const
5827+ {
5828+ size_t count;
5829+ BNRegisterValueWithConfidenceAndRegister* values = BNGetDefaultGlobalPointerValues (m_object, &count);
5830+ return ConvertGlobalPointerValues (values, count);
5831+ }
5832+
5833+
5834+ vector<pair<uint32_t , Confidence<RegisterValue>>> BinaryView::GetUserGlobalPointerValues () const
5835+ {
5836+ size_t count;
5837+ BNRegisterValueWithConfidenceAndRegister* values = BNGetUserGlobalPointerValues (m_object, &count);
5838+ return ConvertGlobalPointerValues (values, count);
58005839}
58015840
58025841
58035842bool BinaryView::UserGlobalPointerValueSet () const
58045843{
5805- return BNUserGlobalPointerValueSet (m_object);
5844+ return UserGlobalPointerValuesSet ();
5845+ }
5846+
5847+
5848+ bool BinaryView::UserGlobalPointerValuesSet () const
5849+ {
5850+ return BNUserGlobalPointerValuesSet (m_object);
58065851}
58075852
58085853
58095854void BinaryView::ClearUserGlobalPointerValue ()
58105855{
5811- return BNClearUserGlobalPointerValue (m_object);
5856+ ClearUserGlobalPointerValues ();
5857+ }
5858+
5859+
5860+ void BinaryView::ClearUserGlobalPointerValues ()
5861+ {
5862+ return BNClearUserGlobalPointerValues (m_object);
58125863}
58135864
58145865
58155866void BinaryView::SetUserGlobalPointerValue (const Confidence<RegisterValue>& value)
58165867{
5817- BNRegisterValueWithConfidence v;
5818- v.confidence = value.GetConfidence ();
5819- v.value .value = value.GetValue ().value ;
5820- v.value .state = value.GetValue ().state ;
5821- v.value .size = value.GetValue ().size ;
5822- v.value .offset = value.GetValue ().offset ;
5823- BNSetUserGlobalPointerValue (m_object, v);
5868+ vector<pair<uint32_t , Confidence<RegisterValue>>> values;
5869+ for (auto & [reg, _] : GetGlobalPointerValues ())
5870+ if (reg != BN_INVALID_REGISTER )
5871+ values.emplace_back (reg, value);
5872+ if (values.empty ())
5873+ values.emplace_back (BN_INVALID_REGISTER , value);
5874+ SetUserGlobalPointerValues (values);
5875+ }
5876+
5877+
5878+ void BinaryView::SetUserGlobalPointerValues (const vector<pair<uint32_t , Confidence<RegisterValue>>>& values)
5879+ {
5880+ vector<BNRegisterValueWithConfidenceAndRegister> apiValues;
5881+ apiValues.reserve (values.size ());
5882+ for (auto & [reg, value] : values)
5883+ {
5884+ BNRegisterValueWithConfidenceAndRegister v;
5885+ v.reg = reg;
5886+ v.value .confidence = value.GetConfidence ();
5887+ v.value .value .value = value.GetValue ().value ;
5888+ v.value .value .state = value.GetValue ().state ;
5889+ v.value .value .size = value.GetValue ().size ;
5890+ v.value .value .offset = value.GetValue ().offset ;
5891+ apiValues.push_back (v);
5892+ }
5893+ BNSetUserGlobalPointerValues (m_object, apiValues.data (), apiValues.size ());
58245894}
58255895
58265896
0 commit comments