public ServerSparseExtentStream(Stream file, Ownership ownsFile, long diskOffset, SparseStream parentDiskStream, Ownership ownsParentDiskStream)
        {
            _fileStream = file;
            _ownsFileStream = ownsFile;
            _diskOffset = diskOffset;
            _parentDiskStream = parentDiskStream;
            _ownsParentDiskStream = ownsParentDiskStream;

            file.Position = 0;
            byte[] firstSectors = Utilities.ReadFully(file, Sizes.Sector * 4);
            _serverHeader = ServerSparseExtentHeader.Read(firstSectors, 0);
            _header = _serverHeader;

            _gtCoverage = _header.NumGTEsPerGT * (long)_header.GrainSize * Sizes.Sector;

            LoadGlobalDirectory();
        }
        public static ServerSparseExtentHeader Read(byte[] buffer, int offset)
        {
            ServerSparseExtentHeader hdr = new ServerSparseExtentHeader();

            hdr.MagicNumber = Utilities.ToUInt32LittleEndian(buffer, offset + 0x00);
            hdr.Version = Utilities.ToUInt32LittleEndian(buffer, offset + 0x04);
            hdr.Flags = Utilities.ToUInt32LittleEndian(buffer, offset + 0x08);
            hdr.Capacity = Utilities.ToUInt32LittleEndian(buffer, offset + 0x0C);
            hdr.GrainSize = Utilities.ToUInt32LittleEndian(buffer, offset + 0x10);
            hdr.GdOffset = Utilities.ToUInt32LittleEndian(buffer, offset + 0x14);
            hdr.NumGdEntries = Utilities.ToUInt32LittleEndian(buffer, offset + 0x18);
            hdr.FreeSector = Utilities.ToUInt32LittleEndian(buffer, offset + 0x1C);

            hdr.SavedGeneration = Utilities.ToUInt32LittleEndian(buffer, offset + 0x660);
            hdr.UncleanShutdown = Utilities.ToUInt32LittleEndian(buffer, offset + 0x66C);

            hdr.NumGTEsPerGT = 4096;

            return hdr;
        }
Beispiel #3
0
        internal static ServerSparseExtentHeader CreateServerSparseExtentHeader(long size)
        {
            uint numSectors = (uint)Utilities.Ceil(size, Sizes.Sector);
            uint numGDEntries = (uint)Utilities.Ceil(numSectors * (long)Sizes.Sector, 2 * Sizes.OneMiB);

            ServerSparseExtentHeader header = new ServerSparseExtentHeader();
            header.Capacity = numSectors;
            header.GrainSize = 1;
            header.GdOffset = 4;
            header.NumGdEntries = numGDEntries;
            header.FreeSector = (uint)(header.GdOffset + Utilities.Ceil(numGDEntries * 4, Sizes.Sector));
            return header;
        }
 public GlobalDirectoryExtent(ServerSparseExtentHeader header)
     : base(header.GdOffset * Sizes.Sector, Utilities.RoundUp(header.NumGdEntries * 4, Sizes.Sector))
 {
     _buffer = new byte[Length];
 }
            private static long CalcSize(SparseStream content, ServerSparseExtentHeader header)
            {
                long numDataGrains = StreamExtent.BlockCount(content.Extents, header.GrainSize * Sizes.Sector);
                long grainTableSectors = Utilities.Ceil(header.NumGTEsPerGT * 4, Sizes.Sector);

                return (grainTableSectors + (numDataGrains * header.GrainSize)) * Sizes.Sector;
            }
 public GrainTableExtent(long outputStart, SparseStream content, ServerSparseExtentHeader header)
     : base(outputStart, CalcSize(content, header))
 {
     _content = content;
     _header = header;
 }