Example #1
0
 public int FindChildren(IDiaSymbol parent, SymTagEnum symTag, String name, NameSearchOptions compareFlags, out IDiaEnumSymbols enumSymbols)
 {
     enumSymbols = null;
     IntPtr _enumSymbols;
     int hr;
     unsafe
     {
         fixed (char* _name = name)
         {
             hr = S.StdCall<int>(GetVTableMember(8), Punk, parent.Punk, (int)symTag, _name, (int)compareFlags, out _enumSymbols);
         }
     }
     GC.KeepAlive(this);
     GC.KeepAlive(parent);
     if (hr != S_OK)
         return hr;
     enumSymbols = new IDiaEnumSymbols(_enumSymbols);
     return hr;
 }
Example #2
0
        public int FindChildren(IDiaSymbol parent, SymTagEnum symTag, String name, NameSearchOptions compareFlags, out IDiaEnumSymbols enumSymbols)
        {
            enumSymbols = null;
            IntPtr _enumSymbols;
            int    hr;

            unsafe
            {
                fixed(char *_name = name)
                {
                    hr = S.StdCall <int>(GetVTableMember(8), Punk, parent.Punk, (int)symTag, _name, (int)compareFlags, out _enumSymbols);
                }
            }
            GC.KeepAlive(this);
            GC.KeepAlive(parent);
            if (hr != S_OK)
            {
                return(hr);
            }
            enumSymbols = new IDiaEnumSymbols(_enumSymbols);
            return(hr);
        }
Example #3
0
 /// <summary>
 /// Returns global functions defined in this executable that meet the supplied filter
 /// </summary>
 public DisposableEnumerable <Symbol> CreateGlobalFunctionIterator(string functionName, NameSearchOptions searchOptions)
 {
     return(this.GlobalScope.CreateChildren(SymTagEnum.SymTagFunction, functionName, searchOptions));
 }
Example #4
0
        private IEnumerable <Symbol> CreateChildrenImpl(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions)
        {
            IDiaEnumSymbols enumSymbols = null;

            try
            {
                try
                {
                    _sym.findChildren(symbolTagType, symbolName, (uint)searchOptions, out enumSymbols);
                }
                catch (NotImplementedException) { }

                if (enumSymbols == null)
                {
                    yield break;
                }

                while (true)
                {
                    uint       celt = 0;
                    IDiaSymbol symbol;
                    enumSymbols.Next(1, out symbol, out celt);
                    if (celt != 1)
                    {
                        break;            //No more symbols
                    }
                    yield return(Symbol.Create(symbol));
                }
            }
            finally
            {
                if (enumSymbols != null)
                {
                    Marshal.ReleaseComObject(enumSymbols);
                }
            }
        }
Example #5
0
 public DisposableEnumerable <Symbol> CreateChildren(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions)
 {
     this.AssertNotDisposed();
     return(new DisposableEnumerable <Symbol>(this.CreateChildrenImpl(symbolTagType, symbolName, searchOptions)));
 }
Example #6
0
        // TODO FIX NOW REMOVE
        private IEnumerable<IDiaSymbol> FindChildren(IDiaSymbol scope,
            string name = null, NameSearchOptions searchOptions = NameSearchOptions.nsNone)
        {
            IDiaEnumSymbols symEnum;
            m_session.findChildren(scope, SymTagEnum.SymTagNull, name, (uint)searchOptions, out symEnum);
            uint fetchCount;

            var ret = new List<IDiaSymbol>();
            for (; ; )
            {
                IDiaSymbol sym;

                symEnum.Next(1, out sym, out fetchCount);
                if (fetchCount == 0)
                    break;

                SymTagEnum symTag = (SymTagEnum)sym.symTag;
                Debug.WriteLine("Got " + sym.name + " symTag  " + symTag + " token " + sym.token.ToString("x"));
                if (symTag == SymTagEnum.SymTagFunction)
                {
                    if (sym.token != 0)
                    {
                        var sourceLocation = SourceLocationForManagedCode(sym.token, 0);
                        if (sourceLocation != null)
                            Debug.WriteLine("Got Line " + sourceLocation.LineNumber + " file " + sourceLocation.SourceFile);
                    }
                }

                if (symTag == SymTagEnum.SymTagCompiland)
                {
                    var children = (List<IDiaSymbol>)FindChildren(sym, name, searchOptions);
                    Debug.WriteLine("got " + children.Count + " children");
                }

                ret.Add(sym);
            }
            return ret;
        }
Example #7
0
 // TODO FIX NOW REMOVE
 internal IEnumerable<string> FindChildrenNames(IDiaSymbol scope,
     string name = null, NameSearchOptions searchOptions = NameSearchOptions.nsNone)
 {
     var syms = FindChildren(m_session.globalScope, name, searchOptions);
     var ret = new List<string>();
     foreach (var sym in syms)
         ret.Add(sym.name);
     return ret;
 }
Example #8
0
        private IEnumerable<Symbol> CreateChildrenImpl(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions)
        {
            IDiaEnumSymbols enumSymbols = null;

            try
            {
                _sym.findChildren(symbolTagType, symbolName, (uint)searchOptions, out enumSymbols);
                if (enumSymbols == null)
                {
                    yield break;
                }

                while (true)
                {
                    uint celt = 0;
                    IDiaSymbol symbol;
                    enumSymbols.Next(1, out symbol, out celt);
                    if (celt != 1) break; //No more symbols
                    yield return Symbol.Create(symbol);
                }
            }
            finally
            {
                if (enumSymbols != null)
                {
                    Marshal.ReleaseComObject(enumSymbols);
                }
            }
        }
Example #9
0
 public DisposableEnumerable<Symbol> CreateChildren(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions)
 {
     this.AssertNotDisposed();
     return new DisposableEnumerable<Symbol>(this.CreateChildrenImpl(symbolTagType, symbolName, searchOptions));
 }