Beispiel #1
0
        public static dynamic xCoreStructInfo(
            CODEVIEW_HEADER CV,
            string Struct,
            long vAddress  = 0,
            long[] memRead = null,
            Func <long, int, byte[]> GetMem            = null,
            Func <long, int, long[]> GetMemLong        = null,
            PropertyChangedEventHandler ExpandoChanged = null
            )
        {
            var Info = SymAPI.GetType(Struct, CV) as dynamic;

            if (vAddress != 0)
            {
                Info.vAddress = vAddress;
            }

            xCoreDumpStructs(Info, Struct, 0, vAddress, memRead, GetMem, GetMemLong, ExpandoChanged);

            if (ExpandoChanged != null)
            {
                ((INotifyPropertyChanged)Info).PropertyChanged +=
                    new PropertyChangedEventHandler(ExpandoChanged);
            }


            return(Info);
        }
Beispiel #2
0
        void IDiaSession.getSymbolsByAddr(out IDiaEnumSymbolsByAddr ppEnumbyAddr)
        {
            dynamic typ = null;

            if (!Dia3.StructCache.ContainsKey(loadAddress.ToString("x")))
            {
                var json = SymAPI.FromAddress(loadAddress.ToString("x"), CV);
                typ = JsonConvert.DeserializeObject <SymNameInfo>(json.Result);

                Dia3.StructCache.TryAdd(loadAddress.ToString("x"), typ);
            }
            Dia3.StructCache.TryGetValue(loadAddress.ToString("x"), out typ);

            ppEnumbyAddr = new EnumSymbols(CV, EnumSymType.ByAddr, typ);
            return;
        }
Beispiel #3
0
        void IDiaSession.findChildren(IDiaSymbol parent, SymTagEnum symTag, string name, uint compareFlags, out IDiaEnumSymbols ppResult)
        {
            dynamic typ = null;

            if (!Dia3.StructCache.ContainsKey(name))
            {
                var json      = SymAPI.TypeDef(name, CV);
                var converter = new Newtonsoft.Json.Converters.ExpandoObjectConverter();
                var obj       = JsonConvert.DeserializeObject <List <ExpandoObject> >(json.Result, converter);
                // we access just the first object back
                Dia3.StructCache.TryAdd(name, obj.First());
            }
            Dia3.StructCache.TryGetValue(name, out typ);

            ppResult = new EnumSymbols(CV, EnumSymType.Sym, typ);
            return;
        }
Beispiel #4
0
        public static SYMBOL_INFO SymFromName(string name, CODEVIEW_HEADER cvh)
        {
            SYMBOL_INFO rv = new SYMBOL_INFO();

            var json  = SymAPI.FromName(name, cvh);
            var names = JsonConvert.DeserializeObject <NameList>(json.Result);

            if (names == null)
            {
                return(rv);
            }

            var first = names.Names.First();

            rv.Address = first.Address;
            rv.Size    = (uint)first.Length;
            rv.Name    = first.Name;

            return(rv);
        }
Beispiel #5
0
        /// <summary>
        /// Perform full symbol walk scanning for a struct/member position and length
        ///
        /// TODO: make safe for type collisions in other pdb's
        /// </summary>
        /// <param name="PDBFile">d:\dev\symbols\ntkrnlmp.pdb\DD08DD42692B43F199A079D60E79D2171\ntkrnlmp.pdb</param>
        /// <param name="Struct">_EPROCESS</param>
        /// <param name="Member">Pcb.DirectoryTableBase</param>
        /// <returns>Tuple of Position & Length </returns>

        public static Tuple <int, int> StructMemberInfo(CODEVIEW_HEADER cv, string Struct, string Member)
        {
#if !NETSTANDARD2_0
            IDiaSession     Session;
            IDiaSymbol      Master         = null;
            IDiaEnumSymbols EnumSymbols    = null;
            uint            compileFetched = 0;

            var result = from symx in StructInfo
                         where symx.Key.EndsWith(Member)
                         select symx;

            if (result.Count() > 0)
            {
                return(result.First().Value);
            }
#endif

#if NETSTANDARD2_0
            IDictionary <string, dynamic> dInfo = null;
            dynamic memberInfo = null;
            var     cnt        = Member.Split('.').Length;

            var typeInfo = SymAPI.GetType(Struct, cv);

            dInfo = typeInfo as IDictionary <string, dynamic>;
            if (cnt == 1)
            {
                memberInfo = dInfo[Member];
            }
            else
            {
                for (int i = 0; i < cnt; i++)
                {
                    var path = Member.Split('.')[i];

                    dInfo      = typeInfo as IDictionary <string, dynamic>;
                    memberInfo = dInfo[path];

                    if (i < cnt)
                    {
                        typeInfo = memberInfo;
                    }
                }
            }

            dInfo = memberInfo as IDictionary <string, dynamic>;
            return(Tuple.Create((int)dInfo["OffsetPos"], (int)dInfo["Length"]));

            /* bah, screw this just return the object :\
             * var foo = new DiaSource(cv);
             * foo.loadDataFromPdb(cv.PDBFullPath);
             * foo.openSession(out Session);
             */
#else
            var foo = new DiaSource();
            foo.loadDataFromPdb(cv.PDBFullPath);
            foo.openSession(out Session);
            if (Session == null)
            {
                return(null);
            }
            Session.findChildren(Session.globalScope, (uint)DebugHelp.SymTagEnum.Null, Struct, 0, out EnumSymbols);
            do
            {
                EnumSymbols.Next(1, out Master, out compileFetched);
                if (Master == null)
                {
                    continue;
                }
#if DEBUGX
                Console.ForegroundColor = ConsoleColor.White;
                WriteLine($"Dumping Type [{Master.name}] Len [{Master.length}]");
#endif
                if (!StructInfo.ContainsKey(Master.name))
                {
                    StructInfo.Add(Master.name, Tuple.Create <int, int>(0, (int)Master.length));
                }

                DumpStructs(Master, Master.name, Struct, 0);
            } while (compileFetched == 1);

            var resultx = (from symx in StructInfo
                           where symx.Key.EndsWith(Member)
                           select symx).FirstOrDefault();

            return(resultx.Value);
#endif
        }