mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 04:18:43 +00:00
490 lines
10 KiB
C#
490 lines
10 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Cosmos.Sys.FileSystem;
|
|
|
|
namespace Cosmos.Sys.FileSystem.FAT32
|
|
{
|
|
public abstract class BootSector
|
|
{
|
|
protected Partition p;
|
|
protected byte[] Sector;
|
|
|
|
public BootSector(Partition p)
|
|
{
|
|
this.p = p;
|
|
Sector = new byte[p.BlockSize];
|
|
}
|
|
|
|
public byte jmpBoot0
|
|
{
|
|
get
|
|
{
|
|
return Sector[0];
|
|
}
|
|
set
|
|
{
|
|
Sector[0] = value;
|
|
}
|
|
}
|
|
public byte jmpBoot1
|
|
{
|
|
get
|
|
{
|
|
return Sector[1];
|
|
}
|
|
set
|
|
{
|
|
Sector[1] = value;
|
|
}
|
|
}
|
|
public byte jmpBoot2
|
|
{
|
|
get
|
|
{
|
|
return Sector[2];
|
|
}
|
|
set
|
|
{
|
|
Sector[2] = value;
|
|
}
|
|
}
|
|
public byte[] OEMName
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(3, 8);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 3, 8);
|
|
}
|
|
|
|
}
|
|
public ushort BytesPerSec
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 11);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 11);
|
|
}
|
|
}
|
|
public byte SectorsPerCluster
|
|
{
|
|
get
|
|
{
|
|
return Sector[13];
|
|
}
|
|
set
|
|
{
|
|
Sector[13] = value;
|
|
}
|
|
}
|
|
public ushort ReservedSectorCount
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 14);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 14);
|
|
}
|
|
}
|
|
public byte NumberFATs
|
|
{
|
|
get
|
|
{
|
|
return Sector[16];
|
|
}
|
|
set
|
|
{
|
|
Sector[16] = value;
|
|
}
|
|
}
|
|
public ushort RootEntryCount
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 17);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 27);
|
|
}
|
|
}
|
|
public ushort TotalSectors16
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 19);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 19);
|
|
}
|
|
}
|
|
public byte Media
|
|
{
|
|
get
|
|
{
|
|
return Sector[21];
|
|
}
|
|
set { Sector[21] = value; }
|
|
}
|
|
public ushort FATsz16
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 22);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 22);
|
|
}
|
|
}
|
|
public ushort SectorsPerTrack
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 24);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 24);
|
|
}
|
|
}
|
|
public ushort NumberOfHeads
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 26);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 26);
|
|
}
|
|
}
|
|
public uint HiddenSectors
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt32(Sector, 28);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 28);
|
|
}
|
|
}
|
|
public uint TotalSectors32
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt32(Sector, 32);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 32);
|
|
}
|
|
}
|
|
public ushort Signature
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, Sector.Length-2);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), (uint)Sector.Length - 2);
|
|
}
|
|
}
|
|
|
|
public abstract byte DriveNumber
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
public abstract byte Reserved1
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
public abstract byte BootSig
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
public abstract byte[] VolId
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
public abstract byte[] VolLab
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
public abstract byte[] filSysType
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
|
|
protected void SetBytes(byte[] b, uint offset)
|
|
{
|
|
Array.Copy(b, 0, Sector, offset, b.Length);
|
|
}
|
|
protected void SetBytes(byte[] b, uint offset, uint length)
|
|
{
|
|
if (b.Length != length)
|
|
{
|
|
byte[] t = new byte[length];
|
|
Array.Copy(b, t, 0);
|
|
b = t;
|
|
}
|
|
Array.Copy(b, 0, Sector, offset, length);
|
|
}
|
|
protected byte[] GetBytes(uint offset, uint length)
|
|
{
|
|
byte[] t = new byte[length];
|
|
Array.Copy(Sector, offset, t, 0, length);
|
|
return t;
|
|
}
|
|
|
|
public void Refresh()
|
|
{
|
|
p.ReadBlock(0, Sector);
|
|
}
|
|
public void Save()
|
|
{
|
|
p.WriteBlock(0, Sector);
|
|
}
|
|
}
|
|
public class BootSectorFAT12 : BootSector
|
|
{
|
|
public BootSectorFAT12(Partition p) : base(p) { }
|
|
public override byte DriveNumber
|
|
{
|
|
get
|
|
{
|
|
return Sector[36];
|
|
}
|
|
set
|
|
{
|
|
Sector[36] = value;
|
|
}
|
|
}
|
|
public override byte Reserved1
|
|
{
|
|
get
|
|
{
|
|
return Sector[37];
|
|
}
|
|
set
|
|
{
|
|
Sector[37] = value;
|
|
}
|
|
}
|
|
public override byte BootSig
|
|
{
|
|
get
|
|
{
|
|
return Sector[38];
|
|
}
|
|
set
|
|
{
|
|
Sector[38] = value;
|
|
}
|
|
}
|
|
public override byte[] VolId
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(39, 4);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 39, 4);
|
|
}
|
|
}
|
|
public override byte[] VolLab
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(43, 11);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 43, 11);
|
|
}
|
|
}
|
|
public override byte[] filSysType
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(54, 8);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 54, 8);
|
|
}
|
|
}
|
|
}
|
|
public class BootSectorFAT16 : BootSectorFAT12
|
|
{
|
|
public BootSectorFAT16(Partition p) : base(p) { }
|
|
}
|
|
public class BootSectorFAT32 : BootSector
|
|
{
|
|
public BootSectorFAT32(Partition p) : base(p) { }
|
|
public uint BPB_FATSz32
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt32(Sector, 36);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 36);
|
|
}
|
|
}
|
|
public ushort BPB_ExtFlags
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 40);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 40);
|
|
}
|
|
}
|
|
public ushort BPB_FSVer
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 42);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 42);
|
|
}
|
|
}
|
|
public uint BPB_RootClus
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt32(Sector, 44);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 44);
|
|
}
|
|
}
|
|
public ushort BPB_FSInfo
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 48);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 48);
|
|
}
|
|
}
|
|
public ushort BPB_BkBootSec
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Sector, 50);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(BitConverter.GetBytes(value), 50);
|
|
}
|
|
}
|
|
public byte[] BPB_Reserved
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(52, 12);
|
|
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 52, 12);
|
|
}
|
|
}
|
|
public override byte DriveNumber
|
|
{
|
|
get
|
|
{
|
|
return Sector[64];
|
|
}
|
|
set
|
|
{
|
|
Sector[64] = value;
|
|
}
|
|
}
|
|
public override byte Reserved1
|
|
{
|
|
get
|
|
{
|
|
return Sector[65];
|
|
}
|
|
set
|
|
{
|
|
Sector[65] = value;
|
|
}
|
|
}
|
|
public override byte BootSig
|
|
{
|
|
get
|
|
{
|
|
return Sector[66];
|
|
}
|
|
set
|
|
{
|
|
Sector[66] = value;
|
|
}
|
|
}
|
|
public override byte[] VolId
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(67, 4);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 67, 4);
|
|
}
|
|
}
|
|
public override byte[] VolLab
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(71, 11);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 71, 11);
|
|
}
|
|
}
|
|
public override byte[] filSysType
|
|
{
|
|
get
|
|
{
|
|
return GetBytes(82, 8);
|
|
}
|
|
set
|
|
{
|
|
SetBytes(value, 82, 8);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|