diff options
| author | Brian Potchik <brian@vector35.com> | 2026-03-11 12:12:36 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2026-03-11 12:12:36 -0400 |
| commit | 6b57ef1d2c82d263655364588546e6211b0a99a8 (patch) | |
| tree | 83593089f530368b6d83905fc32858f8251904dc /binaryninjaapi.h | |
| parent | b8fdf800de345f93b2e68713d14bac425a62feb3 (diff) | |
Enhance MemoryMap bindings and add support to re-enable disabled regions in the UI.
Diffstat (limited to 'binaryninjaapi.h')
| -rw-r--r-- | binaryninjaapi.h | 127 |
1 files changed, 126 insertions, 1 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 5acc6a1c..f031d0c6 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -8211,6 +8211,34 @@ namespace BinaryNinja { segmentation is automatically managed. If multiple regions overlap, the most recently added region takes precedence by default. */ + + struct MemoryRegionInfo + { + std::string name; + std::string displayName; + uint64_t start; + uint64_t length; + uint32_t flags; + bool enabled; + bool rebaseable; + uint8_t fill; + bool hasTarget; + bool absoluteAddressMode; + bool local; + }; + + struct ResolvedMemoryRange + { + uint64_t start; + uint64_t length; + std::vector<MemoryRegionInfo> regions; + + uint64_t End() const { return start + length; } + const MemoryRegionInfo* ActiveRegion() const { return regions.empty() ? nullptr : ®ions.front(); } + std::string Name() const { auto* r = ActiveRegion(); return r ? r->name : std::string(); } + uint32_t Flags() const { auto* r = ActiveRegion(); return r ? r->flags : 0; } + }; + class MemoryMap { BNBinaryView* m_object; @@ -8336,6 +8364,103 @@ namespace BinaryNinja { return BNIsMemoryRegionLocal(m_object, name.c_str()); } + std::optional<MemoryRegionInfo> GetMemoryRegionInfo(const std::string& name) + { + BNMemoryRegionInfo info; + if (!BNGetMemoryRegionInfo(m_object, name.c_str(), &info)) + return std::nullopt; + MemoryRegionInfo result {info.name, info.displayName, info.start, info.length, + info.flags, info.enabled, info.rebaseable, info.fill, + info.hasTarget, info.absoluteAddressMode, info.local}; + BNFreeMemoryRegionInfo(&info); + return result; + } + + std::optional<MemoryRegionInfo> GetActiveMemoryRegionInfoAt(uint64_t addr) + { + BNMemoryRegionInfo info; + if (!BNGetActiveMemoryRegionInfoAt(m_object, addr, &info)) + return std::nullopt; + MemoryRegionInfo result {info.name, info.displayName, info.start, info.length, + info.flags, info.enabled, info.rebaseable, info.fill, + info.hasTarget, info.absoluteAddressMode, info.local}; + BNFreeMemoryRegionInfo(&info); + return result; + } + + std::optional<ResolvedMemoryRange> GetResolvedMemoryRangeAt(uint64_t addr) + { + BNResolvedMemoryRange raw; + if (!BNGetResolvedMemoryRangeAt(m_object, addr, &raw)) + return std::nullopt; + ResolvedMemoryRange result; + result.start = raw.start; + result.length = raw.length; + result.regions.reserve(raw.regionCount); + for (size_t j = 0; j < raw.regionCount; j++) + { + auto& r = raw.regions[j]; + result.regions.push_back({r.name, r.displayName, r.start, r.length, + r.flags, r.enabled, r.rebaseable, r.fill, + r.hasTarget, r.absoluteAddressMode, r.local}); + } + BNFreeResolvedMemoryRange(&raw); + return result; + } + + std::vector<MemoryRegionInfo> GetMemoryRegions() + { + size_t count = 0; + BNMemoryRegionInfo* regions = BNGetMemoryRegions(m_object, &count); + std::vector<MemoryRegionInfo> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + result.push_back({ + regions[i].name, + regions[i].displayName, + regions[i].start, + regions[i].length, + regions[i].flags, + regions[i].enabled, + regions[i].rebaseable, + regions[i].fill, + regions[i].hasTarget, + regions[i].absoluteAddressMode, + regions[i].local, + }); + } + BNFreeMemoryRegions(regions, count); + return result; + } + + std::vector<ResolvedMemoryRange> GetResolvedRanges() + { + size_t count = 0; + BNResolvedMemoryRange* ranges = BNGetResolvedMemoryRanges(m_object, &count); + std::vector<ResolvedMemoryRange> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ResolvedMemoryRange range; + range.start = ranges[i].start; + range.length = ranges[i].length; + range.regions.reserve(ranges[i].regionCount); + for (size_t j = 0; j < ranges[i].regionCount; j++) + { + auto& r = ranges[i].regions[j]; + range.regions.push_back({ + r.name, r.displayName, r.start, r.length, + r.flags, r.enabled, r.rebaseable, r.fill, + r.hasTarget, r.absoluteAddressMode, r.local, + }); + } + result.push_back(std::move(range)); + } + BNFreeResolvedMemoryRanges(ranges, count); + return result; + } + void Reset() { BNResetMemoryMap(m_object); @@ -20044,7 +20169,7 @@ namespace BinaryNinja { \return True if the type library was successfully decompressed */ bool DecompressToFile(const std::string& path); - + /*! The Architecture this type library is associated with \return |
