mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-20 12:58:39 +00:00
49 lines
1.6 KiB
C#
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, int 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);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|