private GuidStream GetGuidStream(FileChecksumSubsection checksum, PdbStringTable namesStream, PdbFile pdb)
        {
            string name = namesStream.Dictionary[checksum.NameIndex];
            int    guidStreamIndex;

            if (pdb.InfoStream.NamedStreamMap.Streams.TryGetValue("/src/files/" + name, out guidStreamIndex) ||
                pdb.InfoStream.NamedStreamMap.StreamsUppercase.TryGetValue("/SRC/FILES/" + name.ToUpperInvariant(), out guidStreamIndex))
            {
                return(new GuidStream(pdb.Streams[guidStreamIndex]));
            }
            return(null);
        }
        public void Test2()
        {
            using (PdbFile pdb = OpenWindowsPdb(2))
            {
                // Verify info stream header
                Assert.Equal(PIS.InfoStreamVersion.VC70, pdb.InfoStream.Header.Version);
                Assert.Equal(0xC152E0B3U, pdb.InfoStream.Header.Signature);
                Assert.Equal(1U, pdb.InfoStream.Header.Age);
                Assert.Equal(Guid.Parse("{483548d2-af63-4b4e-bce0-41e1bd07d062}"), pdb.InfoStream.Header.Guid);

                // Verify names stream map
                var namesStreamMap = pdb.InfoStream.NamedStreamMap.Streams;
                Assert.Equal(4, namesStreamMap.Count);
                Assert.Equal(7, namesStreamMap["/src/headerblock"]);
                Assert.Equal(6, namesStreamMap["/names"]);
                Assert.Equal(5, namesStreamMap["/LinkInfo"]);
                Assert.Equal(9, namesStreamMap[@"/src/files/c:\projects\windbgcs-dumps\source\clr\sharedlibrary\sharedlibrary.cs"]);

                // Verify names stream
                PdbStringTable namesStream = pdb.InfoStream.NamesMap;

                Assert.Equal(@"C:\projects\windbgcs-dumps\Source\Clr\SharedLibrary\SharedLibrary.cs", namesStream.Dictionary[1]);
                Assert.Equal(@"c:\projects\windbgcs-dumps\source\clr\sharedlibrary\sharedlibrary.cs", namesStream.Dictionary[71]);

                // Verify DBI modules
                var dbiModules = pdb.DbiStream.Modules;

                Assert.Equal(4, dbiModules.Count);

                // Verify DBI module 0
                var dbiModule = dbiModules[0];
                Assert.Equal("Foo", dbiModule.ModuleName.String);
                var localss   = dbiModule.LocalSymbolStream;
                var functions = GetManagedProcedures(localss);
                Assert.Equal(4, functions.Length);
                Assert.Equal("Bar", functions[0].Name.String);
                Assert.Equal(new byte[] { 0 }, ReadCustomMetadata(functions[0]));
                Assert.Equal("Baz", functions[1].Name.String);
                Assert.Equal(new byte[] { 1 }, ReadCustomMetadata(functions[1]));
                Assert.Equal("Baz", functions[2].Name.String);
                Assert.Equal(new byte[] { 1, 6 }, ReadCustomMetadata(functions[2]));
                Assert.Equal(".ctor", functions[3].Name.String);
                Assert.Equal(new byte[] { 1 }, ReadCustomMetadata(functions[3]));
                var checksums = dbiModule.DebugSubsectionStream[DebugSubsectionKind.FileChecksums].OfType <FileChecksumSubsection>().ToArray();
                Assert.Equal(@"C:\projects\windbgcs-dumps\Source\Clr\SharedLibrary\SharedLibrary.cs", namesStream.Dictionary[checksums[0].NameIndex]);
                Assert.Single(checksums);
                var guidStream = GetGuidStream(checksums[0], namesStream, pdb);
                Assert.Equal(new byte[] { 248, 0, 227, 166, 171, 152, 157, 122, 60, 185, 89, 14, 74, 143, 196, 154, 218, 146, 222, 2 }, guidStream.ChecksumReader.ReadAllBytes());
                var lines = dbiModule.DebugSubsectionStream[DebugSubsectionKind.Lines].OfType <LinesSubsection>().ToArray();
                Assert.Equal(4, lines.Length);
                Assert.Equal(2 + 2 + 3 + 16, lines.SelectMany(l => l.Files).SelectMany(f => f.Lines).Count());

                // Verify DBI module 1
                dbiModule = dbiModules[1];
                Assert.Equal("Struct", dbiModule.ModuleName.String);
                localss   = dbiModule.LocalSymbolStream;
                functions = GetManagedProcedures(localss);
                Assert.Single(functions);
                Assert.Equal(".ctor", functions[0].Name.String);
                Assert.Equal(new byte[] { 1 }, ReadCustomMetadata(functions[0]));
                checksums = dbiModule.DebugSubsectionStream[DebugSubsectionKind.FileChecksums].OfType <FileChecksumSubsection>().ToArray();
                Assert.Equal(1U, checksums[0].NameIndex);
                lines = dbiModule.DebugSubsectionStream[DebugSubsectionKind.Lines].OfType <LinesSubsection>().ToArray();
                Assert.Single(lines);
                Assert.Equal(9, lines.SelectMany(l => l.Files).SelectMany(f => f.Lines).Count());

                // Verify DBI module 2
                dbiModule = dbiModules[2];
                Assert.Equal("MiddleStruct", dbiModule.ModuleName.String);
                localss   = dbiModule.LocalSymbolStream;
                functions = GetManagedProcedures(localss);
                Assert.Single(functions);
                Assert.Equal(".ctor", functions[0].Name.String);
                Assert.Equal(new byte[] { 1 }, ReadCustomMetadata(functions[0]));
                checksums = dbiModule.DebugSubsectionStream[DebugSubsectionKind.FileChecksums].OfType <FileChecksumSubsection>().ToArray();
                Assert.Equal(1U, checksums[0].NameIndex);
                lines = dbiModule.DebugSubsectionStream[DebugSubsectionKind.Lines].OfType <LinesSubsection>().ToArray();
                Assert.Single(lines);
                Assert.Equal(9, lines.SelectMany(l => l.Files).SelectMany(f => f.Lines).Count());

                // Verify DBI module 3
                dbiModule = dbiModules[3];
                Assert.Equal("InnerStruct", dbiModule.ModuleName.String);
                localss   = dbiModule.LocalSymbolStream;
                functions = GetManagedProcedures(localss);
                Assert.Single(functions);
                Assert.Equal(".ctor", functions[0].Name.String);
                Assert.Equal(new byte[] { 1 }, ReadCustomMetadata(functions[0]));
                checksums = dbiModule.DebugSubsectionStream[DebugSubsectionKind.FileChecksums].OfType <FileChecksumSubsection>().ToArray();
                Assert.Equal(1U, checksums[0].NameIndex);
                lines = dbiModule.DebugSubsectionStream[DebugSubsectionKind.Lines].OfType <LinesSubsection>().ToArray();
                Assert.Single(lines);
                Assert.Equal(8, lines.SelectMany(l => l.Files).SelectMany(f => f.Lines).Count());

                // Verify functions token
                functions = dbiModules.SelectMany(d => GetManagedProcedures(d.LocalSymbolStream)).ToArray();
                Assert.Equal(new uint[] { 0x06000001, 0x06000002, 0x06000003, 0x06000004, 0x06000005, 0x06000006, 0x06000007 }, functions.Select(f => f.FunctionType.Index));
            }
        }