/// <summary> /// Attempts to initialise a disk treating it as MBR formatted. /// </summary> /// <param name="aDiskDevice">The disk to initialise.</param> /// <returns>True if a valid MBR was detected and the disk was successfully initialised. Otherwise, false.</returns> private static bool InitAsMBR(DiskDevice aDiskDevice) { #if FSM_TRACE BasicConsole.WriteLine("Attempting to read MBR..."); #endif byte[] MBRData = new byte[512]; aDiskDevice.ReadBlock(0UL, 1U, MBRData); #if FSM_TRACE BasicConsole.WriteLine("Read potential MBR data. Attempting to init MBR..."); #endif MBR TheMBR = new MBR(MBRData); if (!TheMBR.IsValid) { return(false); } else { #if FSM_TRACE BasicConsole.WriteLine("Valid MBR found."); #endif ProcessMBR(TheMBR, aDiskDevice); return(true); } }
/// <summary> /// Processes a valid master boot record to initialize its partitions. /// </summary> /// <param name="anMBR">The MBR to process.</param> /// <param name="aDiskDevice">The disk device from which the MBR was read.</param> private static void ProcessMBR(MBR anMBR, DiskDevice aDiskDevice) { for (int i = 0; i < anMBR.NumPartitions; i++) { MBR.PartitionInfo aPartInfo = anMBR.Partitions[i]; if (aPartInfo.EBRLocation != 0) { byte[] EBRData = new byte[512]; aDiskDevice.ReadBlock(aPartInfo.EBRLocation, 1U, EBRData); EBR newEBR = new EBR(EBRData); ProcessMBR(newEBR, aDiskDevice); } else { Partitions.Add(new Partition(aDiskDevice, aPartInfo.StartSector, aPartInfo.SectorCount)); } } }
/// <summary> /// Reads contiguous blocks within the partition. Block 0 = 1st sector of the partition. /// </summary> /// <param name="aBlockNo">The first sector (block) number to read.</param> /// <param name="aBlockCount">The number of sectors (blocks) to read.</param> /// <param name="aData">The buffer to read into.</param> public override void ReadBlock(UInt64 aBlockNo, UInt32 aBlockCount, byte[] aData) { UInt64 DiskBlockNo = StartingSector + aBlockNo; TheDiskDevice.ReadBlock(DiskBlockNo, aBlockCount, aData); }