summaryrefslogtreecommitdiff
path: root/workflow.cpp
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-11-23 16:18:34 -0500
committerBrian Potchik <brian@vector35.com>2025-11-23 16:18:34 -0500
commit56ce6d3d63d6a5cf30ea1f326a91104db59555be (patch)
tree175fd417c6084a40823fb7aa5d38ffd7e7406308 /workflow.cpp
parent5880769cbac1362aad46a34faec4c553fa9fcac6 (diff)
Unify SettingsCache and MemoryMap access under immutable snapshots for consistent, lock-free AnalysisContext queries.
Diffstat (limited to 'workflow.cpp')
-rw-r--r--workflow.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/workflow.cpp b/workflow.cpp
index 3b0366db..d4981c1a 100644
--- a/workflow.cpp
+++ b/workflow.cpp
@@ -152,6 +152,160 @@ bool AnalysisContext::Inform(const string& request)
}
+// Template specializations for GetSetting<T>
+template<>
+bool AnalysisContext::GetSetting<bool>(const string& key)
+{
+ return BNAnalysisContextGetSettingBool(m_object, key.c_str());
+}
+
+
+template<>
+double AnalysisContext::GetSetting<double>(const string& key)
+{
+ return BNAnalysisContextGetSettingDouble(m_object, key.c_str());
+}
+
+
+template<>
+int64_t AnalysisContext::GetSetting<int64_t>(const string& key)
+{
+ return BNAnalysisContextGetSettingInt64(m_object, key.c_str());
+}
+
+
+template<>
+uint64_t AnalysisContext::GetSetting<uint64_t>(const string& key)
+{
+ return BNAnalysisContextGetSettingUInt64(m_object, key.c_str());
+}
+
+
+template<>
+string AnalysisContext::GetSetting<string>(const string& key)
+{
+ char* str = BNAnalysisContextGetSettingString(m_object, key.c_str());
+ string result = str;
+ BNFreeString(str);
+ return result;
+}
+
+
+template<>
+vector<string> AnalysisContext::GetSetting<vector<string>>(const string& key)
+{
+ size_t count = 0;
+ char** list = BNAnalysisContextGetSettingStringList(m_object, key.c_str(), &count);
+ vector<string> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.push_back(list[i]);
+ BNFreeStringList(list, count);
+ return result;
+}
+
+
+bool AnalysisContext::IsValidOffset(uint64_t offset)
+{
+ return BNAnalysisContextIsValidOffset(m_object, offset);
+}
+
+
+bool AnalysisContext::IsOffsetReadable(uint64_t offset)
+{
+ return BNAnalysisContextIsOffsetReadable(m_object, offset);
+}
+
+
+bool AnalysisContext::IsOffsetWritable(uint64_t offset)
+{
+ return BNAnalysisContextIsOffsetWritable(m_object, offset);
+}
+
+
+bool AnalysisContext::IsOffsetExecutable(uint64_t offset)
+{
+ return BNAnalysisContextIsOffsetExecutable(m_object, offset);
+}
+
+
+bool AnalysisContext::IsOffsetBackedByFile(uint64_t offset)
+{
+ return BNAnalysisContextIsOffsetBackedByFile(m_object, offset);
+}
+
+
+uint64_t AnalysisContext::GetStart()
+{
+ return BNAnalysisContextGetStart(m_object);
+}
+
+
+uint64_t AnalysisContext::GetEnd()
+{
+ return BNAnalysisContextGetEnd(m_object);
+}
+
+
+uint64_t AnalysisContext::GetLength()
+{
+ return BNAnalysisContextGetLength(m_object);
+}
+
+
+uint64_t AnalysisContext::GetNextValidOffset(uint64_t offset)
+{
+ return BNAnalysisContextGetNextValidOffset(m_object, offset);
+}
+
+
+uint64_t AnalysisContext::GetNextMappedAddress(uint64_t addr, uint32_t flags)
+{
+ return BNAnalysisContextGetNextMappedAddress(m_object, addr, flags);
+}
+
+
+uint64_t AnalysisContext::GetNextBackedAddress(uint64_t addr, uint32_t flags)
+{
+ return BNAnalysisContextGetNextBackedAddress(m_object, addr, flags);
+}
+
+
+Ref<Segment> AnalysisContext::GetSegmentAt(uint64_t addr)
+{
+ BNSegment* segment = BNAnalysisContextGetSegmentAt(m_object, addr);
+ if (!segment)
+ return nullptr;
+ return new Segment(segment);
+}
+
+
+vector<BNAddressRange> AnalysisContext::GetMappedAddressRanges()
+{
+ size_t count = 0;
+ BNAddressRange* ranges = BNAnalysisContextGetMappedAddressRanges(m_object, &count);
+ vector<BNAddressRange> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.push_back(ranges[i]);
+ BNFreeAddressRanges(ranges);
+ return result;
+}
+
+
+vector<BNAddressRange> AnalysisContext::GetBackedAddressRanges()
+{
+ size_t count = 0;
+ BNAddressRange* ranges = BNAnalysisContextGetBackedAddressRanges(m_object, &count);
+ vector<BNAddressRange> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.push_back(ranges[i]);
+ BNFreeAddressRanges(ranges);
+ return result;
+}
+
+
bool WorkflowMachine::PostRequest(const std::string& command)
{
rapidjson::Document request(rapidjson::kObjectType);