From 5147249a644f611a801aada7645b7a993fc8e314 Mon Sep 17 00:00:00 2001 From: Brandon Miller Date: Thu, 8 May 2025 15:08:10 -0400 Subject: Implement EFI resolver as a module workflow --- plugins/efi_resolver/src/GuidRenderer.cpp | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 plugins/efi_resolver/src/GuidRenderer.cpp (limited to 'plugins/efi_resolver/src/GuidRenderer.cpp') diff --git a/plugins/efi_resolver/src/GuidRenderer.cpp b/plugins/efi_resolver/src/GuidRenderer.cpp new file mode 100644 index 00000000..2a220edc --- /dev/null +++ b/plugins/efi_resolver/src/GuidRenderer.cpp @@ -0,0 +1,52 @@ +#include "GuidRenderer.h" + +bool isType(const vector>& context, const string& name) +{ + if (context.empty()) + return false; + + auto [deepestType, size] = context.back(); + if (!deepestType->IsNamedTypeRefer()) + return false; + + return deepestType->GetTypeName().GetString() == name; +} + +bool EfiGuidRenderer::IsValidForData(BinaryView* bv, uint64_t address, Type* type, vector>& context) +{ + return isType(context, "EFI_GUID"); +} + +static string formatGuid(uint32_t data1, uint16_t data2, uint16_t data3, uint64_t data4) +{ + std::ostringstream oss; + oss << std::hex << std::uppercase << std::setfill('0') << std::setw(8) << data1 << "-" << std::setw(4) << data2 + << "-" << std::setw(4) << data3 << "-" << std::setw(16) << data4; + return oss.str(); +} + +vector EfiGuidRenderer::GetLinesForData( + BinaryView* bv, uint64_t address, Type*, const vector& prefix, size_t width, + vector>& context, const std::string& language) +{ + BinaryReader reader(bv); + reader.Seek(address); + auto data1 = reader.Read32(); + auto data2 = reader.Read16(); + auto data3 = reader.Read16(); + auto data4 = reader.ReadBE64(); + string guidStr = formatGuid(data1, data2, data3, data4); + + DisassemblyTextLine line; + line.addr = address; + line.tokens = prefix; + line.tokens.emplace_back(TextToken, "[EFI_GUID(\""); + line.tokens.emplace_back(StringToken, guidStr); + line.tokens.emplace_back(TextToken, "\")]"); + return {line}; +} + +void EfiGuidRenderer::Register() +{ + DataRendererContainer::RegisterTypeSpecificDataRenderer(new EfiGuidRenderer()); +} -- cgit v1.3.1