Example #1
0
        private void Initialize()
        {
            _fileStream.Position = 0;
            FileHeader fileHeader = Utilities.ReadStruct <FileHeader>(_fileStream);

            if (!fileHeader.IsValid)
            {
                throw new IOException("Invalid VHDX file - file signature mismatch");
            }

            _freeSpace = new FreeSpaceTable(_fileStream.Length);

            ReadHeaders();

            ReplayLog();

            ReadRegionTable();

            ReadMetadata();

            _batStream = OpenRegion(RegionTable.BatGuid);
            _freeSpace.Reserve(BatControlledFileExtents());

            // Indicate the file is open for modification
            if (_fileStream.CanWrite)
            {
                _header.FileWriteGuid = Guid.NewGuid();
                WriteHeader();
            }
        }
        public Chunk(Stream bat, SparseStream file, FreeSpaceTable freeSpace, FileParameters fileParameters, int chunk, int blocksPerChunk)
        {
            _bat            = bat;
            _file           = file;
            _freeSpace      = freeSpace;
            _fileParameters = fileParameters;
            _chunk          = chunk;
            _blocksPerChunk = blocksPerChunk;

            _bat.Position = _chunk * (_blocksPerChunk + 1) * 8;
            _batData      = Utilities.ReadFully(bat, (_blocksPerChunk + 1) * 8);
        }
Example #3
0
        public Chunk(Stream bat, SparseStream file, FreeSpaceTable freeSpace, FileParameters fileParameters, int chunk, int blocksPerChunk)
        {
            _bat = bat;
            _file = file;
            _freeSpace = freeSpace;
            _fileParameters = fileParameters;
            _chunk = chunk;
            _blocksPerChunk = blocksPerChunk;

            _bat.Position = _chunk * (_blocksPerChunk + 1) * 8;
            _batData = Utilities.ReadFully(bat, (_blocksPerChunk + 1) * 8);
        }
Example #4
0
        public ContentStream(SparseStream fileStream, Stream batStream, FreeSpaceTable freeSpaceTable, Metadata metadata, long length, SparseStream parentStream, Ownership ownsParent)
        {
            _fileStream = fileStream;
            _batStream = batStream;
            _freeSpaceTable = freeSpaceTable;
            _metadata = metadata;
            _fileParameters = _metadata.FileParameters;
            _length = length;
            _parentStream = parentStream;
            _ownsParent = ownsParent;

            _chunks = new ObjectCache<int, Chunk>();
        }
        public ContentStream(SparseStream fileStream, Stream batStream, FreeSpaceTable freeSpaceTable, Metadata metadata, long length, SparseStream parentStream, Ownership ownsParent)
        {
            _fileStream     = fileStream;
            _batStream      = batStream;
            _freeSpaceTable = freeSpaceTable;
            _metadata       = metadata;
            _fileParameters = _metadata.FileParameters;
            _length         = length;
            _parentStream   = parentStream;
            _ownsParent     = ownsParent;

            _chunks = new ObjectCache <int, Chunk>();
        }
        private void Initialize()
        {
            _fileStream.Position = 0;
            FileHeader fileHeader = Utilities.ReadStruct<FileHeader>(_fileStream);
            if (!fileHeader.IsValid)
            {
                throw new IOException("Invalid VHDX file - file signature mismatch");
            }

            _freeSpace = new FreeSpaceTable(_fileStream.Length);

            ReadHeaders();

            if (_header.LogGuid != Guid.Empty)
            {
                throw new NotSupportedException("Detected VHDX file with replay log - not yet supported");
            }

            _freeSpace.Reserve((long)_header.LogOffset, _header.LogLength);

            ReadRegionTable();

            ReadMetadata();

            _batStream = OpenRegion(RegionTable.BatGuid);
            _freeSpace.Reserve(BatControlledFileExtents());

            // Indicate the file is open for modification
            if (_fileStream.CanWrite)
            {
                _header.FileWriteGuid = Guid.NewGuid();
                WriteHeader();
            }
        }