Cosmos/source2/Kernel/System/Hardware/Cosmos.Hardware/BlockDevice/MBR.cs
kudzu_cp 95393c0c6e
2011-03-03 05:23:44 +00:00

49 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cosmos.Common.Extensions;
namespace Cosmos.Hardware.BlockDevice {
// Its not a BlockDevice, but its related to "fixed" devices
// and necessary to create partition block devices
// Im not comfortable with MBR and Partition being in Hardware ring and would prefer
// them in the system ring, but there are issues relating to moving it there.
public class MBR {
// TODO Lock this so other code cannot add/remove/modify the list
// Can make a locked list class which wraps a list<>
public List<PartInfo> Partitions = new List<PartInfo>();
public class PartInfo {
public readonly byte SystemID;
public readonly UInt32 StartSector;
public readonly UInt32 SectorCount;
public PartInfo(byte aSystemID, UInt32 aStartSector, UInt32 aSectorCount) {
SystemID = aSystemID;
StartSector = aStartSector;
SectorCount = aSectorCount;
}
}
public MBR(byte[] aMBR) {
ParsePartition(aMBR, 446);
ParsePartition(aMBR, 462);
ParsePartition(aMBR, 478);
ParsePartition(aMBR, 494);
}
protected void ParsePartition(byte[] aMBR, UInt32 aLoc) {
byte xSystemID = aMBR[aLoc + 4];
// SystemID = 0 means no partition
if (xSystemID != 0) {
UInt32 xStartSector = aMBR.ToUInt32(aLoc + 8);
UInt32 xSectorCount = aMBR.ToUInt32(aLoc + 12);
var xPartInfo = new PartInfo(xSystemID, xStartSector, xSectorCount);
Partitions.Add(xPartInfo);
}
}
}
}