Ejemplo n.º 1
0
    internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits) {
      bits.MinCapacity(head.directorySize);
      int pages = reader.PagesFromSize(head.directorySize);

      // 0..n in page of directory pages.
      reader.Seek(head.directoryRoot, 0);
      bits.FillBuffer(reader.reader, pages * 4);

      DataStream stream = new DataStream(head.directorySize, bits, pages);
      bits.MinCapacity(head.directorySize);
      stream.Read(reader, bits);

      // 0..3 in directory pages
      int count;
      bits.ReadInt32(out count);

      // 4..n
      int[] sizes = new int[count];
      bits.ReadInt32(sizes);

      // n..m
      streams = new DataStream[count];
      for (int i = 0; i < count; i++) {
        if (sizes[i] <= 0) {
          streams[i] = new DataStream();
        } else {
          streams[i] = new DataStream(sizes[i], bits,
                                      reader.PagesFromSize(sizes[i]));
        }
      }
    }
Ejemplo n.º 2
0
    static Dictionary<string, int> LoadNameIndex(BitAccess bits) {
      Dictionary<string, int> 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

      int beg = bits.Position;
      int 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);

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

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

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

          result.Add(name.ToUpperInvariant(), ni);
          j++;
        }
      }
      if (j != cnt) {
        throw new PdbDebugException("Count mismatch. ({0} != {1})", j, cnt);
      }
      return result;
    }
Ejemplo n.º 3
0
 internal DataStream(int contentSize, BitAccess bits, int count) {
   this.contentSize = contentSize;
   if (count > 0) {
     this.pages = new int[count];
     bits.ReadInt32(this.pages);
   }
 }
Ejemplo n.º 4
0
 internal DbiModuleInfo(BitAccess bits, bool readStrings) {
   bits.ReadInt32(out opened);
   section = new DbiSecCon(bits);
   bits.ReadUInt16(out flags);
   bits.ReadInt16(out stream);
   bits.ReadInt32(out cbSyms);
   bits.ReadInt32(out cbOldLines);
   bits.ReadInt32(out cbLines);
   bits.ReadInt16(out files);
   bits.ReadInt16(out pad1);
   bits.ReadUInt32(out offsets);
   bits.ReadInt32(out niSource);
   bits.ReadInt32(out niCompiler);
   if (readStrings) {
     bits.ReadCString(out moduleName);
     bits.ReadCString(out objectName);
   } else {
     bits.SkipCString(out moduleName);
     bits.SkipCString(out objectName);
   }
   bits.Align(4);
   //if (opened != 0 || pad1 != 0) {
   //  throw new PdbException("Invalid DBI module. "+
   //                                 "(opened={0}, pad={1})", opened, pad1);
   //}
 }
Ejemplo n.º 5
0
        internal static PdbFunction[] LoadFunctions(Stream read, out Dictionary<uint, PdbTokenLine> tokenToSourceMapping)
        {
            tokenToSourceMapping = new Dictionary<uint, PdbTokenLine>();
              BitAccess bits = new BitAccess(512 * 1024);
              PdbFileHeader head = new PdbFileHeader(read, bits);
              PdbReader reader = new PdbReader(read, head.pageSize);
              MsfDirectory dir = new MsfDirectory(reader, head, bits);
              DbiModuleInfo[] modules = null;
              DbiDbgHdr header;

              dir.streams[1].Read(reader, bits);
              Dictionary<string, int> nameIndex = LoadNameIndex(bits);
              int nameStream;
              if (!nameIndex.TryGetValue("/NAMES", out nameStream)) {
            throw new PdbException("No `name' stream");
              }

              dir.streams[nameStream].Read(reader, bits);
              IntHashTable names = LoadNameStream(bits);

              dir.streams[3].Read(reader, bits);
              LoadDbiStream(bits, out modules, out header, true);

              ArrayList funcList = new ArrayList();

              if (modules != null) {
            for (int m = 0; m < modules.Length; m++) {
              var module = modules[m];
              if (module.stream > 0) {
            dir.streams[module.stream].Read(reader, bits);
            if (module.moduleName == "TokenSourceLineInfo") {
              LoadTokenToSourceInfo(bits, module, names, dir, nameIndex, reader, tokenToSourceMapping);
              continue;
            }
            LoadFuncsFromDbiModule(bits, module, names, funcList, true, dir, nameIndex, reader);
              }
            }
              }

              PdbFunction[] funcs = (PdbFunction[])funcList.ToArray(typeof(PdbFunction));

              // After reading the functions, apply the token remapping table if it exists.
              if (header.snTokenRidMap != 0 && header.snTokenRidMap != 0xffff) {
            dir.streams[header.snTokenRidMap].Read(reader, bits);
            uint[] ridMap = new uint[dir.streams[header.snTokenRidMap].Length / 4];
            bits.ReadUInt32(ridMap);

            foreach (PdbFunction func in funcs) {
              func.token = 0x06000000 | ridMap[func.token & 0xffffff];
            }
              }

              //
              Array.Sort(funcs, PdbFunction.byAddressAndToken);
              //Array.Sort(funcs, PdbFunction.byToken);
              return funcs;
        }
Ejemplo n.º 6
0
    internal void Write(Stream writer, BitAccess bits) {
      bits.MinCapacity(56);
      bits.WriteBytes(magic);                     //   0..31
      bits.WriteInt32(pageSize);                  //  32..35
      bits.WriteInt32(freePageMap);               //  36..39
      bits.WriteInt32(pagesUsed);                 //  40..43
      bits.WriteInt32(directorySize);             //  44..47
      bits.WriteInt32(zero);                      //  48..51
      bits.WriteInt32(directoryRoot);             //  52..55

      writer.Seek(0, SeekOrigin.Begin);
      bits.WriteBuffer(writer, 56);
    }
Ejemplo n.º 7
0
 internal DbiDbgHdr(BitAccess bits) {
   bits.ReadUInt16(out snFPO);
   bits.ReadUInt16(out snException);
   bits.ReadUInt16(out snFixup);
   bits.ReadUInt16(out snOmapToSrc);
   bits.ReadUInt16(out snOmapFromSrc);
   bits.ReadUInt16(out snSectionHdr);
   bits.ReadUInt16(out snTokenRidMap);
   bits.ReadUInt16(out snXdata);
   bits.ReadUInt16(out snPdata);
   bits.ReadUInt16(out snNewFPO);
   bits.ReadUInt16(out snSectionHdrOrig);
 }
Ejemplo n.º 8
0
        internal static PdbFunction[] LoadFunctions(Stream read, BitAccess bits, bool readAllStrings)
        {
            PdbFileHeader head = new PdbFileHeader(read, bits);
              PdbReader reader = new PdbReader(read, head.PageSize);
              MsfDirectory dir = new MsfDirectory(reader, head, bits);
              DbiModuleInfo[] modules;
              DbiDbgHdr header;

              dir.streams[1].Read(reader, bits);
              Dictionary<string, int> nameIndex = LoadNameIndex(bits);
              int nameStream;
              if (!nameIndex.TryGetValue("/names", out nameStream)) {
            throw new PdbException("No `name' stream");
              }

              dir.streams[nameStream].Read(reader, bits);
              IntHashTable names = LoadNameStream(bits);

              dir.streams[3].Read(reader, bits);
              LoadDbiStream(bits, out modules, out header, readAllStrings);

              ArrayList funcList = new ArrayList();

              if (modules != null) {
            for (int m = 0; m < modules.Length; m++) {
              if (modules[m].stream > 0) {
            dir.streams[modules[m].stream].Read(reader, bits);
            LoadFuncsFromDbiModule(bits, modules[m], names, funcList,
                                   readAllStrings, dir, nameIndex, reader);
              }
            }
              }

              PdbFunction[] funcs = (PdbFunction[])funcList.ToArray(typeof(PdbFunction));

              // After reading the functions, apply the token remapping table if it exists.
              if (header.snTokenRidMap != 0 && header.snTokenRidMap != 0xffff) {
            dir.streams[header.snTokenRidMap].Read(reader, bits);
            uint[] ridMap = new uint[dir.streams[header.snTokenRidMap].Length / 4];
            bits.ReadUInt32(ridMap);

            foreach (PdbFunction func in funcs) {
              func.Token = 0x06000000 | ridMap[func.Token & 0xffffff];
            }
              }

              //
              Array.Sort(funcs, PdbFunction.ByAddress);
              //Array.Sort(funcs, PdbFunction.byToken);
              return funcs;
        }
Ejemplo n.º 9
0
    internal PdbFileHeader(Stream reader, BitAccess bits) {
      bits.MinCapacity(56);
      reader.Seek(0, SeekOrigin.Begin);
      bits.FillBuffer(reader, 56);

      this.magic = new byte[32];
      bits.ReadBytes(this.magic);                 //   0..31
      bits.ReadInt32(out this.pageSize);          //  32..35
      bits.ReadInt32(out this.freePageMap);       //  36..39
      bits.ReadInt32(out this.pagesUsed);         //  40..43
      bits.ReadInt32(out this.directorySize);     //  44..47
      bits.ReadInt32(out this.zero);              //  48..51
      bits.ReadInt32(out this.directoryRoot);     //  52..55
    }
Ejemplo n.º 10
0
    internal void WriteMeta(DataStream[] streams, BitAccess bits) {
      PdbFileHeader head = new PdbFileHeader(pageSize);

      WriteDirectory(streams,
                     out head.directoryRoot,
                     out head.directorySize,
                     bits);
      WriteFreeMap();

      head.freePageMap = 2;
      head.pagesUsed = usedBytes / pageSize;

      writer.Seek(0, SeekOrigin.Begin);
      head.Write(writer, bits);
    }
Ejemplo n.º 11
0
 internal DbiSecCon(BitAccess bits) {
   bits.ReadInt16(out section);
   bits.ReadInt16(out pad1);
   bits.ReadInt32(out offset);
   bits.ReadInt32(out size);
   bits.ReadUInt32(out flags);
   bits.ReadInt16(out module);
   bits.ReadInt16(out pad2);
   bits.ReadUInt32(out dataCrc);
   bits.ReadUInt32(out relocCrc);
   //if (pad1 != 0 || pad2 != 0) {
   //  throw new PdbException("Invalid DBI section. "+
   //                                 "(pad1={0}, pad2={1})",
   //                         pad1, pad2);
   //}
 }
Ejemplo n.º 12
0
    static void LoadInjectedSourceInformation(BitAccess bits, out Guid doctype, out Guid language, out Guid vendor, out Guid checksumAlgo, out byte[] checksum) {
      int checksumSize;
      int injectedSourceSize;
      checksum = null;

      bits.ReadGuid(out language);
      bits.ReadGuid(out vendor);
      bits.ReadGuid(out doctype);
      bits.ReadGuid(out checksumAlgo);
      bits.ReadInt32(out checksumSize);
      bits.ReadInt32(out injectedSourceSize);

      if (checksumSize > 0) {
          checksum = new byte[checksumSize];
          bits.ReadBytes(checksum);
      }
    }
Ejemplo n.º 13
0
    internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits)
    {
      int pages = reader.PagesFromSize(head.directorySize);

      // 0..n in page of directory pages.
      bits.MinCapacity(head.directorySize);
      int directoryRootPages = head.directoryRoot.Length;
      int pagesPerPage = head.pageSize / 4;
      int pagesToGo = pages;
      for (int i = 0; i < directoryRootPages; i++)
      {
        int pagesInThisPage = pagesToGo <= pagesPerPage ? pagesToGo : pagesPerPage;
        reader.Seek(head.directoryRoot[i], 0);
        bits.Append(reader.reader, pagesInThisPage * 4);
        pagesToGo -= pagesInThisPage;
      }
      bits.Position = 0;

      DataStream stream = new DataStream(head.directorySize, bits, pages);
      bits.MinCapacity(head.directorySize);
      stream.Read(reader, bits);

      // 0..3 in directory pages
      int count;
      bits.ReadInt32(out count);

      // 4..n
      int[] sizes = new int[count];
      bits.ReadInt32(sizes);

      // n..m
      streams = new DataStream[count];
      for (int i = 0; i < count; i++)
      {
        if (sizes[i] <= 0)
        {
          streams[i] = new DataStream();
        }
        else
        {
          streams[i] = new DataStream(sizes[i], bits,
                                      reader.PagesFromSize(sizes[i]));
        }
      }
    }
Ejemplo n.º 14
0
    static IntHashTable LoadNameStream(BitAccess bits) {
      IntHashTable 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);
      }
      int beg = bits.Position;
      int 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 (int i = 0; i < siz; i++) {
        int ni;
        string name;

        bits.ReadInt32(out ni);

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

          ht.Add(ni, name);
        }
      }
      bits.Position = nxt;

      return ht;
    }
Ejemplo n.º 15
0
    //internal uint segment;
    //internal uint address;

    internal PdbSlot(BitAccess bits) {
      AttrSlotSym slot;

      bits.ReadUInt32(out slot.index);
      bits.ReadUInt32(out slot.typind);
      bits.ReadUInt32(out slot.offCod);
      bits.ReadUInt16(out slot.segCod);
      bits.ReadUInt16(out slot.flags);
      bits.ReadCString(out slot.name);

      this.slot = slot.index;
      this.typeToken = slot.typind;
      this.name = slot.name;
      this.flags = slot.flags;
      //this.segment = slot.segCod;
      //this.address = slot.offCod;

    }
Ejemplo n.º 16
0
        internal PdbSlot(BitAccess bits, out uint typind)
        {
            AttrSlotSym slot;

            bits.ReadUInt32(out slot.index);
            bits.ReadUInt32(out slot.typind);
            bits.ReadUInt32(out slot.offCod);
            bits.ReadUInt16(out slot.segCod);
            bits.ReadUInt16(out slot.flags);
            bits.ReadCString(out slot.name);

            this.Slot = slot.index;
            this.Name = slot.name;
            this.Flags = slot.flags;
            this.Segment = slot.segCod;
            this.Address = slot.offCod;

            typind = slot.typind;
        }
Ejemplo n.º 17
0
        internal PdbFileHeader(Stream reader, BitAccess bits)
        {
            bits.MinCapacity(56);
              reader.Seek(0, SeekOrigin.Begin);
              bits.FillBuffer(reader, 52);

              this.magic = new byte[32];
              bits.ReadBytes(this.magic);                 //   0..31
              bits.ReadInt32(out this.pageSize);          //  32..35
              bits.ReadInt32(out this.freePageMap);       //  36..39
              bits.ReadInt32(out this.pagesUsed);         //  40..43
              bits.ReadInt32(out this.directorySize);     //  44..47
              bits.ReadInt32(out this.zero);              //  48..51

              if (Magic != MAGIC) {
            throw new InvalidOperationException("Magic is wrong.");
              }
              int directoryPages = ((((directorySize + pageSize - 1) / pageSize) * 4) + pageSize - 1) / pageSize;
              this.directoryRoot = new int[directoryPages];
              bits.FillBuffer(reader, directoryPages * 4);
              bits.ReadInt32(this.directoryRoot);
        }
Ejemplo n.º 18
0
 internal DbiHeader(BitAccess bits) {
   bits.ReadInt32(out sig);
   bits.ReadInt32(out ver);
   bits.ReadInt32(out age);
   bits.ReadInt16(out gssymStream);
   bits.ReadUInt16(out vers);
   bits.ReadInt16(out pssymStream);
   bits.ReadUInt16(out pdbver);
   bits.ReadInt16(out symrecStream);
   bits.ReadUInt16(out pdbver2);
   bits.ReadInt32(out gpmodiSize);
   bits.ReadInt32(out secconSize);
   bits.ReadInt32(out secmapSize);
   bits.ReadInt32(out filinfSize);
   bits.ReadInt32(out tsmapSize);
   bits.ReadInt32(out mfcIndex);
   bits.ReadInt32(out dbghdrSize);
   bits.ReadInt32(out ecinfoSize);
   bits.ReadUInt16(out flags);
   bits.ReadUInt16(out machine);
   bits.ReadInt32(out reserved);
 }
Ejemplo n.º 19
0
    private void WriteDirectory(DataStream[] streams,
                                out int directoryRoot,
                                out int directorySize,
                                BitAccess bits) {
      DataStream directory = new DataStream();

      int pages = 0;
      for (int s = 0; s < streams.Length; s++) {
        if (streams[s].Length > 0) {
          pages += streams[s].Pages;
        }
      }

      int use = 4 * (1 + streams.Length + pages);
      bits.MinCapacity(use);
      bits.WriteInt32(streams.Length);
      for (int s = 0; s < streams.Length; s++) {
        bits.WriteInt32(streams[s].Length);
      }
      for (int s = 0; s < streams.Length; s++) {
        if (streams[s].Length > 0) {
          bits.WriteInt32(streams[s].pages);
        }
      }
      directory.Write(this, bits.Buffer, use);
      directorySize = directory.Length;

      use = 4 * directory.Pages;
      bits.MinCapacity(use);
      bits.WriteInt32(directory.pages);

      DataStream ddir = new DataStream();
      ddir.Write(this, bits.Buffer, use);

      directoryRoot = ddir.pages[0];
    }
Ejemplo n.º 20
0
        private static IntHashTable ReadSourceFileInfo(BitAccess bits, uint limit, IntHashTable names, MsfDirectory dir,
                                                       Dictionary <string, int> nameIndex, PdbReader reader, Dictionary <string, PdbSource> sourceCache)
        {
            IntHashTable checks = new IntHashTable();

            int begin = bits.Position;

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

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

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

                        string name = (string)names[(int)chk.name];

                        PdbSource src;
                        if (!sourceCache.TryGetValue(name, out src))
                        {
                            int  guidStream;
                            Guid doctypeGuid  = SymDocumentType.Text;
                            Guid languageGuid = Guid.Empty;
                            Guid vendorGuid   = Guid.Empty;
                            if (nameIndex.TryGetValue("/SRC/FILES/" + name.ToUpperInvariant(), out guidStream))
                            {
                                var guidBits = new BitAccess(0x100);
                                dir.streams[guidStream].Read(reader, guidBits);
                                LoadGuidStream(guidBits, out doctypeGuid, out languageGuid, out vendorGuid);
                            }

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

                default:
                    bits.Position = endSym;
                    break;
                }
            }
            return(checks);
        }
Ejemplo n.º 21
0
        private static void LoadTokenToSourceInfo(BitAccess bits, DbiModuleInfo module, IntHashTable names, MsfDirectory dir,
                                                  Dictionary <string, int> nameIndex, PdbReader reader, Dictionary <uint, PdbTokenLine> tokenToSourceMapping,
                                                  Dictionary <string, PdbSource> sourceCache)
        {
            bits.Position = 0;
            int sig;

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

            bits.Position = 4;

            while (bits.Position < module.cbSyms)
            {
                ushort siz;
                ushort rec;

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

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

                    bits.ReadGuid(out oem.idOem);
                    bits.ReadUInt32(out oem.typind);
                    // internal byte[]   rgl;        // user data, force 4-byte alignment

                    if (oem.idOem == PdbFunction.msilMetaData)
                    {
                        string name = bits.ReadString();
                        if (name == "TSLI")
                        {
                            uint token;
                            uint file_id;
                            uint line;
                            uint column;
                            uint endLine;
                            uint endColumn;
                            bits.ReadUInt32(out token);
                            bits.ReadUInt32(out file_id);
                            bits.ReadUInt32(out line);
                            bits.ReadUInt32(out column);
                            bits.ReadUInt32(out endLine);
                            bits.ReadUInt32(out endColumn);
                            PdbTokenLine tokenLine;
                            if (!tokenToSourceMapping.TryGetValue(token, out tokenLine))
                            {
                                tokenToSourceMapping.Add(token, new PdbTokenLine(token, file_id, line, column, endLine, endColumn));
                            }
                            else
                            {
                                while (tokenLine.nextLine != null)
                                {
                                    tokenLine = tokenLine.nextLine;
                                }
                                tokenLine.nextLine = new PdbTokenLine(token, file_id, line, column, endLine, endColumn);
                            }
                        }
                        bits.Position = stop;
                        break;
                    }
                    else
                    {
                        throw new PdbDebugException("OEM section: guid={0} ti={1}",
                                                    oem.idOem, oem.typind);
                        // bits.Position = stop;
                    }

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

                default:
                    //Console.WriteLine("{0,6}: {1:x2} {2}",
                    //                  bits.Position, rec, (SYM)rec);
                    bits.Position = stop;
                    break;
                }
            }

            bits.Position = module.cbSyms + module.cbOldLines;
            int          limit       = module.cbSyms + module.cbOldLines + module.cbLines;
            IntHashTable sourceFiles = ReadSourceFileInfo(bits, (uint)limit, names, dir, nameIndex, reader, sourceCache);

            foreach (var tokenLine in tokenToSourceMapping.Values)
            {
                tokenLine.sourceFile = (PdbSource)sourceFiles[(int)tokenLine.file_id];
            }
        }
Ejemplo n.º 22
0
        internal static uint[] LoadRemapTable(Stream read)
        {
            //tokenToSourceMapping = new Dictionary<uint, PdbTokenLine>();
            BitAccess     bits   = new BitAccess(512 * 1024);
            PdbFileHeader head   = new PdbFileHeader(read, bits);
            PdbReader     reader = new PdbReader(read, head.pageSize);
            MsfDirectory  dir    = new MsfDirectory(reader, head, bits);

            DbiModuleInfo[] modules = null;
            DbiDbgHdr       header;

            dir.streams[1].Read(reader, bits);
            Dictionary <string, int> nameIndex = LoadNameIndex(bits);
            int nameStream;

            if (!nameIndex.TryGetValue("/NAMES", out nameStream))
            {
                throw new PdbDebugException("No `name' stream");
            }
            dir.streams[nameStream].Read(reader, bits);
            IntHashTable names = LoadNameStream(bits);

            int    srcsrvStream;
            string sourceServerData;

            if (!nameIndex.TryGetValue("SRCSRV", out srcsrvStream))
            {
                sourceServerData = string.Empty;
            }
            else
            {
                DataStream dataStream = dir.streams[srcsrvStream];
                byte[]     bytes      = new byte[dataStream.contentSize];
                dataStream.Read(reader, bits);
                sourceServerData = bits.ReadBString(bytes.Length);
            }

            dir.streams[3].Read(reader, bits);
            LoadDbiStream(bits, out modules, out header, true);

#if SKIP_THIS
            ArrayList funcList = new ArrayList();

            if (modules != null)
            {
                for (int m = 0; m < modules.Length; m++)
                {
                    var module = modules[m];
                    if (module.stream > 0)
                    {
                        dir.streams[module.stream].Read(reader, bits);
                        if (module.moduleName == "TokenSourceLineInfo")
                        {
                            LoadTokenToSourceInfo(bits, module, names, dir, nameIndex, reader, tokenToSourceMapping);
                            continue;
                        }
                        LoadFuncsFromDbiModule(bits, module, names, funcList, true, dir, nameIndex, reader, ilreader);
                    }
                }
            }

            PdbFunction[] funcs = (PdbFunction[])funcList.ToArray(typeof(PdbFunction));
#endif

            // After reading the functions, apply the token remapping table if it exists.
            if (header.snTokenRidMap != 0 && header.snTokenRidMap != 0xffff)
            {
                uint[] ridMap = new uint[dir.streams[header.snTokenRidMap].Length / 4];
                dir.streams[header.snTokenRidMap].Read(reader, bits);
                bits.ReadUInt32(ridMap);
                return(ridMap);
            }
            return(null);
        }
Ejemplo n.º 23
0
        static Dictionary <string, int> LoadNameIndex(BitAccess bits)
        {
            Dictionary <string, int> 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

            int beg = bits.Position;
            int 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);

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

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

            int j = 0;

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

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

                    result.Add(name.ToUpperInvariant(), ni);
                    j++;
                }
            }
            if (j != cnt)
            {
                throw new PdbDebugException("Count mismatch. ({0} != {1})", j, cnt);
            }
            return(result);
        }
Ejemplo n.º 24
0
        static void LoadManagedLines(PdbFunction[] funcs,
                                     IntHashTable names,
                                     BitAccess bits,
                                     MsfDirectory dir,
                                     Dictionary <string, int> nameIndex,
                                     PdbReader reader,
                                     uint limit)
        {
            Array.Sort(funcs, PdbFunction.byAddressAndToken);
            IntHashTable checks = new IntHashTable();

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

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

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

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

                        string name = (string)names[(int)chk.name];
                        int    guidStream;
                        Guid   doctypeGuid  = SymDocumentType.Text;
                        Guid   languageGuid = Guid.Empty;
                        Guid   vendorGuid   = Guid.Empty;
                        if (nameIndex.TryGetValue("/SRC/FILES/" + name.ToUpperInvariant(), out guidStream))
                        {
                            var guidBits = new BitAccess(0x100);
                            dir.streams[guidStream].Read(reader, guidBits);
                            LoadGuidStream(guidBits, out doctypeGuid, out languageGuid, out vendorGuid);
                        }

                        PdbSource 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);
                int 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);
                    int funcIndex = FindFunction(funcs, sec.sec, sec.off);
                    if (funcIndex < 0)
                    {
                        break;
                    }
                    var func = funcs[funcIndex];
                    if (func.lines == null)
                    {
                        while (funcIndex > 0)
                        {
                            var f = funcs[funcIndex - 1];
                            if (f.lines != null || f.segment != sec.sec || f.address != sec.off)
                            {
                                break;
                            }
                            func = f;
                            funcIndex--;
                        }
                    }
                    else
                    {
                        while (funcIndex < funcs.Length - 1 && func.lines != null)
                        {
                            var f = funcs[funcIndex + 1];
                            if (f.segment != sec.sec || f.address != sec.off)
                            {
                                break;
                            }
                            func = f;
                            funcIndex++;
                        }
                    }
                    if (func.lines != null)
                    {
                        break;
                    }

                    // Count the line blocks.
                    int begSym = bits.Position;
                    int 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.
                        int linsiz = (int)file.count * (8 + ((sec.flags & 1) != 0 ? 4 : 0));
                        bits.Position += linsiz;
                        blocks++;
                    }

                    func.lines = new PdbLines[blocks];
                    int 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.

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

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

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

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

                            uint lineBegin = line.flags & (uint)CV_Line_Flags.linenumStart;
                            uint delta     = (line.flags & (uint)CV_Line_Flags.deltaLineEnd) >> 24;
                            //bool 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;
            }
        }
Ejemplo n.º 25
0
        internal static PdbInfo LoadFunctions(Stream read)
        {
            PdbInfo pdbInfo = new PdbInfo();

            pdbInfo.TokenToSourceMapping = new Dictionary <uint, PdbTokenLine>();
            BitAccess     bits   = new BitAccess(64 * 1024);
            PdbFileHeader head   = new PdbFileHeader(read, bits);
            PdbReader     reader = new PdbReader(read, head.pageSize);
            MsfDirectory  dir    = new MsfDirectory(reader, head, bits);

            DbiModuleInfo[] modules = null;
            DbiDbgHdr       header;
            Dictionary <string, PdbSource> sourceCache = new Dictionary <string, PdbSource>();

            dir.streams[1].Read(reader, bits);
            Dictionary <string, int> nameIndex = LoadNameIndex(bits, out pdbInfo.Age, out pdbInfo.Guid);
            int nameStream;

            if (!nameIndex.TryGetValue("/NAMES", out nameStream))
            {
                throw new PdbException("Could not find the '/NAMES' stream: the PDB file may be a public symbol file instead of a private symbol file");
            }
            dir.streams[nameStream].Read(reader, bits);
            IntHashTable names = LoadNameStream(bits);

            int srcsrvStream;

            if (!nameIndex.TryGetValue("SRCSRV", out srcsrvStream))
            {
                pdbInfo.SourceServerData = string.Empty;
            }
            else
            {
                DataStream dataStream = dir.streams[srcsrvStream];
                byte[]     bytes      = new byte[dataStream.contentSize];
                dataStream.Read(reader, bits);
                pdbInfo.SourceServerData = bits.ReadBString(bytes.Length);
            }

            int sourceLinkStream;

            if (nameIndex.TryGetValue("SOURCELINK", out sourceLinkStream))
            {
                DataStream dataStream = dir.streams[sourceLinkStream];
                pdbInfo.SourceLinkData = new byte[dataStream.contentSize];
                dataStream.Read(reader, bits);
                bits.ReadBytes(pdbInfo.SourceLinkData);
            }

            dir.streams[3].Read(reader, bits);
            LoadDbiStream(bits, out modules, out header, true);

            List <PdbFunction> funcList = new List <PdbFunction>();

            if (modules != null)
            {
                for (int m = 0; m < modules.Length; m++)
                {
                    var module = modules[m];
                    if (module.stream > 0)
                    {
                        dir.streams[module.stream].Read(reader, bits);
                        if (module.moduleName == "TokenSourceLineInfo")
                        {
                            LoadTokenToSourceInfo(bits, module, names, dir, nameIndex, reader, pdbInfo.TokenToSourceMapping, sourceCache);
                            continue;
                        }
                        LoadFuncsFromDbiModule(bits, module, names, funcList, true, dir, nameIndex, reader, sourceCache);
                    }
                }
            }

            PdbFunction[] funcs = funcList.ToArray();

            // After reading the functions, apply the token remapping table if it exists.
            if (header.snTokenRidMap != 0 && header.snTokenRidMap != 0xffff)
            {
                dir.streams[header.snTokenRidMap].Read(reader, bits);
                uint[] ridMap = new uint[dir.streams[header.snTokenRidMap].Length / 4];
                bits.ReadUInt32(ridMap);

                foreach (PdbFunction func in funcs)
                {
                    func.token = 0x06000000 | ridMap[func.token & 0xffffff];
                }
            }

            //
            Array.Sort(funcs, PdbFunction.byAddressAndToken);
            //Array.Sort(funcs, PdbFunction.byToken);
            pdbInfo.Functions = funcs;
            return(pdbInfo);
        }
Ejemplo n.º 26
0
        internal PdbScope(uint funcOffset, BlockSym32 block, BitAccess bits, out uint typind)
        {
            //this.segment = block.seg;
            this.address = block.off;
            this.offset  = block.off - funcOffset;
            this.length  = block.len;
            typind       = 0;

            int constantCount;
            int scopeCount;
            int slotCount;
            int namespaceCount;

            PdbFunction.CountScopesAndSlots(bits, block.end, out constantCount, out scopeCount, out slotCount, out namespaceCount);
            constants      = new PdbConstant[constantCount];
            scopes         = new PdbScope[scopeCount];
            slots          = new PdbSlot[slotCount];
            usedNamespaces = new string[namespaceCount];
            int constant = 0;
            int scope    = 0;
            int slot     = 0;
            int usedNs   = 0;

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

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

                switch ((SYM)rec)
                {
                case SYM.S_BLOCK32:
                {
                    BlockSym32 sub = new BlockSym32();

                    bits.ReadUInt32(out sub.parent);
                    bits.ReadUInt32(out sub.end);
                    bits.ReadUInt32(out sub.len);
                    bits.ReadUInt32(out sub.off);
                    bits.ReadUInt16(out sub.seg);
                    bits.SkipCString(out sub.name);

                    bits.Position   = stop;
                    scopes[scope++] = new PdbScope(funcOffset, sub, bits, out typind);
                    break;
                }

                case SYM.S_MANSLOT:
                    slots[slot++] = new PdbSlot(bits);
                    bits.Position = stop;
                    break;

                case SYM.S_UNAMESPACE:
                    bits.ReadCString(out usedNamespaces[usedNs++]);
                    bits.Position = stop;
                    break;

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

                case SYM.S_MANCONSTANT:
                    constants[constant++] = new PdbConstant(bits);
                    bits.Position         = stop;
                    break;

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

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

            ushort esiz;
            ushort erec;

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

            if (erec != (ushort)SYM.S_END)
            {
                throw new Exception("Missing S_END");
            }
        }
Ejemplo n.º 27
0
 private void ReadIteratorLocals(BitAccess bits) {
   uint numberOfLocals;
   bits.ReadUInt32(out numberOfLocals);
   this.iteratorScopes = new List<ILocalScope>((int)numberOfLocals);
   while (numberOfLocals-- > 0) {
     uint ilStartOffset;
     uint ilEndOffset;
     bits.ReadUInt32(out ilStartOffset);
     bits.ReadUInt32(out ilEndOffset);
     this.iteratorScopes.Add(new PdbIteratorScope(ilStartOffset, ilEndOffset-ilStartOffset));
   }
 }
Ejemplo n.º 28
0
 private void ReadCustomMetadata(BitAccess bits) {
   int savedPosition = bits.Position;
   byte version;
   bits.ReadUInt8(out version);
   if (version != 4) {
     throw new PdbDebugException("Unknown custom metadata item version: {0}", version);
   }
   byte kind;
   bits.ReadUInt8(out kind);
   bits.Align(4);
   uint numberOfBytesInItem;
   bits.ReadUInt32(out numberOfBytesInItem);
   switch (kind) {
     case 0: this.ReadUsingInfo(bits); break;
     case 1: this.ReadForwardInfo(bits); break;
     case 2: break; // this.ReadForwardedToModuleInfo(bits); break;
     case 3: this.ReadIteratorLocals(bits); break;
     case 4: this.ReadForwardIterator(bits); break;
     // TODO: handle unknown custom metadata, 5 & 6 are new with roslyn, see https://roslyn.codeplex.com/workitem/54
   }
   bits.Position = savedPosition+(int)numberOfBytesInItem;
 }
Ejemplo n.º 29
0
    internal static void CountScopesAndSlots(BitAccess bits, uint limit,
                                             out int constants, out int scopes, out int slots, out int usedNamespaces) {
      int pos = bits.Position;
      BlockSym32 block;
      constants = 0;
      slots = 0;
      scopes = 0;
      usedNamespaces = 0;

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

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

        switch ((SYM)rec) {
          case SYM.S_BLOCK32: {
              bits.ReadUInt32(out block.parent);
              bits.ReadUInt32(out block.end);

              scopes++;
              bits.Position = (int)block.end;
              break;
            }

          case SYM.S_MANSLOT:
            slots++;
            bits.Position = stop;
            break;

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

          case SYM.S_MANCONSTANT:
            constants++;
            bits.Position = stop;
            break;

          default:
            bits.Position = stop;
            break;
        }
      }
      bits.Position = pos;
    }
 private void ReadForwardInfo(BitAccess bits)
 {
 }
Ejemplo n.º 31
0
 internal BitSet(BitAccess bits)
 {
     bits.ReadInt32(out size); // 0..3 : Number of words
     words = new uint[size];
     bits.ReadUInt32(words);
 }
Ejemplo n.º 32
0
        internal static PdbFunction[] LoadFunctions(Stream read, out Dictionary <uint, PdbTokenLine> tokenToSourceMapping, out string sourceServerData, out int age, out Guid guid)
        {
            tokenToSourceMapping = new Dictionary <uint, PdbTokenLine>();
            BitAccess     bits   = new BitAccess(512 * 1024);
            PdbFileHeader head   = new PdbFileHeader(read, bits);
            PdbReader     reader = new PdbReader(read, head.pageSize);
            MsfDirectory  dir    = new MsfDirectory(reader, head, bits);

            DbiModuleInfo[] modules = null;
            DbiDbgHdr       header;

            dir.streams[1].Read(reader, bits);
            Dictionary <string, int> nameIndex = LoadNameIndex(bits, out age, out guid);
            int nameStream;

            if (!nameIndex.TryGetValue("/NAMES", out nameStream))
            {
                throw new PdbException("No `name' stream");
            }
            dir.streams[nameStream].Read(reader, bits);
            IntHashTable names = LoadNameStream(bits);

            int srcsrvStream;

            if (!nameIndex.TryGetValue("SRCSRV", out srcsrvStream))
            {
                sourceServerData = string.Empty;
            }
            else
            {
                DataStream dataStream = dir.streams[srcsrvStream];
                byte[]     bytes      = new byte[dataStream.contentSize];
                dataStream.Read(reader, bits);
                sourceServerData = bits.ReadBString(bytes.Length);
            }

            dir.streams[3].Read(reader, bits);
            LoadDbiStream(bits, out modules, out header, true);

            List <PdbFunction> funcList = new List <PdbFunction>();

            if (modules != null)
            {
                for (int m = 0; m < modules.Length; m++)
                {
                    var module = modules[m];
                    if (module.stream > 0)
                    {
                        dir.streams[module.stream].Read(reader, bits);
                        if (module.moduleName == "TokenSourceLineInfo")
                        {
                            LoadTokenToSourceInfo(bits, module, names, dir, nameIndex, reader, tokenToSourceMapping);
                            continue;
                        }
                        LoadFuncsFromDbiModule(bits, module, names, funcList, true, dir, nameIndex, reader);
                    }
                }
            }

            PdbFunction[] funcs = funcList.ToArray();

            // After reading the functions, apply the token remapping table if it exists.
            if (header.snTokenRidMap != 0 && header.snTokenRidMap != 0xffff)
            {
                dir.streams[header.snTokenRidMap].Read(reader, bits);
                uint[] ridMap = new uint[dir.streams[header.snTokenRidMap].Length / 4];
                bits.ReadUInt32(ridMap);

                foreach (PdbFunction func in funcs)
                {
                    func.token = 0x06000000 | ridMap[func.token & 0xffffff];
                }
            }

            //
            Array.Sort(funcs, PdbFunction.byAddressAndToken);
            //Array.Sort(funcs, PdbFunction.byToken);
            return(funcs);
        }
Ejemplo n.º 33
0
        internal PdbConstant(BitAccess bits)
        {
            bits.ReadUInt32(out this.token);
            byte tag1;

            bits.ReadUInt8(out tag1);
            byte tag2;

            bits.ReadUInt8(out tag2);
            if (tag2 == 0)
            {
                this.value = tag1;
            }
            else if (tag2 == 0x80)
            {
                switch (tag1)
                {
                case 0x00: //sbyte
                    sbyte sb;
                    bits.ReadInt8(out sb);
                    this.value = sb;
                    break;

                case 0x01: //short
                    short s;
                    bits.ReadInt16(out s);
                    this.value = s;
                    break;

                case 0x02: //ushort
                    ushort us;
                    bits.ReadUInt16(out us);
                    this.value = us;
                    break;

                case 0x03: //int
                    int i;
                    bits.ReadInt32(out i);
                    this.value = i;
                    break;

                case 0x04: //uint
                    uint ui;
                    bits.ReadUInt32(out ui);
                    this.value = ui;
                    break;

                case 0x05: //float
                    this.value = bits.ReadFloat();
                    break;

                case 0x06: //double
                    this.value = bits.ReadDouble();
                    break;

                case 0x09: //long
                    long sl;
                    bits.ReadInt64(out sl);
                    this.value = sl;
                    break;

                case 0x0a: //ulong
                    ulong ul;
                    bits.ReadUInt64(out ul);
                    this.value = ul;
                    break;

                case 0x10: //string
                    string str;
                    bits.ReadBString(out str);
                    this.value = str;
                    break;

                case 0x19: //decimal
                    this.value = bits.ReadDecimal();
                    break;

                default:
                    //TODO: error
                    break;
                }
            }
            else
            {
                //TODO: error
            }
            bits.ReadCString(out name);
        }
 private void ReadForwardedToModuleInfo(BitAccess bits)
 {
 }
Ejemplo n.º 35
0
        internal static PdbFunction[] LoadFunctions(Stream read, BitAccess bits, bool readAllStrings, out int age, out Guid guid)
        {
            PdbFileHeader head   = new PdbFileHeader(read, bits);
            PdbReader     reader = new PdbReader(read, head.pageSize);
            MsfDirectory  dir    = new MsfDirectory(reader, head, bits);

            DbiModuleInfo[] modules = null;
            DbiDbgHdr       header;

            dir.streams[1].Read(reader, bits);
            Dictionary <string, int> nameIndex = LoadNameIndex(bits, out age, out guid);
            int nameStream;

            if (!nameIndex.TryGetValue("/NAMES", out nameStream))
            {
                throw new PdbException("No `name' stream");
            }

            dir.streams[nameStream].Read(reader, bits);
            IntHashTable names = LoadNameStream(bits);

            dir.streams[3].Read(reader, bits);
            LoadDbiStream(bits, out modules, out header, readAllStrings);

            ArrayList funcList = new ArrayList();

            if (modules != null)
            {
                for (int m = 0; m < modules.Length; m++)
                {
                    if (modules[m].stream > 0)
                    {
                        dir.streams[modules[m].stream].Read(reader, bits);
                        LoadFuncsFromDbiModule(bits, modules[m], names, funcList,
                                               readAllStrings, dir, nameIndex, reader);
                    }
                }
            }

            PdbFunction[] funcs = (PdbFunction[])funcList.ToArray(typeof(PdbFunction));

            // After reading the functions, apply the token remapping table if it exists.
            if (header.snTokenRidMap != 0 && header.snTokenRidMap != 0xffff)
            {
                dir.streams[header.snTokenRidMap].Read(reader, bits);
                uint[] ridMap = new uint[dir.streams[header.snTokenRidMap].Length / 4];
                bits.ReadUInt32(ridMap);
                {
                    var __array1       = funcs;
                    var __arrayLength1 = __array1.Length;
                    for (int __i1 = 0; __i1 < __arrayLength1; ++__i1)
                    {
                        var func = (PdbFunction)__array1[__i1];
                        {
                            func.token = 0x06000000 | ridMap[func.token & 0xffffff];
                        }
                    }
                }
            }

            //
            Array.Sort(funcs, PdbFunction.byAddressAndToken);
            //Array.Sort(funcs, PdbFunction.byToken);
            return(funcs);
        }
Ejemplo n.º 36
0
 internal void Read(PdbReader reader, BitAccess bits)
 {
     bits.MinCapacity(contentSize);
     Read(reader, 0, bits.Buffer, 0, contentSize);
 }
Ejemplo n.º 37
0
        internal static PdbFunction[] LoadFunctions(Stream read, bool readAllStrings, out int age, out Guid guid)
        {
            BitAccess bits = new BitAccess(512 * 1024);

            return(LoadFunctions(read, bits, readAllStrings, out age, out guid));
        }
Ejemplo n.º 38
0
// ReSharper disable UnusedParameter.Local
        private void ReadForwardInfo(BitAccess bits)
// ReSharper restore UnusedParameter.Local
        {
        }
Ejemplo n.º 39
0
        internal static PdbFunction[] LoadFunctions(Stream read, bool readAllStrings)
        {
            BitAccess bits = new BitAccess(512 * 1024);

            return(LoadFunctions(read, bits, readAllStrings));
        }
Ejemplo n.º 40
0
 private void ReadUsingInfo(BitAccess bits) {
   ushort numberOfNamespaces;
   bits.ReadUInt16(out numberOfNamespaces);
   this.usingCounts = new ushort[numberOfNamespaces];
   for (ushort i = 0; i < numberOfNamespaces; i++) {
     bits.ReadUInt16(out this.usingCounts[i]);
   }
 }
Ejemplo n.º 41
0
        internal PdbConstant(BitAccess bits)
        {
            bits.ReadUInt32(out this.Token);
            byte tag1;

            bits.ReadUInt8(out tag1);
            byte tag2;

            bits.ReadUInt8(out tag2);
            switch (tag2)
            {
            case 0:
                this.Value = tag1;
                break;

            case 0x80:
                switch (tag1)
                {
                case 0x01:                                 //short
                    short s;
                    bits.ReadInt16(out s);
                    this.Value = s;
                    break;

                case 0x02:                                 //ushort
                    ushort us;
                    bits.ReadUInt16(out us);
                    this.Value = us;
                    break;

                case 0x03:                                 //int
                    int i;
                    bits.ReadInt32(out i);
                    this.Value = i;
                    break;

                case 0x04:                                 //uint
                    uint ui;
                    bits.ReadUInt32(out ui);
                    this.Value = ui;
                    break;

                case 0x05:                                 //float
                    this.Value = bits.ReadFloat();
                    break;

                case 0x06:                                 //double
                    this.Value = bits.ReadDouble();
                    break;

                case 0x09:                                 //long
                    long sl;
                    bits.ReadInt64(out sl);
                    this.Value = sl;
                    break;

                case 0x0a:                                 //ulong
                    ulong ul;
                    bits.ReadUInt64(out ul);
                    this.Value = ul;
                    break;

                case 0x10:                                 //string
                    string str;
                    bits.ReadBString(out str);
                    this.Value = str;
                    break;

                case 0x19:                                 //decimal
                    this.Value = bits.ReadDecimal();
                    break;
                }
                break;
            }
            bits.ReadCString(out this.Name);
        }
Ejemplo n.º 42
0
        //private void ReadForwardedToModuleInfo(BitAccess bits) {
        //}

        private void ReadForwardInfo(BitAccess bits)
        {
            bits.ReadUInt32(out this.tokenOfMethodWhoseUsingInfoAppliesToThisMethod);
        }
Ejemplo n.º 43
0
 internal PdbSynchronizationPoint(BitAccess bits) {
   bits.ReadUInt32(out this.synchronizeOffset);
   bits.ReadUInt32(out this.continuationMethodToken);
   bits.ReadUInt32(out this.continuationOffset);
 }
Ejemplo n.º 44
0
 internal PdbSynchronizationPoint(BitAccess bits)
 {
     bits.ReadUInt32(out this.synchronizeOffset);
     bits.ReadUInt32(out this.continuationMethodToken);
     bits.ReadUInt32(out this.continuationOffset);
 }
Ejemplo n.º 45
0
        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;

            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);
            int scope    = constantCount > 0 || slotCount > 0 || usedNamespacesCount > 0 ? 1 : 0;
            int slot     = 0;
            int constant = 0;
            int usedNs   = 0;

            scopes         = new PdbScope[scopeCount + scope];
            slots          = new PdbSlot[slotCount];
            constants      = new PdbConstant[constantCount];
            usedNamespaces = new string[usedNamespacesCount];

            if (scope > 0)
            {
                scopes[0] = new PdbScope(this.address, proc.len, slots, constants, usedNamespaces);
            }

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

                bits.ReadUInt16(out siz);
                int star = bits.Position;
                int 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)
                    {
                        string 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:
                {
                    BlockSym32 block = new BlockSym32();

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

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

                case SYM.S_MANSLOT:
                    uint typind;
                    slots[slot++] = new PdbSlot(bits, out typind);
                    bits.Position = stop;
                    break;

                case SYM.S_MANCONSTANT:
                    constants[constant++] = new PdbConstant(bits);
                    bits.Position         = stop;
                    break;

                case SYM.S_UNAMESPACE:
                    bits.ReadCString(out usedNamespaces[usedNs++]);
                    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.º 46
0
 internal static PdbFunction[] LoadFunctions(Stream read, bool readAllStrings) {
   BitAccess bits = new BitAccess(512 * 1024);
   return LoadFunctions(read, bits, readAllStrings);
 }
Ejemplo n.º 47
0
 private void ReadForwardIterator(BitAccess bits)
 {
     this.iteratorClass = bits.ReadString();
 }
Ejemplo n.º 48
0
    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;

      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);
      int scope = constantCount > 0 || slotCount > 0 || usedNamespacesCount > 0 ? 1 : 0;
      int slot = 0;
      int constant = 0;
      int usedNs = 0;
      scopes = new PdbScope[scopeCount+scope];
      slots = new PdbSlot[slotCount];
      constants = new PdbConstant[constantCount];
      usedNamespaces = new string[usedNamespacesCount];

      if (scope > 0)
        scopes[0] = new PdbScope(this.address, proc.len, slots, constants, usedNamespaces);

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

        bits.ReadUInt16(out siz);
        int star = bits.Position;
        int 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) {
                string 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);
                  }
                } else if (name == "asyncMethodInfo") {
                  this.synchronizationInformation = new PdbSynchronizationInformation(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: {
              BlockSym32 block = new BlockSym32();

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

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

          case SYM.S_MANSLOT:
            slots[slot++] = new PdbSlot(bits);
            bits.Position = stop;
            break;

          case SYM.S_MANCONSTANT:
            constants[constant++] = new PdbConstant(bits);
            bits.Position = stop;
            break;

          case SYM.S_UNAMESPACE:
            bits.ReadCString(out usedNamespaces[usedNs++]);
            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.º 49
0
        internal static PdbFunction[] LoadManagedFunctions(/*string module,*/
            BitAccess bits, uint limit,
            bool readStrings)
        {
            //string mod = StripNamespace(module);
            int begin = bits.Position;
            int count = 0;

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

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

                switch ((SYM)rec)
                {
                case SYM.S_GMANPROC:
                case SYM.S_LMANPROC:
                    ManProcSym proc;
                    bits.ReadUInt32(out proc.parent);
                    bits.ReadUInt32(out proc.end);
                    bits.Position = (int)proc.end;
                    count++;
                    break;

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

                default:
                    //UnityEngine.Debug.LogError("{0,6}: {1:x2} {2}",
                    //                  bits.Position, rec, (SYM)rec);
                    bits.Position = stop;
                    break;
                }
            }
            if (count == 0)
            {
                return(null);
            }

            bits.Position = begin;
            PdbFunction[] funcs = new PdbFunction[count];
            int           func  = 0;

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

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

                switch ((SYM)rec)
                {
                case SYM.S_GMANPROC:
                case SYM.S_LMANPROC:
                    ManProcSym proc;
                    //int offset = bits.Position;

                    bits.ReadUInt32(out proc.parent);
                    bits.ReadUInt32(out proc.end);
                    bits.ReadUInt32(out proc.next);
                    bits.ReadUInt32(out proc.len);
                    bits.ReadUInt32(out proc.dbgStart);
                    bits.ReadUInt32(out proc.dbgEnd);
                    bits.ReadUInt32(out proc.token);
                    bits.ReadUInt32(out proc.off);
                    bits.ReadUInt16(out proc.seg);
                    bits.ReadUInt8(out proc.flags);
                    bits.ReadUInt16(out proc.retReg);
                    if (readStrings)
                    {
                        bits.ReadCString(out proc.name);
                    }
                    else
                    {
                        bits.SkipCString(out proc.name);
                    }
                    //UnityEngine.Debug.LogError("token={0:X8} [{1}::{2}]", proc.token, module, proc.name);

                    bits.Position = stop;
                    funcs[func++] = new PdbFunction(/*module,*/ proc, bits);
                    break;

                default:
                {
                    //throw new PdbDebugException("Unknown SYMREC {0}", (SYM)rec);
                    bits.Position = stop;
                    break;
                }
                }
            }
            return(funcs);
        }
Ejemplo n.º 50
0
 private void ReadForwardIterator(BitAccess bits) {
   this.iteratorClass = bits.ReadString();
 }
Ejemplo n.º 51
0
        static void LoadManagedLines(PdbFunction[] funcs,
                                     IntHashTable names,
                                     BitAccess bits,
                                     MsfDirectory dir,
                                     Dictionary <string, int> nameIndex,
                                     PdbReader reader,
                                     uint limit,
                                     Dictionary <string, PdbSource> sourceCache)
        {
            Array.Sort(funcs, PdbFunction.byAddressAndToken);

            int          begin  = bits.Position;
            IntHashTable checks = ReadSourceFileInfo(bits, limit, names, dir, nameIndex, reader, sourceCache);

            // Read the lines next.
            bits.Position = begin;
            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                int 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);
                    int funcIndex = FindFunction(funcs, sec.sec, sec.off);
                    if (funcIndex < 0)
                    {
                        break;
                    }
                    var func = funcs[funcIndex];
                    if (func.lines == null)
                    {
                        while (funcIndex > 0)
                        {
                            var f = funcs[funcIndex - 1];
                            if (f.lines != null || f.segment != sec.sec || f.address != sec.off)
                            {
                                break;
                            }
                            func = f;
                            funcIndex--;
                        }
                    }
                    else
                    {
                        while (funcIndex < funcs.Length - 1 && func.lines != null)
                        {
                            var f = funcs[funcIndex + 1];
                            if (f.segment != sec.sec || f.address != sec.off)
                            {
                                break;
                            }
                            func = f;
                            funcIndex++;
                        }
                    }
                    if (func.lines != null)
                    {
                        break;
                    }

                    // Count the line blocks.
                    int begSym = bits.Position;
                    int 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.
                        int linsiz = (int)file.count * (8 + ((sec.flags & 1) != 0 ? 4 : 0));
                        bits.Position += linsiz;
                        blocks++;
                    }

                    func.lines = new PdbLines[blocks];
                    int 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.

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

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

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

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

                            uint lineBegin = line.flags & (uint)CV_Line_Flags.linenumStart;
                            uint delta     = (line.flags & (uint)CV_Line_Flags.deltaLineEnd) >> 24;
                            //bool 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;
            }
        }
Ejemplo n.º 52
0
    //private void ReadForwardedToModuleInfo(BitAccess bits) {
    //}

    private void ReadForwardInfo(BitAccess bits) {
      bits.ReadUInt32(out this.tokenOfMethodWhoseUsingInfoAppliesToThisMethod);
    }
Ejemplo n.º 53
0
        static void LoadDbiStream(BitAccess bits,
                                  out DbiModuleInfo[] modules,
                                  out DbiDbgHdr header,
                                  bool readStrings)
        {
            DbiHeader dh = new DbiHeader(bits);

            header = new DbiDbgHdr();

            //if (dh.sig != -1 || dh.ver != 19990903) {
            //  throw new PdbException("Unsupported DBI Stream version, sig={0}, ver={1}",
            //                         dh.sig, dh.ver);
            //}

            // Read gpmod section.
            ArrayList modList = new ArrayList();
            int       end     = bits.Position + dh.gpmodiSize;

            while (bits.Position < end)
            {
                DbiModuleInfo mod = new DbiModuleInfo(bits, readStrings);
                modList.Add(mod);
            }
            if (bits.Position != end)
            {
                throw new PdbDebugException("Error reading DBI stream, pos={0} != {1}",
                                            bits.Position, end);
            }

            if (modList.Count > 0)
            {
                modules = (DbiModuleInfo[])modList.ToArray(typeof(DbiModuleInfo));
            }
            else
            {
                modules = null;
            }

            // Skip the Section Contribution substream.
            bits.Position += dh.secconSize;

            // Skip the Section Map substream.
            bits.Position += dh.secmapSize;

            // Skip the File Info substream.
            bits.Position += dh.filinfSize;

            // Skip the TSM substream.
            bits.Position += dh.tsmapSize;

            // Skip the EC substream.
            bits.Position += dh.ecinfoSize;

            // Read the optional header.
            end = bits.Position + dh.dbghdrSize;
            if (dh.dbghdrSize > 0)
            {
                header = new DbiDbgHdr(bits);
            }
            bits.Position = end;
        }
Ejemplo n.º 54
0
 internal PdbSynchronizationInformation(BitAccess bits) {
   uint asyncStepInfoCount;
   bits.ReadUInt32(out this.kickoffMethodToken);
   bits.ReadUInt32(out this.generatedCatchHandlerIlOffset);
   bits.ReadUInt32(out asyncStepInfoCount);
   this.synchronizationPoints = new PdbSynchronizationPoint[asyncStepInfoCount];
   for (uint i = 0; i < asyncStepInfoCount; i += 1) {
     this.synchronizationPoints[i] = new PdbSynchronizationPoint(bits);
   }
 }
Ejemplo n.º 55
0
 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.º 56
0
    internal static PdbFunction[] LoadManagedFunctions(/*string module,*/
                                                       BitAccess bits, uint limit,
                                                       bool readStrings) {
      //string mod = StripNamespace(module);
      int begin = bits.Position;
      int count = 0;

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

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

        switch ((SYM)rec) {
          case SYM.S_GMANPROC:
          case SYM.S_LMANPROC:
            ManProcSym proc;
            bits.ReadUInt32(out proc.parent);
            bits.ReadUInt32(out proc.end);
            bits.Position = (int)proc.end;
            count++;
            break;

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

          default:
            //Console.WriteLine("{0,6}: {1:x2} {2}",
            //                  bits.Position, rec, (SYM)rec);
            bits.Position = stop;
            break;
        }
      }
      if (count == 0) {
        return null;
      }

      bits.Position = begin;
      PdbFunction[] funcs = new PdbFunction[count];
      int func = 0;

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

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

        switch ((SYM)rec) {

          case SYM.S_GMANPROC:
          case SYM.S_LMANPROC:
            ManProcSym proc;
            //int offset = bits.Position;

            bits.ReadUInt32(out proc.parent);
            bits.ReadUInt32(out proc.end);
            bits.ReadUInt32(out proc.next);
            bits.ReadUInt32(out proc.len);
            bits.ReadUInt32(out proc.dbgStart);
            bits.ReadUInt32(out proc.dbgEnd);
            bits.ReadUInt32(out proc.token);
            bits.ReadUInt32(out proc.off);
            bits.ReadUInt16(out proc.seg);
            bits.ReadUInt8(out proc.flags);
            bits.ReadUInt16(out proc.retReg);
            if (readStrings) {
              bits.ReadCString(out proc.name);
            } else {
              bits.SkipCString(out proc.name);
            }
            //Console.WriteLine("token={0:X8} [{1}::{2}]", proc.token, module, proc.name);

            bits.Position = stop;
            funcs[func++] = new PdbFunction(/*module,*/ proc, bits);
            break;

          default: {
              //throw new PdbDebugException("Unknown SYMREC {0}", (SYM)rec);
              bits.Position = stop;
              break;
            }
        }
      }
      return funcs;
    }
Ejemplo n.º 57
0
        private static IntHashTable ReadSourceFileInfo(BitAccess bits, uint limit, IntHashTable names, MsfDirectory dir,
                                                       Dictionary <string, int> nameIndex, PdbReader reader)
        {
            IntHashTable checks = new IntHashTable();

            int begin = bits.Position;

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

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

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

                        string name = (string)names[(int)chk.name];
                        int    guidStream;
#if !NET_CORE
                        Guid doctypeGuid = DocumentType.Text.ToGuid();
#else
                        // Note : netstandard1.6 doesn't support SymDocumentType.  Looks like it might be in netstandard2.0, but that
                        // is not coming out for a few months still.  Looking at our mono, SymDocumentType.Text simply returns and empty Guid
                        // so let's just go with that
                        Guid doctypeGuid = Guid.Empty;
#endif
                        Guid languageGuid = Guid.Empty;
                        Guid vendorGuid   = Guid.Empty;
                        if (nameIndex.TryGetValue("/SRC/FILES/" + name.ToUpperInvariant(), out guidStream))
                        {
                            var guidBits = new BitAccess(0x100);
                            dir.streams[guidStream].Read(reader, guidBits);
                            LoadGuidStream(guidBits, out doctypeGuid, out languageGuid, out vendorGuid);
                        }

                        PdbSource 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;
                }
            }
            return(checks);
        }