summaryrefslogtreecommitdiff
path: root/plugins/rtti/rtti.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/rtti/rtti.h')
-rw-r--r--plugins/rtti/rtti.h33
1 files changed, 32 insertions, 1 deletions
diff --git a/plugins/rtti/rtti.h b/plugins/rtti/rtti.h
index 9740b68f..474253ec 100644
--- a/plugins/rtti/rtti.h
+++ b/plugins/rtti/rtti.h
@@ -31,9 +31,16 @@ namespace BinaryNinja::RTTI {
static VirtualFunctionTableInfo DeserializedMetadata(const Ref<Metadata> &metadata);
};
+ enum class RTTIProcessorType
+ {
+ Microsoft = 0,
+ Itanium = 1,
+ };
+
// TODO: This needs to have some flags. Virtual, pure iirc.
struct ClassInfo
{
+ RTTIProcessorType processor;
std::string className;
std::optional<std::string> baseClassName;
std::optional<uint64_t> classOffset;
@@ -44,4 +51,28 @@ namespace BinaryNinja::RTTI {
static ClassInfo DeserializedMetadata(const Ref<Metadata> &metadata);
};
-} \ No newline at end of file
+
+ class RTTIProcessor
+ {
+ protected:
+ Ref<BinaryView> m_view;
+ Ref<Logger> m_logger;
+
+ std::map<uint64_t, ClassInfo> m_classInfo;
+ std::map<uint64_t, ClassInfo> m_unhandledClassInfo;
+
+ virtual std::optional<ClassInfo> ProcessRTTI(uint64_t objectAddr) = 0;
+
+ virtual std::optional<VirtualFunctionTableInfo> ProcessVFT(uint64_t vftAddr, ClassInfo &classInfo) = 0;
+ public:
+ virtual ~RTTIProcessor() = default;
+
+ void DeserializedMetadata(RTTIProcessorType type, const Ref<Metadata> &metadata);
+
+ Ref<Metadata> SerializedMetadata();
+
+ virtual void ProcessRTTI() = 0;
+
+ virtual void ProcessVFT() = 0;
+ };
+}