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; }
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; }