예제 #1
0
 /// <summary>
 /// </summary>
 /// <param name="hashtable">
 /// </param>
 internal IntHashTableEnumerator(IntHashTable hashtable)
 {
     this.hashtable = hashtable;
     this.bucket    = hashtable.buckets.Length;
     this.version   = hashtable.version;
     this.current   = false;
 }
예제 #2
0
        /// <summary>
        /// </summary>
        /// <param name="bits">
        /// </param>
        /// <returns>
        /// </returns>
        /// <exception cref="PdbDebugException">
        /// </exception>
        private static IntHashTable LoadNameStream(BitAccess bits)
        {
            var ht = new IntHashTable();

            uint sig;
            int  ver;

            bits.ReadUInt32(out sig); // 0..3  Signature
            bits.ReadInt32(out ver);  // 4..7  Version

            // Read (or skip) string buffer.
            int buf;

            bits.ReadInt32(out buf); // 8..11 Bytes of Strings

            if (sig != 0xeffeeffe || ver != 1)
            {
                throw new PdbDebugException("Unsupported Name Stream version. " + "(sig={0:x8}, ver={1})", sig, ver);
            }

            var beg = bits.Position;
            var nxt = bits.Position + buf;

            bits.Position = nxt;

            // Read hash table.
            int siz;

            bits.ReadInt32(out siz); // n+0..3 Number of hash buckets.
            nxt = bits.Position;

            for (var i = 0; i < siz; i++)
            {
                int    ni;
                string name;

                bits.ReadInt32(out ni);

                if (ni != 0)
                {
                    var saved = bits.Position;
                    bits.Position = beg + ni;
                    bits.ReadCString(out name);
                    bits.Position = saved;

                    ht.Add(ni, name);
                }
            }

            bits.Position = nxt;

            return(ht);
        }
예제 #3
0
        /// <summary>
        /// </summary>
        /// <param name="bits">
        /// </param>
        /// <param name="info">
        /// </param>
        /// <param name="names">
        /// </param>
        /// <param name="funcList">
        /// </param>
        /// <param name="readStrings">
        /// </param>
        /// <param name="dir">
        /// </param>
        /// <param name="nameIndex">
        /// </param>
        /// <param name="reader">
        /// </param>
        /// <exception cref="PdbDebugException">
        /// </exception>
        private static void LoadFuncsFromDbiModule(
            BitAccess bits,
            DbiModuleInfo info,
            IntHashTable names,
            ArrayList funcList,
            bool readStrings,
            MsfDirectory dir,
            Dictionary <string, int> nameIndex,
            PdbReader reader)
        {
            PdbFunction[] funcs = null;

            bits.Position = 0;
            int sig;

            bits.ReadInt32(out sig);
            if (sig != 4)
            {
                throw new PdbDebugException("Invalid signature. (sig={0})", sig);
            }

            bits.Position = 4;

            // Console.WriteLine("{0}:", info.moduleName);
            funcs = PdbFunction.LoadManagedFunctions(info.moduleName, bits, (uint)info.cbSyms, readStrings);
            if (funcs != null)
            {
                bits.Position = info.cbSyms + info.cbOldLines;
                LoadManagedLines(funcs, names, bits, dir, nameIndex, reader, (uint)(info.cbSyms + info.cbOldLines + info.cbLines));

                for (var i = 0; i < funcs.Length; i++)
                {
                    funcList.Add(funcs[i]);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// </summary>
        /// <param name="funcs">
        /// </param>
        /// <param name="names">
        /// </param>
        /// <param name="bits">
        /// </param>
        /// <param name="dir">
        /// </param>
        /// <param name="nameIndex">
        /// </param>
        /// <param name="reader">
        /// </param>
        /// <param name="limit">
        /// </param>
        private static void LoadManagedLines(
            PdbFunction[] funcs, IntHashTable names, BitAccess bits, MsfDirectory dir, Dictionary <string, int> nameIndex, PdbReader reader, uint limit)
        {
            Array.Sort(funcs, PdbFunction.byAddress);
            var checks = new IntHashTable();

            // Read the files first
            var begin = bits.Position;

            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                var place  = bits.Position;
                var endSym = bits.Position + siz;

                switch ((DEBUG_S_SUBSECTION)sig)
                {
                case DEBUG_S_SUBSECTION.FILECHKSMS:
                    while (bits.Position < endSym)
                    {
                        CV_FileCheckSum chk;

                        var ni = bits.Position - place;
                        bits.ReadUInt32(out chk.name);
                        bits.ReadUInt8(out chk.len);
                        bits.ReadUInt8(out chk.type);

                        var name = (string)names[(int)chk.name];
                        int guidStream;
                        var doctypeGuid  = SymDocumentType.Text;
                        var languageGuid = SymLanguageType.CSharp;
                        var vendorGuid   = SymLanguageVendor.Microsoft;
                        if (nameIndex.TryGetValue("/src/files/" + name, out guidStream))
                        {
                            var guidBits = new BitAccess(0x100);
                            dir.streams[guidStream].Read(reader, guidBits);
                            LoadGuidStream(guidBits, out doctypeGuid, out languageGuid, out vendorGuid);
                        }

                        var src = new PdbSource((uint)ni, name, doctypeGuid, languageGuid, vendorGuid);
                        checks.Add(ni, src);
                        bits.Position += chk.len;
                        bits.Align(4);
                    }

                    bits.Position = endSym;
                    break;

                default:
                    bits.Position = endSym;
                    break;
                }
            }

            // Read the lines next.
            bits.Position = begin;
            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                var endSym = bits.Position + siz;

                switch ((DEBUG_S_SUBSECTION)sig)
                {
                case DEBUG_S_SUBSECTION.LINES:
                {
                    CV_LineSection sec;

                    bits.ReadUInt32(out sec.off);
                    bits.ReadUInt16(out sec.sec);
                    bits.ReadUInt16(out sec.flags);
                    bits.ReadUInt32(out sec.cod);
                    var func = FindFunction(funcs, sec.sec, sec.off);
                    if (func == null)
                    {
                        break;
                    }

                    // Count the line blocks.
                    var begSym = bits.Position;
                    var blocks = 0;
                    while (bits.Position < endSym)
                    {
                        CV_SourceFile file;
                        bits.ReadUInt32(out file.index);
                        bits.ReadUInt32(out file.count);
                        bits.ReadUInt32(out file.linsiz);         // Size of payload.
                        var linsiz = (int)file.count * (8 + ((sec.flags & 1) != 0 ? 4 : 0));
                        bits.Position += linsiz;
                        blocks++;
                    }

                    func.lines = new PdbLines[blocks];
                    var block = 0;

                    bits.Position = begSym;
                    while (bits.Position < endSym)
                    {
                        CV_SourceFile file;
                        bits.ReadUInt32(out file.index);
                        bits.ReadUInt32(out file.count);
                        bits.ReadUInt32(out file.linsiz);         // Size of payload.

                        var src = (PdbSource)checks[(int)file.index];
                        var tmp = new PdbLines(src, file.count);
                        func.lines[block++] = tmp;
                        var lines = tmp.lines;

                        var plin = bits.Position;
                        var pcol = bits.Position + 8 * (int)file.count;

                        for (var i = 0; i < file.count; i++)
                        {
                            CV_Line line;
                            var     column = new CV_Column();

                            bits.Position = plin + 8 * i;
                            bits.ReadUInt32(out line.offset);
                            bits.ReadUInt32(out line.flags);

                            var lineBegin = line.flags & (uint)CV_Line_Flags.linenumStart;
                            var delta     = (line.flags & (uint)CV_Line_Flags.deltaLineEnd) >> 24;
                            var statement = (line.flags & (uint)CV_Line_Flags.fStatement) == 0;
                            if ((sec.flags & 1) != 0)
                            {
                                bits.Position = pcol + 4 * i;
                                bits.ReadUInt16(out column.offColumnStart);
                                bits.ReadUInt16(out column.offColumnEnd);
                            }

                            lines[i] = new PdbLine(line.offset, lineBegin, column.offColumnStart, lineBegin + delta, column.offColumnEnd);
                        }
                    }

                    break;
                }
                }

                bits.Position = endSym;
            }
        }
예제 #5
0
        /// <summary>
        /// </summary>
        /// <param name="bits">
        /// </param>
        /// <returns>
        /// </returns>
        /// <exception cref="PdbDebugException">
        /// </exception>
        private static IntHashTable LoadNameStream(BitAccess bits)
        {
            var ht = new IntHashTable();

            uint sig;
            int ver;
            bits.ReadUInt32(out sig); // 0..3  Signature
            bits.ReadInt32(out ver); // 4..7  Version

            // Read (or skip) string buffer.
            int buf;
            bits.ReadInt32(out buf); // 8..11 Bytes of Strings

            if (sig != 0xeffeeffe || ver != 1)
            {
                throw new PdbDebugException("Unsupported Name Stream version. " + "(sig={0:x8}, ver={1})", sig, ver);
            }

            var beg = bits.Position;
            var nxt = bits.Position + buf;
            bits.Position = nxt;

            // Read hash table.
            int siz;
            bits.ReadInt32(out siz); // n+0..3 Number of hash buckets.
            nxt = bits.Position;

            for (var i = 0; i < siz; i++)
            {
                int ni;
                string name;

                bits.ReadInt32(out ni);

                if (ni != 0)
                {
                    var saved = bits.Position;
                    bits.Position = beg + ni;
                    bits.ReadCString(out name);
                    bits.Position = saved;

                    ht.Add(ni, name);
                }
            }

            bits.Position = nxt;

            return ht;
        }
예제 #6
0
        /// <summary>
        /// </summary>
        /// <param name="funcs">
        /// </param>
        /// <param name="names">
        /// </param>
        /// <param name="bits">
        /// </param>
        /// <param name="dir">
        /// </param>
        /// <param name="nameIndex">
        /// </param>
        /// <param name="reader">
        /// </param>
        /// <param name="limit">
        /// </param>
        private static void LoadManagedLines(
            PdbFunction[] funcs, IntHashTable names, BitAccess bits, MsfDirectory dir, Dictionary<string, int> nameIndex, PdbReader reader, uint limit)
        {
            Array.Sort(funcs, PdbFunction.byAddress);
            var checks = new IntHashTable();

            // Read the files first
            var begin = bits.Position;
            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                var place = bits.Position;
                var endSym = bits.Position + siz;

                switch ((DEBUG_S_SUBSECTION)sig)
                {
                    case DEBUG_S_SUBSECTION.FILECHKSMS:
                        while (bits.Position < endSym)
                        {
                            CV_FileCheckSum chk;

                            var ni = bits.Position - place;
                            bits.ReadUInt32(out chk.name);
                            bits.ReadUInt8(out chk.len);
                            bits.ReadUInt8(out chk.type);

                            var name = (string)names[(int)chk.name];
                            int guidStream;
                            var doctypeGuid = SymDocumentType.Text;
                            var languageGuid = SymLanguageType.CSharp;
                            var vendorGuid = SymLanguageVendor.Microsoft;
                            if (nameIndex.TryGetValue("/src/files/" + name, out guidStream))
                            {
                                var guidBits = new BitAccess(0x100);
                                dir.streams[guidStream].Read(reader, guidBits);
                                LoadGuidStream(guidBits, out doctypeGuid, out languageGuid, out vendorGuid);
                            }

                            var src = new PdbSource((uint)ni, name, doctypeGuid, languageGuid, vendorGuid);
                            checks.Add(ni, src);
                            bits.Position += chk.len;
                            bits.Align(4);
                        }

                        bits.Position = endSym;
                        break;

                    default:
                        bits.Position = endSym;
                        break;
                }
            }

            // Read the lines next.
            bits.Position = begin;
            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                var endSym = bits.Position + siz;

                switch ((DEBUG_S_SUBSECTION)sig)
                {
                    case DEBUG_S_SUBSECTION.LINES:
                        {
                            CV_LineSection sec;

                            bits.ReadUInt32(out sec.off);
                            bits.ReadUInt16(out sec.sec);
                            bits.ReadUInt16(out sec.flags);
                            bits.ReadUInt32(out sec.cod);
                            var func = FindFunction(funcs, sec.sec, sec.off);
                            if (func == null)
                            {
                                break;
                            }

                            // Count the line blocks.
                            var begSym = bits.Position;
                            var blocks = 0;
                            while (bits.Position < endSym)
                            {
                                CV_SourceFile file;
                                bits.ReadUInt32(out file.index);
                                bits.ReadUInt32(out file.count);
                                bits.ReadUInt32(out file.linsiz); // Size of payload.
                                var linsiz = (int)file.count * (8 + ((sec.flags & 1) != 0 ? 4 : 0));
                                bits.Position += linsiz;
                                blocks++;
                            }

                            func.lines = new PdbLines[blocks];
                            var block = 0;

                            bits.Position = begSym;
                            while (bits.Position < endSym)
                            {
                                CV_SourceFile file;
                                bits.ReadUInt32(out file.index);
                                bits.ReadUInt32(out file.count);
                                bits.ReadUInt32(out file.linsiz); // Size of payload.

                                var src = (PdbSource)checks[(int)file.index];
                                var tmp = new PdbLines(src, file.count);
                                func.lines[block++] = tmp;
                                var lines = tmp.lines;

                                var plin = bits.Position;
                                var pcol = bits.Position + 8 * (int)file.count;

                                for (var i = 0; i < file.count; i++)
                                {
                                    CV_Line line;
                                    var column = new CV_Column();

                                    bits.Position = plin + 8 * i;
                                    bits.ReadUInt32(out line.offset);
                                    bits.ReadUInt32(out line.flags);

                                    var lineBegin = line.flags & (uint)CV_Line_Flags.linenumStart;
                                    var delta = (line.flags & (uint)CV_Line_Flags.deltaLineEnd) >> 24;
                                    var statement = (line.flags & (uint)CV_Line_Flags.fStatement) == 0;
                                    if ((sec.flags & 1) != 0)
                                    {
                                        bits.Position = pcol + 4 * i;
                                        bits.ReadUInt16(out column.offColumnStart);
                                        bits.ReadUInt16(out column.offColumnEnd);
                                    }

                                    lines[i] = new PdbLine(line.offset, lineBegin, column.offColumnStart, lineBegin + delta, column.offColumnEnd);
                                }
                            }

                            break;
                        }
                }

                bits.Position = endSym;
            }
        }
예제 #7
0
        /// <summary>
        /// </summary>
        /// <param name="bits">
        /// </param>
        /// <param name="info">
        /// </param>
        /// <param name="names">
        /// </param>
        /// <param name="funcList">
        /// </param>
        /// <param name="readStrings">
        /// </param>
        /// <param name="dir">
        /// </param>
        /// <param name="nameIndex">
        /// </param>
        /// <param name="reader">
        /// </param>
        /// <exception cref="PdbDebugException">
        /// </exception>
        private static void LoadFuncsFromDbiModule(
            BitAccess bits, 
            DbiModuleInfo info, 
            IntHashTable names, 
            ArrayList funcList, 
            bool readStrings, 
            MsfDirectory dir, 
            Dictionary<string, int> nameIndex, 
            PdbReader reader)
        {
            PdbFunction[] funcs = null;

            bits.Position = 0;
            int sig;
            bits.ReadInt32(out sig);
            if (sig != 4)
            {
                throw new PdbDebugException("Invalid signature. (sig={0})", sig);
            }

            bits.Position = 4;

            // Console.WriteLine("{0}:", info.moduleName);
            funcs = PdbFunction.LoadManagedFunctions(info.moduleName, bits, (uint)info.cbSyms, readStrings);
            if (funcs != null)
            {
                bits.Position = info.cbSyms + info.cbOldLines;
                LoadManagedLines(funcs, names, bits, dir, nameIndex, reader, (uint)(info.cbSyms + info.cbOldLines + info.cbLines));

                for (var i = 0; i < funcs.Length; i++)
                {
                    funcList.Add(funcs[i]);
                }
            }
        }
예제 #8
0
 /// <summary>
 /// </summary>
 /// <param name="hashtable">
 /// </param>
 internal IntHashTableEnumerator(IntHashTable hashtable)
 {
     this.hashtable = hashtable;
     this.bucket = hashtable.buckets.Length;
     this.version = hashtable.version;
     this.current = false;
 }