public 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]));
                }
            }
        }
示例#2
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];
        }
示例#3
0
        public 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]));
                }
            }
        }
示例#4
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);
        }
示例#5
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);
        }
示例#6
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];
        }
示例#7
0
        public 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
        }
示例#8
0
        public 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
        }
示例#9
0
 public void Read(PdbReader reader, BitAccess bits)
 {
     bits.MinCapacity(contentSize);
     Read(reader, 0, bits.Buffer, 0, contentSize);
 }
示例#10
0
 public void Read(PdbReader reader, BitAccess bits)
 {
     bits.MinCapacity(contentSize);
     Read(reader, 0, bits.Buffer, 0, contentSize);
 }