From 03d9757c948fba0792d80f6e143b24b49748e7b2 Mon Sep 17 00:00:00 2001 From: nullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com> Date: Mon, 20 Jan 2025 16:48:44 +1100 Subject: MSVC RTTI: Define attribute enumerations for Base Class Descriptors and Class Hierarchy Descriptors --- plugins/msvc_rtti/rtti.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'plugins/msvc_rtti/rtti.cpp') diff --git a/plugins/msvc_rtti/rtti.cpp b/plugins/msvc_rtti/rtti.cpp index 7dfa6130..1ec85393 100644 --- a/plugins/msvc_rtti/rtti.cpp +++ b/plugins/msvc_rtti/rtti.cpp @@ -141,6 +141,7 @@ Ref BaseClassDescriptorType(BinaryView *view, BNPointerBaseType ptrBaseTy) if (typeCache == nullptr) { + Ref arch = view->GetDefaultArchitecture(); Ref uintType = Type::IntegerType(4, false); StructureBuilder baseClassDescriptorBuilder; @@ -151,7 +152,17 @@ Ref BaseClassDescriptorType(BinaryView *view, BNPointerBaseType ptrBaseTy) baseClassDescriptorBuilder.AddMember(pTypeDescType, "pTypeDescriptor"); baseClassDescriptorBuilder.AddMember(uintType, "numContainedBases"); baseClassDescriptorBuilder.AddMember(GetPMDType(view), "where"); - baseClassDescriptorBuilder.AddMember(uintType, "attributes"); + Ref attrEnum = EnumerationBuilder() + .AddMemberWithValue("BCD_NOT_VISIBLE", 0x01) + .AddMemberWithValue("BCD_AMBIGUOUS", 0x02) + .AddMemberWithValue("BCD_PRIVORPROTBASE", 0x04) + .AddMemberWithValue("BCD_PRIVORPROTINCOMPOBJ", 0x08) + .AddMemberWithValue("BCD_VBOFCONTOBJ", 0x10) + .AddMemberWithValue("BCD_NONPOLYMORPHIC", 0x20) + .AddMemberWithValue("BCD_HASPCHD", 0x40) + .Finalize(); + Ref attrType = Type::EnumerationType(arch, attrEnum, 4); + baseClassDescriptorBuilder.AddMember(attrType, "attributes"); Ref pClassDescType = TypeBuilder::PointerType(4, ClassHierarchyDescriptorType(view, ptrBaseTy)) .SetPointerBase(ptrBaseTy, 0) .Finalize(); @@ -185,11 +196,18 @@ Ref ClassHierarchyDescriptorType(BinaryView *view, BNPointerBaseType ptrBa if (typeCache == nullptr) { + Ref arch = view->GetDefaultArchitecture(); Ref uintType = Type::IntegerType(4, false); StructureBuilder classHierarchyDescriptorBuilder; classHierarchyDescriptorBuilder.AddMember(uintType, "signature"); - classHierarchyDescriptorBuilder.AddMember(uintType, "attributes"); + Ref attrEnum = EnumerationBuilder() + .AddMemberWithValue("CHD_MULTINH", 0x01) + .AddMemberWithValue("CHD_VIRTINH", 0x02) + .AddMemberWithValue("CHD_AMBIGUOUS", 0x04) + .Finalize(); + Ref attrType = Type::EnumerationType(arch, attrEnum, 4); + classHierarchyDescriptorBuilder.AddMember(attrType, "attributes"); classHierarchyDescriptorBuilder.AddMember(uintType, "numBaseClasses"); Ref pBaseClassArrayType = TypeBuilder::PointerType(4, Type::VoidType()) .SetPointerBase(ptrBaseTy, 0) -- cgit v1.3.1