/// <summary> /// Initializes a new instance of the <see cref="PartitionDevice"/> class. /// </summary> /// <param name="diskDevice">The disk device.</param> /// <param name="partition">The partition.</param> /// <param name="readOnly">if set to <c>true</c> [read only].</param> public PartitionDevice(IDiskDevice diskDevice, GenericPartition partition, bool readOnly) { this.diskDevice = diskDevice; this.startBlock = partition.StartLBA; this.blockCount = partition.TotalBlocks; this.readOnly = readOnly; base.parent = diskDevice as Device; base.name = base.parent.Name + "/Partition" + (partition.Index + 1).ToString(); // need to give it a unique name base.deviceStatus = DeviceStatus.Online; }
/// <summary> /// Reads the master boot block. /// </summary> /// <returns></returns> public bool Read() { valid = false; if (diskDevice.BlockSize != 512 || diskDevice.TotalBlocks < 3) { return(false); // only going to work with 512 sector sizes and disks more than 2 blocks } data = diskDevice.ReadBlock(0, 1); masterboot = new DataBlock(data); if (masterboot.GetUShort(MBR.MBRSignature) != MBRConstant.MBRSignature) { return(false); } valid = true; diskSignature = masterboot.GetUInt(MBR.DiskSignature); for (uint index = 0; index < MaxMBRPartitions; index++) { uint offset = MBR.FirstPartition + (index * MBRConstant.PartitionSize); Partitions[index] = new GenericPartition(index) { Bootable = masterboot.GetByte(offset + PartitionRecord.Status) == MBRConstant.Bootable, PartitionType = masterboot.GetByte(offset + PartitionRecord.PartitionType), StartLBA = masterboot.GetUInt(offset + PartitionRecord.LBA), TotalBlocks = masterboot.GetUInt(offset + PartitionRecord.Sectors) }; } //TODO: Extended Partitions code = new byte[MBRConstant.CodeAreaSize]; for (uint index = 0; index < MBRConstant.CodeAreaSize; index++) { code[index] = masterboot.GetByte(index); } return(valid); }