diff options
| author | Brian Potchik <brian@vector35.com> | 2025-11-23 16:18:34 -0500 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2025-11-23 16:18:34 -0500 |
| commit | 56ce6d3d63d6a5cf30ea1f326a91104db59555be (patch) | |
| tree | 175fd417c6084a40823fb7aa5d38ffd7e7406308 /workflow.cpp | |
| parent | 5880769cbac1362aad46a34faec4c553fa9fcac6 (diff) | |
Unify SettingsCache and MemoryMap access under immutable snapshots for consistent, lock-free AnalysisContext queries.
Diffstat (limited to 'workflow.cpp')
| -rw-r--r-- | workflow.cpp | 154 |
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); |
