Esempio n. 1
0
        public override void Extend(long numberOfAdditionalBytes)
        {
            if (m_descriptor.DiskType == VirtualMachineDiskType.MonolithicFlat)
            {
                // Add updated extent entries
                List <string> lines = VirtualMachineDiskDescriptor.ReadASCIITextLines(m_descriptorPath);
                m_descriptor.ExtentEntries[0].SizeInSectors += numberOfAdditionalBytes / this.BytesPerSector;
                m_descriptor.UpdateExtentEntries(lines);

                File.WriteAllLines(m_descriptorPath, lines.ToArray(), Encoding.ASCII);
                m_extent.Extend(numberOfAdditionalBytes);
            }
            else
            {
                throw new NotImplementedException("Extending a monolithic sparse is not supported");
            }
        }
Esempio n. 2
0
        /// <exception cref="System.IO.IOException"></exception>
        /// <exception cref="System.IO.InvalidDataException"></exception>
        /// <exception cref="System.NotImplementedException"></exception>
        /// <exception cref="System.UnauthorizedAccessException"></exception>
        public VirtualMachineDisk(string descriptorPath, bool isReadOnly) : base(descriptorPath)
        {
            m_descriptorPath = descriptorPath;

            m_descriptor = VirtualMachineDiskDescriptor.ReadFromFile(m_descriptorPath);
            bool isDescriptorEmbedded = false;

            if (m_descriptor == null)
            {
                SparseExtent sparse;
                try
                {
                    sparse = new SparseExtent(m_descriptorPath);
                }
                catch (InvalidDataException)
                {
                    throw new InvalidDataException("Missing VMDK descriptor");
                }

                if (sparse.Descriptor != null)
                {
                    isDescriptorEmbedded = true;
                    m_descriptor         = sparse.Descriptor;
                    m_extent             = sparse;
                }
                else
                {
                    throw new InvalidDataException("Missing VMDK descriptor");
                }
            }

            if (m_descriptor.Version != 1)
            {
                throw new NotImplementedException("Unsupported VMDK descriptor version");
            }

            if (m_descriptor.ParentContentID != BaseDiskParentCID)
            {
                throw new InvalidDataException("VMDK descriptor ParentContentID does not match BaseDiskParentCID");
            }

            if (!isDescriptorEmbedded && m_descriptor.DiskType != VirtualMachineDiskType.MonolithicFlat)
            {
                throw new NotImplementedException("Unsupported VMDK disk type");
            }

            if (isDescriptorEmbedded && m_descriptor.DiskType != VirtualMachineDiskType.MonolithicSparse)
            {
                throw new NotImplementedException("Unsupported VMDK disk type");
            }

            foreach (VirtualMachineDiskExtentEntry extentEntry in m_descriptor.ExtentEntries)
            {
                if (!isDescriptorEmbedded && extentEntry.ExtentType != ExtentType.Flat)
                {
                    throw new NotImplementedException("Unsupported VMDK extent type");
                }

                if (isDescriptorEmbedded && extentEntry.ExtentType != ExtentType.Sparse)
                {
                    throw new NotImplementedException("Unsupported VMDK extent type");
                }
            }

            if (m_descriptor.ExtentEntries.Count != 1)
            {
                throw new NotImplementedException("Unsupported number of VMDK extents");
            }

            if (m_descriptor.DiskType == VirtualMachineDiskType.MonolithicFlat)
            {
                VirtualMachineDiskExtentEntry entry = m_descriptor.ExtentEntries[0];
                string    directory  = System.IO.Path.GetDirectoryName(descriptorPath);
                string    extentPath = directory + @"\" + entry.FileName;
                DiskImage extent     = new RawDiskImage(extentPath, BytesPerDiskSector, isReadOnly);
                m_extent = extent;
            }
        }