Ejemplo n.º 1
0
        /// <summary>
        /// </summary>
        /// <param name="bits">
        /// </param>
        /// <returns>
        /// </returns>
        /// <exception cref="PdbDebugException">
        /// </exception>
        private static Dictionary <string, int> LoadNameIndex(BitAccess bits)
        {
            var  result = new Dictionary <string, int>();
            int  ver;
            int  sig;
            int  age;
            Guid guid;

            bits.ReadInt32(out ver); // 0..3  Version
            bits.ReadInt32(out sig); // 4..7  Signature
            bits.ReadInt32(out age); // 8..11 Age
            bits.ReadGuid(out guid); // 12..27 GUID

            if (ver != 20000404)
            {
                throw new PdbDebugException("Unsupported PDB Stream version {0}", ver);
            }

            // Read string buffer.
            int buf;

            bits.ReadInt32(out buf); // 28..31 Bytes of Strings

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

            bits.Position = nxt;

            // Read map index.
            int cnt; // n+0..3 hash size.
            int max; // n+4..7 maximum ni.

            bits.ReadInt32(out cnt);
            bits.ReadInt32(out max);

            var present = new BitSet(bits);
            var deleted = new BitSet(bits);

            if (!deleted.IsEmpty)
            {
                throw new PdbDebugException("Unsupported PDB deleted bitset is not empty.");
            }

            var j = 0;

            for (var i = 0; i < max; i++)
            {
                if (present.IsSet(i))
                {
                    int ns;
                    int ni;
                    bits.ReadInt32(out ns);
                    bits.ReadInt32(out ni);

                    string name;
                    var    saved = bits.Position;
                    bits.Position = beg + ns;
                    bits.ReadCString(out name);
                    bits.Position = saved;

                    result.Add(name, ni);
                    j++;
                }
            }

            if (j != cnt)
            {
                throw new PdbDebugException("Count mismatch. ({0} != {1})", j, cnt);
            }

            return(result);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// </summary>
 /// <param name="bits">
 /// </param>
 /// <param name="doctype">
 /// </param>
 /// <param name="language">
 /// </param>
 /// <param name="vendor">
 /// </param>
 private static void LoadGuidStream(BitAccess bits, out Guid doctype, out Guid language, out Guid vendor)
 {
     bits.ReadGuid(out language);
     bits.ReadGuid(out vendor);
     bits.ReadGuid(out doctype);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// </summary>
        /// <param name="bits">
        /// </param>
        /// <returns>
        /// </returns>
        /// <exception cref="PdbDebugException">
        /// </exception>
        private static Dictionary<string, int> LoadNameIndex(BitAccess bits)
        {
            var result = new Dictionary<string, int>();
            int ver;
            int sig;
            int age;
            Guid guid;
            bits.ReadInt32(out ver); // 0..3  Version
            bits.ReadInt32(out sig); // 4..7  Signature
            bits.ReadInt32(out age); // 8..11 Age
            bits.ReadGuid(out guid); // 12..27 GUID

            if (ver != 20000404)
            {
                throw new PdbDebugException("Unsupported PDB Stream version {0}", ver);
            }

            // Read string buffer.
            int buf;
            bits.ReadInt32(out buf); // 28..31 Bytes of Strings

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

            bits.Position = nxt;

            // Read map index.
            int cnt; // n+0..3 hash size.
            int max; // n+4..7 maximum ni.

            bits.ReadInt32(out cnt);
            bits.ReadInt32(out max);

            var present = new BitSet(bits);
            var deleted = new BitSet(bits);
            if (!deleted.IsEmpty)
            {
                throw new PdbDebugException("Unsupported PDB deleted bitset is not empty.");
            }

            var j = 0;
            for (var i = 0; i < max; i++)
            {
                if (present.IsSet(i))
                {
                    int ns;
                    int ni;
                    bits.ReadInt32(out ns);
                    bits.ReadInt32(out ni);

                    string name;
                    var saved = bits.Position;
                    bits.Position = beg + ns;
                    bits.ReadCString(out name);
                    bits.Position = saved;

                    result.Add(name, ni);
                    j++;
                }
            }

            if (j != cnt)
            {
                throw new PdbDebugException("Count mismatch. ({0} != {1})", j, cnt);
            }

            return result;
        }
Ejemplo n.º 4
0
 /// <summary>
 /// </summary>
 /// <param name="bits">
 /// </param>
 /// <param name="doctype">
 /// </param>
 /// <param name="language">
 /// </param>
 /// <param name="vendor">
 /// </param>
 private static void LoadGuidStream(BitAccess bits, out Guid doctype, out Guid language, out Guid vendor)
 {
     bits.ReadGuid(out language);
     bits.ReadGuid(out vendor);
     bits.ReadGuid(out doctype);
 }
Ejemplo n.º 5
0
        /// <summary>
        /// </summary>
        /// <param name="module">
        /// </param>
        /// <param name="proc">
        /// </param>
        /// <param name="bits">
        /// </param>
        /// <exception cref="PdbDebugException">
        /// </exception>
        internal PdbFunction(string module, ManProcSym proc, BitAccess bits)
        {
            this.token = proc.token;
            this.module = module;
            this.name = proc.name;
            this.flags = proc.flags;
            this.segment = proc.seg;
            this.address = proc.off;
            this.length = proc.len;
            this.slotToken = 0;

            if (proc.seg != 1)
            {
                throw new PdbDebugException("Segment is {0}, not 1.", proc.seg);
            }

            if (proc.parent != 0 || proc.next != 0)
            {
                throw new PdbDebugException("Warning parent={0}, next={1}", proc.parent, proc.next);
            }

            if (proc.dbgStart != 0 || proc.dbgEnd != 0)
            {
                throw new PdbDebugException("Warning DBG start={0}, end={1}", proc.dbgStart, proc.dbgEnd);
            }

            int constantCount;
            int scopeCount;
            int slotCount;
            int usedNamespacesCount;
            CountScopesAndSlots(bits, proc.end, out constantCount, out scopeCount, out slotCount, out usedNamespacesCount);
            this.scopes = new PdbScope[scopeCount];
            var scope = 0;

            while (bits.Position < proc.end)
            {
                ushort siz;
                ushort rec;

                bits.ReadUInt16(out siz);
                var star = bits.Position;
                var stop = bits.Position + siz;
                bits.Position = star;
                bits.ReadUInt16(out rec);

                switch ((SYM)rec)
                {
                    case SYM.S_OEM:
                        {
                            // 0x0404
                            OemSymbol oem;

                            bits.ReadGuid(out oem.idOem);
                            bits.ReadUInt32(out oem.typind);

                            // internal byte[]   rgl;        // user data, force 4-byte alignment
                            if (oem.idOem == msilMetaData)
                            {
                                var name = bits.ReadString();
                                if (name == "MD2")
                                {
                                    byte version;
                                    bits.ReadUInt8(out version);
                                    if (version == 4)
                                    {
                                        byte count;
                                        bits.ReadUInt8(out count);
                                        bits.Align(4);
                                        while (count-- > 0)
                                        {
                                            this.ReadCustomMetadata(bits);
                                        }
                                    }
                                }

                                bits.Position = stop;
                                break;
                            }
                            else
                            {
                                throw new PdbDebugException("OEM section: guid={0} ti={1}", oem.idOem, oem.typind);

                                // bits.Position = stop;
                            }
                        }

                    case SYM.S_BLOCK32:
                        {
                            var block = new BlockSym32();

                            bits.ReadUInt32(out block.parent);
                            bits.ReadUInt32(out block.end);
                            bits.ReadUInt32(out block.len);
                            bits.ReadUInt32(out this.address);
                            bits.ReadUInt16(out block.seg);
                            bits.SkipCString(out block.name);
                            bits.Position = stop;

                            this.scopes[scope] = new PdbScope(block, bits, out this.slotToken);
                            bits.Position = (int)block.end;
                            break;
                        }

                    case SYM.S_UNAMESPACE:
                        bits.Position = stop;
                        break;

                    case SYM.S_END:
                        bits.Position = stop;
                        break;

                    default:
                        {
                            // throw new PdbDebugException("Unknown SYM: {0}", (SYM)rec);
                            bits.Position = stop;
                            break;
                        }
                }
            }

            if (bits.Position != proc.end)
            {
                throw new PdbDebugException("Not at S_END");
            }

            ushort esiz;
            ushort erec;
            bits.ReadUInt16(out esiz);
            bits.ReadUInt16(out erec);

            if (erec != (ushort)SYM.S_END)
            {
                throw new PdbDebugException("Missing S_END");
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// </summary>
        /// <param name="module">
        /// </param>
        /// <param name="proc">
        /// </param>
        /// <param name="bits">
        /// </param>
        /// <exception cref="PdbDebugException">
        /// </exception>
        internal PdbFunction(string module, ManProcSym proc, BitAccess bits)
        {
            this.token     = proc.token;
            this.module    = module;
            this.name      = proc.name;
            this.flags     = proc.flags;
            this.segment   = proc.seg;
            this.address   = proc.off;
            this.length    = proc.len;
            this.slotToken = 0;

            if (proc.seg != 1)
            {
                throw new PdbDebugException("Segment is {0}, not 1.", proc.seg);
            }

            if (proc.parent != 0 || proc.next != 0)
            {
                throw new PdbDebugException("Warning parent={0}, next={1}", proc.parent, proc.next);
            }

            if (proc.dbgStart != 0 || proc.dbgEnd != 0)
            {
                throw new PdbDebugException("Warning DBG start={0}, end={1}", proc.dbgStart, proc.dbgEnd);
            }

            int constantCount;
            int scopeCount;
            int slotCount;
            int usedNamespacesCount;

            CountScopesAndSlots(bits, proc.end, out constantCount, out scopeCount, out slotCount, out usedNamespacesCount);
            this.scopes = new PdbScope[scopeCount];
            var scope = 0;

            while (bits.Position < proc.end)
            {
                ushort siz;
                ushort rec;

                bits.ReadUInt16(out siz);
                var star = bits.Position;
                var stop = bits.Position + siz;
                bits.Position = star;
                bits.ReadUInt16(out rec);

                switch ((SYM)rec)
                {
                case SYM.S_OEM:
                {
                    // 0x0404
                    OemSymbol oem;

                    bits.ReadGuid(out oem.idOem);
                    bits.ReadUInt32(out oem.typind);

                    // internal byte[]   rgl;        // user data, force 4-byte alignment
                    if (oem.idOem == msilMetaData)
                    {
                        var name = bits.ReadString();
                        if (name == "MD2")
                        {
                            byte version;
                            bits.ReadUInt8(out version);
                            if (version == 4)
                            {
                                byte count;
                                bits.ReadUInt8(out count);
                                bits.Align(4);
                                while (count-- > 0)
                                {
                                    this.ReadCustomMetadata(bits);
                                }
                            }
                        }

                        bits.Position = stop;
                        break;
                    }
                    else
                    {
                        throw new PdbDebugException("OEM section: guid={0} ti={1}", oem.idOem, oem.typind);

                        // bits.Position = stop;
                    }
                }

                case SYM.S_BLOCK32:
                {
                    var block = new BlockSym32();

                    bits.ReadUInt32(out block.parent);
                    bits.ReadUInt32(out block.end);
                    bits.ReadUInt32(out block.len);
                    bits.ReadUInt32(out this.address);
                    bits.ReadUInt16(out block.seg);
                    bits.SkipCString(out block.name);
                    bits.Position = stop;

                    this.scopes[scope] = new PdbScope(block, bits, out this.slotToken);
                    bits.Position      = (int)block.end;
                    break;
                }

                case SYM.S_UNAMESPACE:
                    bits.Position = stop;
                    break;

                case SYM.S_END:
                    bits.Position = stop;
                    break;

                default:
                {
                    // throw new PdbDebugException("Unknown SYM: {0}", (SYM)rec);
                    bits.Position = stop;
                    break;
                }
                }
            }

            if (bits.Position != proc.end)
            {
                throw new PdbDebugException("Not at S_END");
            }

            ushort esiz;
            ushort erec;

            bits.ReadUInt16(out esiz);
            bits.ReadUInt16(out erec);

            if (erec != (ushort)SYM.S_END)
            {
                throw new PdbDebugException("Missing S_END");
            }
        }