Ejemplo n.º 1
0
 /// <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;
 }
Ejemplo n.º 2
0
 /// <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;
 }
Ejemplo n.º 3
0
 private static bool IsLdmPartition(PartitionInfo partition)
 {
     return partition.BiosType == BiosPartitionTypes.WindowsDynamicVolume
            || partition.GuidType == GuidPartitionTypes.WindowsLdmMetadata
            || partition.GuidType == GuidPartitionTypes.WindowsLdmData;
 }
Ejemplo n.º 4
0
 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");
     }
 }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
0
        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);
                }
            }
        }