Пример #1
0
        private void LoadReflectedTypes(Module module)
        {
            // Look for all overloaded implementations of the registration function
            IDiaEnumSymbols enum_symbols;

            m_Session.globalScope.findChildren(SymTagEnum.SymTagFunction, "RflReflectedTypesTable", 0, out enum_symbols);

            foreach (IDiaSymbol symbol in enum_symbols)
            {
                // Get the first argument
                IDiaEnumSymbols enum_args;
                symbol.findChildren(SymTagEnum.SymTagData, "arg", 0, out enum_args);
                IDiaSymbol arg = enum_args.Item(0);

                // Get base type information
                IDiaSymbol dia_type       = arg.type.type;
                string     type_name      = GetTypeName(dia_type);
                string     full_type_name = type_name;
                uint       size           = (uint)dia_type.length;

                Namespace cur_ns = module.GlobalNamespace.FindOrCreateNamespace(ref type_name);
                Rfl.Type  type   = null;

                // Is a template being reflected?
                symbol.findChildren(SymTagEnum.SymTagData, "is_template", 0, out enum_args);
                if (enum_args.count != 0)
                {
                    // Strip the template parameters
                    type_name      = type_name.Remove(type_name.IndexOf('<'));
                    full_type_name = full_type_name.Remove(full_type_name.IndexOf('<'));

                    Rfl.Template template = new Rfl.Template(cur_ns, type_name);
                    cur_ns.Templates.Add(template);
                    type = template;

                    m_Logger.WriteSection("Reflect Request Template - {" + template.FullName.String + "}");
                }

                else
                {
                    switch ((SymTagEnum)dia_type.symTag)
                    {
                    case SymTagEnum.SymTagBaseType:
                    {
                        Rfl.BaseType base_type = new Rfl.BaseType(
                            cur_ns,
                            type_name,
                            size,
                            TypeOfVirtualAddress(full_type_name));

                        m_Logger.WriteSection("Reflect Request BaseType - {" + base_type.FullName.String + "}");

                        cur_ns.BaseTypes.Add(base_type);
                        type = base_type;

                        break;
                    }

                    case SymTagEnum.SymTagUDT:
                    {
                        Rfl.Class class_type = new Rfl.Class(
                            cur_ns,
                            type_name,
                            size,
                            TypeOfVirtualAddress(full_type_name),
                            dia_type.constructor == 0);

                        m_Logger.WriteSection("Reflect Request Class - {" + class_type.FullName.String + "}");

                        cur_ns.Classes.Add(class_type);
                        type = class_type;

                        break;
                    }

                    case SymTagEnum.SymTagEnum:
                    {
                        Rfl.Enum enum_type = new Rfl.Enum(
                            cur_ns,
                            type_name,
                            size,
                            TypeOfVirtualAddress("enum " + full_type_name));

                        m_Logger.WriteSection("Reflect Request Enum - {" + enum_type.FullName.String + "}");

                        cur_ns.Enums.Add(enum_type);
                        LoadEnumEntries(enum_type, dia_type);
                        type = enum_type;

                        break;
                    }

                    default:
                        m_Logger.WriteError("Can not reflect unknown type - {" + type_name + "}");
                        continue;
                    }
                }

                // Check for light-weight type reflection
                symbol.findChildren(SymTagEnum.SymTagData, "minimal", 0, out enum_args);
                if (enum_args.count != 0)
                {
                    type.MinimalReflection = true;
                    m_Logger.Write("Minimal Reflection");
                }

                m_TypeMap.Add(full_type_name, type);
                m_DiaSymbolMap.Add(type, dia_type);

                m_Logger.EndSection();
            }
        }