/// <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])); } } }
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])); } } }
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()); } }
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])); } } }
/// <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])); } } }
internal void Read(PdbReader reader, BitAccess bits) { bits.MinCapacity(contentSize); Read(reader, 0, bits.Buffer, 0, contentSize); }
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 int directoryPages = ((((directorySize + pageSize - 1) / pageSize) * 4) + pageSize - 1) / pageSize; this.directoryRoot = new int[directoryPages]; bits.FillBuffer(reader, directoryPages * 4); bits.ReadInt32(this.directoryRoot); }
internal void Read(PdbStreamHelper reader, BitAccess bits) { bits.MinCapacity(_contentSize); Read(reader, 0, bits.Buffer, 0, _contentSize); }
internal void Read(PdbReader reader, BitAccess bits) { bits.MinCapacity(contentSize); Read(reader, 0, bits.Buffer, 0, contentSize); }