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