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]; }
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); }
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])); } } }
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 }
internal void Read(PdbReader reader, BitAccess bits) { bits.MinCapacity(contentSize); Read(reader, 0, bits.Buffer, 0, contentSize); }