public static HeaderRecord Initialized(ImageType type, ImageFlags flags, long size, int blockSize, int blockExtra) { HeaderRecord result = new HeaderRecord(); result._fileVersion = new FileVersion(0x00010001); result.HeaderSize = 400; result.ImageType = type; result.Flags = flags; result.Comment = "Created by .NET ThinkAway"; result.LegacyGeometry = new GeometryRecord(); result.DiskSize = size; result.BlockSize = blockSize; result.BlockExtraSize = blockExtra; result.BlockCount = (int)((size + blockSize - 1) / blockSize); result.BlocksAllocated = 0; result.BlocksOffset = ((PreHeaderRecord.Size + result.HeaderSize + 511) / 512) * 512; result.DataOffset = (uint)(((result.BlocksOffset + (result.BlockCount * 4) + 511) / 512) * 512); result.UniqueId = Guid.NewGuid(); result.ModificationId = Guid.NewGuid(); result.LChsGeometry = new GeometryRecord(); return result; }
public DiskStream(Stream fileStream, Ownership ownsStream, HeaderRecord fileHeader) { _fileStream = fileStream; _fileHeader = fileHeader; _ownsStream = ownsStream; ReadBlockTable(); }
/// <summary> /// Initializes a stream as a dynamically-sized VDI file. /// </summary> /// <param name="stream">The stream to initialize.</param> /// <param name="ownsStream">Indicates if the new instance controls the lifetime of the stream.</param> /// <param name="capacity">The desired capacity of the new disk</param> /// <returns>An object that accesses the stream as a VDI file</returns> public static DiskImageFile InitializeDynamic(Stream stream, Ownership ownsStream, long capacity) { PreHeaderRecord preHeader = PreHeaderRecord.Initialized(); HeaderRecord header = HeaderRecord.Initialized(ImageType.Dynamic, ImageFlags.None, capacity, 1024 * 1024, 0); byte[] blockTable = new byte[header.BlockCount * 4]; for (int i = 0; i < blockTable.Length; ++i) { blockTable[i] = 0xFF; } header.BlocksAllocated = 0; stream.Position = 0; preHeader.Write(stream); header.Write(stream); stream.Position = header.BlocksOffset; stream.Write(blockTable, 0, blockTable.Length); return(new DiskImageFile(stream, ownsStream)); }
private void ReadHeader() { _stream.Position = 0; _preHeader = new PreHeaderRecord(); _preHeader.Read(_stream); _header = new HeaderRecord(); _header.Read(_preHeader.Version, _stream); }