private static ExtendFileSystemResult ExtendMountedFileSystem(Volume volume, Guid windowsVolumeGuid, long numberOfAdditionalSectors)
        {
            // Windows Vista / 7 enforce various limitations on direct write operations to volumes and disks.
            // We either have to take the disk(s) offline or use the OS volume handle for write operations.
            // http://msdn.microsoft.com/en-us/library/ff551353%28v=vs.85%29.aspx
            OperatingSystemVolume osVolume   = new OperatingSystemVolume(windowsVolumeGuid, volume.BytesPerSector, volume.Size);
            IExtendableFileSystem fileSystem = FileSystemHelper.ReadFileSystem(osVolume) as IExtendableFileSystem;

            if (fileSystem == null)
            {
                return(ExtendFileSystemResult.UnsupportedFileSystem);
            }

            bool success = WindowsVolumeManager.ExclusiveLock(windowsVolumeGuid, FileAccess.ReadWrite);

            if (!success)
            {
                return(ExtendFileSystemResult.CannotLockVolume);
            }

            // Dismounting the volume will make sure the OS have the correct filesystem size. (locking the volume is not enough)
            success = WindowsVolumeManager.DismountVolume(windowsVolumeGuid);
            if (!success)
            {
                return(ExtendFileSystemResult.CannotDismountVolume);
            }

            fileSystem.Extend(numberOfAdditionalSectors);

            WindowsVolumeManager.ReleaseLock(windowsVolumeGuid);
            return(ExtendFileSystemResult.Success);
        }
Exemple #2
0
        private void ExtendFileSystemForm_Load(object sender, EventArgs e)
        {
            m_fileSystem = FileSystemHelper.ReadFileSystem(m_volume) as IExtendableFileSystem;
            if (m_fileSystem == null)
            {
                MessageBox.Show("Filsystem is not supported for this operation.", "Error");
                this.DialogResult = DialogResult.Cancel;
                this.Close();
                return;
            }

            long numberOfBytesAvailable = m_fileSystem.GetMaximumSizeToExtend();
            long numberOfMBAvailable    = numberOfBytesAvailable / 1024 / 1024;

            numericAdditionalSize.Maximum = numberOfMBAvailable;
            numericAdditionalSize.Value   = numberOfMBAvailable;
            btnOK.Enabled = (numberOfMBAvailable > 0);
        }
        private static ExtendFileSystemResult ExtendUnmountedFileSystem(Partition volume, long numberOfAdditionalSectors)
        {
            IExtendableFileSystem fileSystem = FileSystemHelper.ReadFileSystem(volume) as IExtendableFileSystem;

            // Windows Vista / 7 enforce various limitations on direct write operations to volumes and disks.
            // Basic disks are not needed to be taken offline for direct write operations within volume region. Only dynamic disks have to.
            if (volume.Disk is PhysicalDisk && Environment.OSVersion.Version.Major >= 6)
            {
                bool isReadOnly;
                bool isOnline = ((PhysicalDisk)volume.Disk).GetOnlineStatus(out isReadOnly);
                if (!isOnline || isReadOnly)
                {
                    return(ExtendFileSystemResult.OneOrMoreDisksAreOfflineOrReadonly);
                }

                LockStatus status = LockHelper.LockBasicDiskAndVolumesOrNone(((PhysicalDisk)volume.Disk));
                if (status == LockStatus.CannotLockDisk)
                {
                    return(ExtendFileSystemResult.CannotLockDisk);
                }
                else if (status == LockStatus.CannotLockVolume)
                {
                    return(ExtendFileSystemResult.CannotLockVolume);
                }

                bool success = ((PhysicalDisk)volume.Disk).SetOnlineStatus(false);
                if (!success)
                {
                    return(ExtendFileSystemResult.CannotTakeDiskOffline);
                }
            }

            fileSystem.Extend(numberOfAdditionalSectors);

            if (volume.Disk is PhysicalDisk && (Environment.OSVersion.Version.Major >= 6))
            {
                bool success = ((PhysicalDisk)volume.Disk).SetOnlineStatus(true);
                LockHelper.UnlockBasicDiskAndVolumes((PhysicalDisk)volume.Disk);
            }

            return(ExtendFileSystemResult.Success);
        }
        private static ExtendFileSystemResult ExtendUnmountedFileSystem(List <DynamicDisk> diskGroup, DynamicVolume volume, long numberOfAdditionalSectors)
        {
            if (!volume.IsOperational)
            {
                return(ExtendFileSystemResult.NonOperationalVolume);
            }

            IExtendableFileSystem fileSystem = FileSystemHelper.ReadFileSystem(volume) as IExtendableFileSystem;

            // Windows Vista / 7 enforce various limitations on direct write operations to volumes and disks.
            // Basic disks are not needed to be taken offline for direct write operations within volume region. Only dynamic disks have to.
            if (Environment.OSVersion.Version.Major >= 6)
            {
                // Lock disks and volumes
                DiskGroupLockResult lockResult = DiskGroupHelper.LockDiskGroup(diskGroup);
                if (lockResult == DiskGroupLockResult.CannotLockDisk)
                {
                    return(ExtendFileSystemResult.CannotLockDisk);
                }
                else if (lockResult == DiskGroupLockResult.CannotLockVolume)
                {
                    return(ExtendFileSystemResult.CannotLockVolume);
                }
                else if (lockResult == DiskGroupLockResult.CannotTakeDiskOffline)
                {
                    return(ExtendFileSystemResult.CannotTakeDiskOffline);
                }
                else if (lockResult == DiskGroupLockResult.OneOrMoreDisksAreOfflineOrReadonly)
                {
                    return(ExtendFileSystemResult.OneOrMoreDisksAreOfflineOrReadonly);
                }
            }
            fileSystem.Extend(numberOfAdditionalSectors);

            if (Environment.OSVersion.Version.Major >= 6)
            {
                DiskGroupHelper.UnlockDiskGroup(diskGroup);
            }

            return(ExtendFileSystemResult.Success);
        }