示例#1
0
        public CType Translate(IDiaSymbol sym)
        {
            switch ((SymTagEnum)sym.symTag)
            {
            case SymTagEnum.SymTagBaseType:
                return(TranslateBaseType(sym));

            case SymTagEnum.SymTagPointerType:
                return(TranslatePtr(sym));

            case SymTagEnum.SymTagArrayType:
                return(TranslateArr(sym));

            case SymTagEnum.SymTagFunctionType:
                return(TranslateFunc(sym));

            case SymTagEnum.SymTagUDT:
                return(PdbSymbol.IsUnnamed(sym)
                        ? TranslateUnnamedUdt(sym)
                        : TranslateTypeRef(sym));

            case SymTagEnum.SymTagEnum:
                return(PdbSymbol.IsUnnamed(sym)
                        ? TranslateEnum(sym)
                        : TranslateTypeRef(sym));

            default:
                throw new NotImplementedException(((SymTagEnum)sym.symTag).ToString());
            }
        }
示例#2
0
        private void LoadEnums(IDiaSymbol global)
        {
            IDiaEnumSymbols symbols;

            global.findChildren(SymTagEnum.SymTagEnum, null, 0, out symbols);
            foreach (IDiaSymbol symbol in symbols)
            {
                if (!PdbSymbol.IsUnnamed(symbol))
                {
                    AddSymbol(symbol, PdbSymbolTypes.Enum);
                }
            }
        }
示例#3
0
            public override void Execute(App app)
            {
                DefFactory factory    = new DefFactory();
                Translator translator = new Translator();
                Pdb        pdb        = app._pdb;

                string[] args = app._args;
                for (int i = 2; i < args.Length; i++)
                {
                    string    symName = PdbSymbol.InternName(args[i]);
                    PdbSymbol symbol  = pdb.Find(symName);
                    if (symbol == null)
                    {
                        app.WriteError("can't find symbol: " + symName);
                        continue;
                    }
                    Def def = factory.CreateMixedTypedef(symbol.TranslateBy(translator), symbol.Name);
                    Console.WriteLine(def.Output("", "    "));
                }
            }
示例#4
0
        private void LoadUdts(IDiaSymbol global)
        {
            IDiaEnumSymbols symbols;

            global.findChildren(SymTagEnum.SymTagUDT, null, 0, out symbols);
            foreach (IDiaSymbol symbol in symbols)
            {
                if (!PdbSymbol.IsUnnamed(symbol) && !IsUdtEmpty(symbol))
                {
                    switch ((UdtKindEnum)symbol.udtKind)
                    {
                    case UdtKindEnum.UdtStruct:
                        AddSymbol(symbol, PdbSymbolTypes.Struct);
                        break;

                    case UdtKindEnum.UdtUnion:
                        AddSymbol(symbol, PdbSymbolTypes.Union);
                        break;
                    }
                }
            }
        }
示例#5
0
        private void AddSymbol(IDiaSymbol symbol, PdbSymbolType type)
        {
            string name = PdbSymbol.GetInternName(symbol);

            _symbols.Add(name, new PdbSymbol(symbol, name, type));
        }
示例#6
0
 public CType TranslateTypeRef(IDiaSymbol sym)
 {
     return(new CTypeRef(PdbSymbol.InternName(sym.name)));
 }