/// <summary> /// Initializes a new instance of the PhysicalVolumeInfo class. /// </summary> /// <param name="diskId">The containing disk's identity.</param> /// <param name="disk">The disk containing the partition.</param> /// <param name="partitionInfo">Information about the partition.</param> /// <remarks>Use this constructor to represent a (BIOS or GPT) partition.</remarks> internal PhysicalVolumeInfo( string diskId, VirtualDisk disk, PartitionInfo partitionInfo) { _diskId = diskId; _disk = disk; _streamOpener = partitionInfo.Open; _type = partitionInfo.VolumeType; _partitionInfo = partitionInfo; }
/// <summary> /// Creates an instance representing a (BIOS or GPT) partition. /// </summary> /// <param name="diskId">The containing disk's identity</param> /// <param name="disk">The disk containing the partition</param> /// <param name="partitionInfo">Information about the partition</param> internal PhysicalVolumeInfo( string diskId, VirtualDisk disk, PartitionInfo partitionInfo ) { _diskId = diskId; _disk = disk; _streamOpener = partitionInfo.Open; _type = (partitionInfo is GuidPartitionInfo) ? PhysicalVolumeType.GptPartition : PhysicalVolumeType.BiosPartition; _partitionInfo = partitionInfo; }
private static bool IsLdmPartition(PartitionInfo partition) { return partition.BiosType == BiosPartitionTypes.WindowsDynamicVolume || partition.GuidType == GuidPartitionTypes.WindowsLdmMetadata || partition.GuidType == GuidPartitionTypes.WindowsLdmData; }
internal static WellKnownPartitionType GetPartitionType(PartitionInfo Partition) { switch (Partition.BiosType) { case BiosPartitionTypes.Fat16: case BiosPartitionTypes.Fat32: case BiosPartitionTypes.Fat32Lba: return WellKnownPartitionType.WindowsFat; case BiosPartitionTypes.Ntfs: return WellKnownPartitionType.WindowsNtfs; case BiosPartitionTypes.LinuxNative: return WellKnownPartitionType.Linux; case BiosPartitionTypes.LinuxSwap: return WellKnownPartitionType.LinuxSwap; case BiosPartitionTypes.LinuxLvm: return WellKnownPartitionType.LinuxLvm; default: throw new ArgumentException( String.Format("Unsupported partition type: '{0}'", BiosPartitionTypes.ToString(Partition.BiosType)), "Partition"); } }
internal static DiscFileSystem DetectFileSystem(PartitionInfo Partition) { using (var stream = Partition.Open()) { if (NtfsFileSystem.Detect(stream)) return new NtfsFileSystem(Partition.Open()); stream.Seek(0, SeekOrigin.Begin); if (FatFileSystem.Detect(stream)) return new FatFileSystem(Partition.Open()); /* Ext2/3/4 file system - when Ext becomes fully writable stream.Seek(0, SeekOrigin.Begin); if (ExtFileSystem.Detect(stream)) return new ExtFileSystem(Partition.Open()); */ return null; } }
private static void ApplyPartDiff(PartitionInfo Base, PartitionInfo Diff) { CopyQueue queue = new CopyQueue(); var BFS = VHDBuilder.DetectFileSystem(Base); var DFS = VHDBuilder.DetectFileSystem(Diff); if (BFS is NtfsFileSystem) { ((NtfsFileSystem)BFS).NtfsOptions.HideHiddenFiles = false; ((NtfsFileSystem)BFS).NtfsOptions.HideSystemFiles = false; } if (DFS is NtfsFileSystem) { ((NtfsFileSystem)DFS).NtfsOptions.HideHiddenFiles = false; ((NtfsFileSystem)DFS).NtfsOptions.HideSystemFiles = false; } var DRoot = DFS.Root; var DFRoots = DRoot.GetDirectories(RootFiles); if (DFRoots.Any()) { var DFileRoot = DFRoots.Single(); foreach (var file in DFileRoot.GetFiles("*.*", SearchOption.AllDirectories)) { var BFile = BFS.GetFileInfo(file.FullName.Substring(RootFiles.Length + 1)); queue.Add(file, BFile); // TODO: fix this for applying diffs!!! } queue.Go(); } var DsysRegs = DRoot.GetDirectories(RootSystemRegistry); if (DsysRegs.Any()) { var DsysReg = DsysRegs.Single(); foreach (var file in DsysReg.GetFiles("*.*", SearchOption.AllDirectories)) { var BReg = BFS.GetFileInfo(file.FullName.Substring(RootSystemRegistry.Length + 1)); if (!BReg.Exists) queue.Add(file, BReg); else { var BHive = new RegistryHive(BReg.Open(FileMode.Open, FileAccess.ReadWrite)); RegDiff.ReadFromStream(file.OpenRead()).ApplyTo(BHive.Root); } } queue.Go(); } var DuserRegs = DRoot.GetDirectories(RootUserRegistry); if (DuserRegs.Any()) { var DuserReg = DuserRegs.Single(); var Bfiles = BFS.GetFiles(String.Empty, "*.*", SearchOption.AllDirectories) .Where(str => UserRegisrtyFiles.IsMatch(str)) .ToArray(); foreach (var file in DuserReg.GetFiles("*.*", SearchOption.AllDirectories)) { var username = DiffUserRegistry.Match(file.FullName).Groups["user"].Value; var userFile = Bfiles.Where(str => GetUserRegex(username).IsMatch(str)).ToArray(); if (!userFile.Any()) continue; var BReg = BFS.GetFileInfo(userFile.Single()); if (!BReg.Exists) continue; var BHive = new RegistryHive(BReg.Open(FileMode.Open, FileAccess.ReadWrite)); RegDiff.ReadFromStream(file.OpenRead()).ApplyTo(BHive.Root); } } }