summaryrefslogtreecommitdiff
path: root/constantrenderer.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2025-09-08 20:04:36 -0400
committerRusty Wagner <rusty.wagner@gmail.com>2025-10-21 13:52:39 -0400
commitcae26921cf2b2e564f66e58b77a3963fe36f6d2d (patch)
treebfa7ec8de23c1de758463a894583086c8d0b050e /constantrenderer.cpp
parent11ad1fc28470b863326f7136cf9b5723a06e89d3 (diff)
Add constant renderer API
Diffstat (limited to 'constantrenderer.cpp')
-rw-r--r--constantrenderer.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/constantrenderer.cpp b/constantrenderer.cpp
new file mode 100644
index 00000000..1080c846
--- /dev/null
+++ b/constantrenderer.cpp
@@ -0,0 +1,151 @@
+#include "binaryninjaapi.h"
+#include "ffi.h"
+#include "highlevelilinstruction.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+ConstantRenderer::ConstantRenderer(const std::string& name): m_nameForRegister(name)
+{
+ m_object = nullptr;
+}
+
+
+ConstantRenderer::ConstantRenderer(BNConstantRenderer* renderer)
+{
+ m_object = renderer;
+}
+
+
+string ConstantRenderer::GetName() const
+{
+ char* name = BNGetConstantRendererName(m_object);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+bool ConstantRenderer::IsValidForType(HighLevelILFunction*, Type*)
+{
+ return true;
+}
+
+
+bool ConstantRenderer::RenderConstant(const HighLevelILInstruction&, Type*, int64_t,
+ HighLevelILTokenEmitter&, DisassemblySettings*, BNOperatorPrecedence)
+{
+ return false;
+}
+
+
+bool ConstantRenderer::RenderConstantPointer(const HighLevelILInstruction&, Type*, int64_t,
+ HighLevelILTokenEmitter&, DisassemblySettings*, BNSymbolDisplayType, BNOperatorPrecedence)
+{
+ return false;
+}
+
+
+void ConstantRenderer::Register(ConstantRenderer* renderer)
+{
+ BNCustomConstantRenderer callbacks;
+ callbacks.context = renderer;
+ callbacks.isValidForType = IsValidForTypeCallback;
+ callbacks.renderConstant = RenderConstantCallback;
+ callbacks.renderConstantPointer = RenderConstantPointerCallback;
+
+ renderer->AddRefForRegistration();
+ renderer->m_object = BNRegisterConstantRenderer(renderer->m_nameForRegister.c_str(), &callbacks);
+}
+
+
+bool ConstantRenderer::IsValidForTypeCallback(void* ctxt, BNHighLevelILFunction* hlil, BNType* type)
+{
+ ConstantRenderer* renderer = (ConstantRenderer*)ctxt;
+ Ref<HighLevelILFunction> hlilObj = new HighLevelILFunction(BNNewHighLevelILFunctionReference(hlil));
+ Ref<Type> typeObj = new Type(BNNewTypeReference(type));
+ return renderer->IsValidForType(hlilObj, typeObj);
+}
+
+
+bool ConstantRenderer::RenderConstantCallback(void* ctxt, BNHighLevelILFunction* hlil, size_t expr, BNType* type,
+ int64_t val, BNHighLevelILTokenEmitter* tokens, BNDisassemblySettings* settings,
+ BNOperatorPrecedence precedence)
+{
+ ConstantRenderer* renderer = (ConstantRenderer*)ctxt;
+ Ref<HighLevelILFunction> hlilObj = new HighLevelILFunction(BNNewHighLevelILFunctionReference(hlil));
+ HighLevelILInstruction instr = hlilObj->GetExpr(expr);
+ Ref<Type> typeObj = new Type(BNNewTypeReference(type));
+ Ref<HighLevelILTokenEmitter> tokenObj = new HighLevelILTokenEmitter(BNNewHighLevelILTokenEmitterReference(tokens));
+ Ref<DisassemblySettings> settingsObj = settings ? new DisassemblySettings(BNNewDisassemblySettingsReference(settings)) : nullptr;
+ return renderer->RenderConstant(instr, typeObj, val, *tokenObj, settingsObj, precedence);
+}
+
+
+bool ConstantRenderer::RenderConstantPointerCallback(void* ctxt, BNHighLevelILFunction* hlil, size_t expr, BNType* type,
+ int64_t val, BNHighLevelILTokenEmitter* tokens, BNDisassemblySettings* settings, BNSymbolDisplayType symbolDisplay,
+ BNOperatorPrecedence precedence)
+{
+ ConstantRenderer* renderer = (ConstantRenderer*)ctxt;
+ Ref<HighLevelILFunction> hlilObj = new HighLevelILFunction(BNNewHighLevelILFunctionReference(hlil));
+ HighLevelILInstruction instr = hlilObj->GetExpr(expr);
+ Ref<Type> typeObj = new Type(BNNewTypeReference(type));
+ Ref<HighLevelILTokenEmitter> tokenObj = new HighLevelILTokenEmitter(BNNewHighLevelILTokenEmitterReference(tokens));
+ Ref<DisassemblySettings> settingsObj = settings ? new DisassemblySettings(BNNewDisassemblySettingsReference(settings)) : nullptr;
+ return renderer->RenderConstantPointer(instr, typeObj, val, *tokenObj, settingsObj, symbolDisplay, precedence);
+}
+
+
+Ref<ConstantRenderer> ConstantRenderer::GetByName(const std::string& name)
+{
+ BNConstantRenderer* renderer = BNGetConstantRendererByName(name.c_str());
+ if (!renderer)
+ return nullptr;
+ return new CoreConstantRenderer(renderer);
+}
+
+
+vector<Ref<ConstantRenderer>> ConstantRenderer::GetRenderers()
+{
+ size_t count = 0;
+ BNConstantRenderer** renderers = BNGetConstantRendererList(&count);
+
+ vector<Ref<ConstantRenderer>> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new CoreConstantRenderer(renderers[i]));
+
+ BNFreeConstantRendererList(renderers);
+ return result;
+}
+
+
+CoreConstantRenderer::CoreConstantRenderer(BNConstantRenderer* renderer):
+ ConstantRenderer(renderer)
+{
+}
+
+
+bool CoreConstantRenderer::IsValidForType(HighLevelILFunction* func, Type* type)
+{
+ return BNIsConstantRendererValidForType(m_object, func->GetObject(), type->GetObject());
+}
+
+
+bool CoreConstantRenderer::RenderConstant(const HighLevelILInstruction& instr, Type* type, int64_t val,
+ HighLevelILTokenEmitter& tokens, DisassemblySettings* settings, BNOperatorPrecedence precedence)
+{
+ return BNConstantRendererRenderConstant(m_object, instr.function->GetObject(), instr.exprIndex,
+ type->GetObject(), val, tokens.GetObject(), settings ? settings->GetObject() : nullptr, precedence);
+}
+
+
+bool CoreConstantRenderer::RenderConstantPointer(const HighLevelILInstruction& instr, Type* type, int64_t val,
+ HighLevelILTokenEmitter& tokens, DisassemblySettings* settings, BNSymbolDisplayType symbolDisplay,
+ BNOperatorPrecedence precedence)
+{
+ return BNConstantRendererRenderConstantPointer(m_object, instr.function->GetObject(), instr.exprIndex,
+ type->GetObject(), val, tokens.GetObject(), settings ? settings->GetObject() : nullptr,
+ symbolDisplay, precedence);
+}