Beispiel #1
0
        private string ReadHashInternal(string pdbFileHash)
        {
            var bits = new BitAccess(0);

            using (var read = File.Open(pdbFileHash, FileMode.Open))
            {
                var head   = new PdbFileHeader(read, bits);
                var reader = new PdbReader(read, head.pageSize);
                var dir    = new MsfDirectory(reader, head, bits);

                bits.MinCapacity(28);
                reader.Seek(dir.streams[1].pages[0], 0);
                reader.Read(bits.Buffer, 0, 28);

                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
                return((guid.ToString("N") + age.ToString("x")).ToUpper());
            }
        }
Beispiel #2
0
        /// <summary>
        /// </summary>
        /// <param name="reader">
        /// </param>
        /// <param name="head">
        /// </param>
        /// <param name="bits">
        /// </param>
        internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits)
        {
            bits.MinCapacity(head.directorySize);
            var pages = reader.PagesFromSize(head.directorySize);

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

            var 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
            var sizes = new int[count];
            bits.ReadInt32(sizes);

            // n..m
            this.streams = new DataStream[count];
            for (var i = 0; i < count; i++)
            {
                if (sizes[i] <= 0)
                {
                    this.streams[i] = new DataStream();
                }
                else
                {
                    this.streams[i] = new DataStream(sizes[i], bits, reader.PagesFromSize(sizes[i]));
                }
            }
        }
Beispiel #3
0
        public 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 = null;
            DbiDbgHdr       header;

            dir.streams[1].Read(reader, bits);
            int nameStream = LoadPdbStream(bits);

            if (nameStream <= 0)
            {
                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);
                    }
                }
            }

            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);
        }
Beispiel #4
0
        internal MsfDirectory(PdbStreamHelper 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]));
                }
            }
        }
            public void WriteHash(string pdbFileHash, string hash)
            {
                Guid guid = new Guid(hash.Remove(32));
                int  age  = int.Parse(hash.Substring(32), NumberStyles.HexNumber);

                using (var read = File.Open(pdbFileHash, FileMode.Open))
                {
                    PdbFileHeader head   = new PdbFileHeader(read, bits);
                    PdbReader     reader = new PdbReader(read, head.pageSize);
                    MsfDirectory  dir    = new MsfDirectory(reader, head, bits);

                    reader.Seek(dir.streams[1].pages[0], 8); //bo przeskakujemy 8 znaków na ver i sig

                    using (BinaryWriter writer = new BinaryWriter(read))
                    {
                        writer.Write(age);
                        writer.Write(guid.ToByteArray());
                    }
                }
            }
        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]));
            }
              }
        }
Beispiel #7
0
        /// <summary>
        /// </summary>
        /// <param name="reader">
        /// </param>
        /// <param name="head">
        /// </param>
        /// <param name="bits">
        /// </param>
        internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits)
        {
            bits.MinCapacity(head.directorySize);
            var pages = reader.PagesFromSize(head.directorySize);

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

            var 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
            var sizes = new int[count];

            bits.ReadInt32(sizes);

            // n..m
            this.streams = new DataStream[count];
            for (var i = 0; i < count; i++)
            {
                if (sizes[i] <= 0)
                {
                    this.streams[i] = new DataStream();
                }
                else
                {
                    this.streams[i] = new DataStream(sizes[i], bits, reader.PagesFromSize(sizes[i]));
                }
            }
        }
        private static Dictionary<uint, PdbTokenLine> LoadTokenToSourceMapping(Stream read)
        {
            var 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 Exception("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);
                        }
                    }
                }
            }

            return tokenToSourceMapping;
        }