summaryrefslogtreecommitdiff
path: root/binaryninjaapi.h
diff options
context:
space:
mode:
Diffstat (limited to 'binaryninjaapi.h')
-rw-r--r--binaryninjaapi.h127
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 : &regions.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