Пример #1
0
        /// <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;
        }
Пример #2
0
        /// <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);
        }