summaryrefslogtreecommitdiff
path: root/view/sharedcache/core/SharedCacheController.h
diff options
context:
space:
mode:
Diffstat (limited to 'view/sharedcache/core/SharedCacheController.h')
-rw-r--r--view/sharedcache/core/SharedCacheController.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/view/sharedcache/core/SharedCacheController.h b/view/sharedcache/core/SharedCacheController.h
new file mode 100644
index 00000000..354762eb
--- /dev/null
+++ b/view/sharedcache/core/SharedCacheController.h
@@ -0,0 +1,65 @@
+#pragma once
+
+#include <regex>
+
+#include "SharedCache.h"
+#include "refcountobject.h"
+#include "ffi_global.h"
+
+DECLARE_DSC_API_OBJECT(BNSharedCacheController, SharedCacheController);
+
+void RegisterSharedCacheControllerDestructor();
+
+namespace BinaryNinja::DSC {
+ static const char* METADATA_KEY = "shared_cache";
+
+ // Represents the view state for a given `DSCache`
+ class SharedCacheController : public DSCRefCountObject
+ {
+ IMPLEMENT_DSC_API_OBJECT(BNSharedCacheController);
+ Ref<Logger> m_logger;
+
+ SharedCache m_cache;
+ // Store the open images.
+ // Things other than the cache here will be serialized.
+ std::unordered_set<uint64_t> m_loadedRegions;
+ std::unordered_set<uint64_t> m_loadedImages;
+
+ // Settings from the view.
+ std::regex m_regionFilter;
+ bool m_processObjC;
+ bool m_processCFStrings;
+
+ explicit SharedCacheController(SharedCache cache, Ref<Logger> logger);
+
+ public:
+ // Initialize the DSCacheView, this should be called from the view initialize function only!
+ static DSCRef<SharedCacheController> Initialize(BinaryView& view, SharedCache cache);
+
+ // NOTE: This will not create one if it does not exist. To create one for the view call `Initialize`.
+ static DSCRef<SharedCacheController> FromView(BinaryView& view);
+
+ SharedCache& GetCache() { return m_cache; };
+ const std::unordered_set<uint64_t>& GetLoadedRegions() { return m_loadedRegions; };
+ const std::unordered_set<uint64_t>& GetLoadedImages() { return m_loadedImages; };
+
+ // TODO: LoadResult type? AlreadyLoaded, Loaded, NotLoaded.
+ // NOTE: `address` should be the start of a region, not containing the address.
+ bool ApplyRegionAtAddress(BinaryView& view, uint64_t address);
+
+ bool ApplyRegion(BinaryView& view, const CacheRegion& region);
+
+ bool IsRegionLoaded(const CacheRegion& region) const;
+
+ // Loads the relevant image info into the view. This does not update analysis so if you
+ // call this make sure at some point you update analysis and likely with linear sweep.
+ bool ApplyImage(BinaryView& view, const CacheImage& image);
+
+ bool IsImageLoaded(const CacheImage& image) const;
+
+ // Get the metadata for saving the state of the shared cache.
+ Ref<Metadata> GetMetadata() const;
+
+ void LoadMetadata(const Metadata& metadata);
+ };
+} // namespace BinaryNinja::DSC