[Aaru.Partitions] Reformat and cleanup.

This commit is contained in:
2023-10-03 23:36:49 +01:00
parent 9c1250ad04
commit 68c16e78fc
25 changed files with 3208 additions and 2505 deletions

View File

@@ -60,7 +60,7 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Spectre.Console" Version="0.47.0" />
<PackageReference Include="Spectre.Console" Version="0.47.0"/>
<PackageReference Include="Unclassified.NetRevisionTask" Version="0.4.3" PrivateAssets="all"/>
</ItemGroup>
<ItemGroup>

View File

@@ -1,5 +1,6 @@
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib"
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xml:space="preserve">
<s:Boolean
x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=localization/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=localization/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@@ -57,10 +57,14 @@ public sealed class Acorn : IPartition
const uint TYPE_MASK = 15;
readonly byte[] _linuxIcsMagic = "LinuxPart"u8.ToArray();
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.Acorn_Name;
/// <inheritdoc />
public Guid Id => new("A7C8FEBE-8D00-4933-B9F3-42184C8BA808");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -77,8 +81,10 @@ public sealed class Acorn : IPartition
return partitions.Count != 0;
}
#endregion
static void GetFileCorePartitions(IMediaImage imagePlugin, List<Partition> partitions, ulong sectorOffset,
ref ulong counter)
ref ulong counter)
{
// RISC OS always checks for the partition on 0. Afaik no emulator chains it.
if(sectorOffset != 0)
@@ -99,12 +105,12 @@ public sealed class Acorn : IPartition
AcornBootBlock bootBlock = Marshal.ByteArrayToStructureLittleEndian<AcornBootBlock>(sector);
int checksum = 0;
var checksum = 0;
for(int i = 0; i < 0x1FF; i++)
for(var i = 0; i < 0x1FF; i++)
checksum = (checksum & 0xFF) + (checksum >> 8) + sector[i];
int heads = bootBlock.discRecord.heads + ((bootBlock.discRecord.lowsector >> 6) & 1);
int heads = bootBlock.discRecord.heads + (bootBlock.discRecord.lowsector >> 6 & 1);
int secCyl = bootBlock.discRecord.spt * heads;
int mapSector = bootBlock.startCylinder * secCyl;
@@ -120,8 +126,8 @@ public sealed class Acorn : IPartition
{
var part = new Partition
{
Size = ((ulong)bootBlock.discRecord.disc_size_high * 0x100000000) + bootBlock.discRecord.disc_size,
Length = (((ulong)bootBlock.discRecord.disc_size_high * 0x100000000) + bootBlock.discRecord.disc_size) /
Size = (ulong)bootBlock.discRecord.disc_size_high * 0x100000000 + bootBlock.discRecord.disc_size,
Length = ((ulong)bootBlock.discRecord.disc_size_high * 0x100000000 + bootBlock.discRecord.disc_size) /
imagePlugin.Info.SectorSize,
Type = Localization.Filecore,
Name = StringHandlers.CToString(bootBlock.discRecord.disc_name, Encoding.GetEncoding("iso-8859-1"))
@@ -150,11 +156,11 @@ public sealed class Acorn : IPartition
Sequence = counter,
Scheme = "Filecore/Linux",
Type = entry.magic switch
{
LINUX_MAGIC => Localization.Linux,
SWAP_MAGIC => Localization.Linux_swap,
_ => Localization.Unknown_partition_type
}
{
LINUX_MAGIC => Localization.Linux,
SWAP_MAGIC => Localization.Linux_swap,
_ => Localization.Unknown_partition_type
}
};
part.Offset = part.Start * (ulong)sector.Length;
@@ -175,6 +181,7 @@ public sealed class Acorn : IPartition
RiscIxTable table = Marshal.ByteArrayToStructureLittleEndian<RiscIxTable>(map);
if(table.magic == RISCIX_MAGIC)
{
foreach(RiscIxEntry entry in table.partitions)
{
var part = new Partition
@@ -196,6 +203,7 @@ public sealed class Acorn : IPartition
partitions.Add(part);
counter++;
}
}
break;
}
@@ -216,10 +224,10 @@ public sealed class Acorn : IPartition
uint icsSum = 0x50617274;
for(int i = 0; i < 508; i++)
for(var i = 0; i < 508; i++)
icsSum += sector[i];
uint discCheck = BitConverter.ToUInt32(sector, 508);
var discCheck = BitConverter.ToUInt32(sector, 508);
if(icsSum != discCheck)
return;
@@ -281,6 +289,23 @@ public sealed class Acorn : IPartition
}
}
#region Nested type: AcornBootBlock
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AcornBootBlock
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x1C0)]
public readonly byte[] spare;
public readonly DiscRecord discRecord;
public readonly byte flags;
public readonly ushort startCylinder;
public readonly byte checksum;
}
#endregion
#region Nested type: DiscRecord
[StructLayout(LayoutKind.Sequential)]
struct DiscRecord
{
@@ -310,17 +335,44 @@ public sealed class Acorn : IPartition
public readonly byte[] reserved;
}
#endregion
#region Nested type: IcsEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AcornBootBlock
struct IcsEntry
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x1C0)]
public readonly byte[] spare;
public readonly DiscRecord discRecord;
public readonly byte flags;
public readonly ushort startCylinder;
public readonly byte checksum;
public readonly uint start;
public readonly int size;
}
#endregion
#region Nested type: IcsTable
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct IcsTable
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly IcsEntry[] entries;
}
#endregion
#region Nested type: LinuxEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct LinuxEntry
{
public readonly uint magic;
public readonly uint start;
public readonly uint size;
}
#endregion
#region Nested type: LinuxTable
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct LinuxTable
{
@@ -330,22 +382,9 @@ public sealed class Acorn : IPartition
public readonly byte[] padding;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct LinuxEntry
{
public readonly uint magic;
public readonly uint start;
public readonly uint size;
}
#endregion
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct RiscIxTable
{
public readonly uint magic;
public readonly uint date;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly RiscIxEntry[] partitions;
}
#region Nested type: RiscIxEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct RiscIxEntry
@@ -357,17 +396,18 @@ public sealed class Acorn : IPartition
public readonly byte[] name;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct IcsTable
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly IcsEntry[] entries;
}
#endregion
#region Nested type: RiscIxTable
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct IcsEntry
struct RiscIxTable
{
public readonly uint start;
public readonly int size;
public readonly uint magic;
public readonly uint date;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly RiscIxEntry[] partitions;
}
#endregion
}

View File

@@ -61,10 +61,14 @@ public sealed class AppleMap : IPartition
const uint HFS_MAGIC_OLD = 0x54465331;
const string MODULE_NAME = "Apple Partition Map (APM) Plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.AppleMap_Name;
/// <inheritdoc />
public Guid Id => new("36405F8D-4F1A-07F5-209C-223D735D6D22");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -89,37 +93,39 @@ public sealed class AppleMap : IPartition
{
case 256:
{
byte[] tmp = new byte[512];
var tmp = new byte[512];
Array.Copy(ddmSector, 0, tmp, 0, 256);
ddmSector = tmp;
maxDrivers = 29;
break;
}
case < 256: return false;
case < 256:
return false;
}
AppleDriverDescriptorMap ddm = Marshal.ByteArrayToStructureBigEndian<AppleDriverDescriptorMap>(ddmSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbSig = 0x{0:X4}", ddm.sbSig);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbSig = 0x{0:X4}", ddm.sbSig);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlockSize = {0}", ddm.sbBlockSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlocks = {0}", ddm.sbBlocks);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevType = {0}", ddm.sbDevType);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevId = {0}", ddm.sbDevId);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlocks = {0}", ddm.sbBlocks);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevType = {0}", ddm.sbDevType);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevId = {0}", ddm.sbDevId);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbData = 0x{0:X8}", ddm.sbData);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDrvrCount = {0}", ddm.sbDrvrCount);
uint sequence = 0;
if(ddm.sbSig == DDM_MAGIC)
{
if(ddm.sbDrvrCount < maxDrivers)
{
ddm.sbMap = new AppleDriverEntry[ddm.sbDrvrCount];
for(int i = 0; i < ddm.sbDrvrCount; i++)
for(var i = 0; i < ddm.sbDrvrCount; i++)
{
byte[] tmp = new byte[8];
Array.Copy(ddmSector, 18 + (i * 8), tmp, 0, 8);
var tmp = new byte[8];
Array.Copy(ddmSector, 18 + i * 8, tmp, 0, 8);
ddm.sbMap[i] = Marshal.ByteArrayToStructureBigEndian<AppleDriverEntry>(tmp);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbMap[{1}].ddBlock = {0}", ddm.sbMap[i].ddBlock,
@@ -152,6 +158,7 @@ public sealed class AppleMap : IPartition
sequence++;
}
}
}
errno = imagePlugin.ReadSector(1 + sectorOffset, out byte[] partSector);
@@ -164,9 +171,9 @@ public sealed class AppleMap : IPartition
// This is the easy one, no sector size mixing
if(oldMap.pdSig == APM_MAGIC_OLD)
{
for(int i = 2; i < partSector.Length; i += 12)
for(var i = 2; i < partSector.Length; i += 12)
{
byte[] tmp = new byte[12];
var tmp = new byte[12];
Array.Copy(partSector, i, tmp, 0, 12);
AppleMapOldPartitionEntry oldEntry =
@@ -217,7 +224,7 @@ public sealed class AppleMap : IPartition
// If sector is bigger than 512
if(ddmSector.Length > 512)
{
byte[] tmp = new byte[512];
var tmp = new byte[512];
Array.Copy(ddmSector, 512, tmp, 0, 512);
entry = Marshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp);
@@ -228,7 +235,7 @@ public sealed class AppleMap : IPartition
entrySize = 512;
entryCount = entry.entries;
skipDdm = 512;
sectorsToRead = ((entryCount + 1) * 512 / sectorSize) + 1;
sectorsToRead = (entryCount + 1) * 512 / sectorSize + 1;
}
else
{
@@ -267,18 +274,18 @@ public sealed class AppleMap : IPartition
if(errno != ErrorNumber.NoError)
return false;
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_size = {0}", entrySize);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_count = {0}", entryCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "skip_ddm = {0}", skipDdm);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_size = {0}", entrySize);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_count = {0}", entryCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "skip_ddm = {0}", skipDdm);
AaruConsole.DebugWriteLine(MODULE_NAME, "sectors_to_read = {0}", sectorsToRead);
byte[] copy = new byte[entries.Length - skipDdm];
var copy = new byte[entries.Length - skipDdm];
Array.Copy(entries, skipDdm, copy, 0, copy.Length);
entries = copy;
for(int i = 0; i < entryCount; i++)
for(var i = 0; i < entryCount; i++)
{
byte[] tmp = new byte[entrySize];
var tmp = new byte[entrySize];
Array.Copy(entries, i * entrySize, tmp, 0, entrySize);
entry = Marshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp);
@@ -287,9 +294,9 @@ public sealed class AppleMap : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].signature = 0x{1:X4}", i, entry.signature);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].reserved1 = 0x{1:X4}", i, entry.reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].entries = {1}", i, entry.entries);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].start = {1}", i, entry.start);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].sectors = {1}", i, entry.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].entries = {1}", i, entry.entries);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].start = {1}", i, entry.start);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].sectors = {1}", i, entry.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].name = \"{1}\"", i,
StringHandlers.CToString(entry.name));
@@ -301,7 +308,7 @@ public sealed class AppleMap : IPartition
entry.first_data_block);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].data_sectors = {1}", i, entry.data_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].flags = {1}", i, (AppleMapFlags)entry.flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].flags = {1}", i, (AppleMapFlags)entry.flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].first_boot_block = {1}", i,
entry.first_boot_block);
@@ -338,8 +345,8 @@ public sealed class AppleMap : IPartition
Name = StringHandlers.CToString(entry.name),
Offset = entry.start * entrySize,
Size = entry.sectors * entrySize,
Start = (entry.start * entrySize / sectorSize) + sectorOffset,
Length = entry.sectors * entrySize / sectorSize,
Start = entry.start * entrySize / sectorSize + sectorOffset,
Length = entry.sectors * entrySize / sectorSize,
Scheme = Name
};
@@ -398,14 +405,20 @@ public sealed class AppleMap : IPartition
sequence++;
}
else
{
AaruConsole.DebugWriteLine(MODULE_NAME,
Localization.Not_adding_partition_because_start_0_is_outside_media_size_1,
partition.Start, imagePlugin.Info.Sectors - 1);
}
}
return partitions.Count > 0;
}
#endregion
#region Nested type: AppleDriverDescriptorMap
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleDriverDescriptorMap
{
@@ -428,6 +441,10 @@ public sealed class AppleMap : IPartition
public AppleDriverEntry[] sbMap;
}
#endregion
#region Nested type: AppleDriverEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleDriverEntry
{
@@ -439,26 +456,9 @@ public sealed class AppleMap : IPartition
public readonly ushort ddType;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleOldDevicePartitionMap
{
/// <summary>Signature <see cref="APM_MAGIC_OLD" /></summary>
public readonly ushort pdSig;
/// <summary>Entries of the driver descriptor</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 42)]
public readonly AppleMapOldPartitionEntry[] pdMap;
}
#endregion
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleMapOldPartitionEntry
{
/// <summary>First sector of the partition</summary>
public readonly uint pdStart;
/// <summary>Number of sectors of the partition</summary>
public readonly uint pdSize;
/// <summary>Partition type</summary>
public readonly uint pdFSID;
}
#region Nested type: AppleMapFlags
[Flags]
enum AppleMapFlags : uint
@@ -489,6 +489,25 @@ public sealed class AppleMap : IPartition
Reserved = 0xBFFFFC00
}
#endregion
#region Nested type: AppleMapOldPartitionEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleMapOldPartitionEntry
{
/// <summary>First sector of the partition</summary>
public readonly uint pdStart;
/// <summary>Number of sectors of the partition</summary>
public readonly uint pdSize;
/// <summary>Partition type</summary>
public readonly uint pdFSID;
}
#endregion
#region Nested type: AppleMapPartitionEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleMapPartitionEntry
{
@@ -535,4 +554,20 @@ public sealed class AppleMap : IPartition
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public readonly uint[] boot_arguments;
}
#endregion
#region Nested type: AppleOldDevicePartitionMap
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleOldDevicePartitionMap
{
/// <summary>Signature <see cref="APM_MAGIC_OLD" /></summary>
public readonly ushort pdSig;
/// <summary>Entries of the driver descriptor</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 42)]
public readonly AppleMapOldPartitionEntry[] pdMap;
}
#endregion
}

View File

@@ -46,11 +46,8 @@ namespace Aaru.Partitions;
/// <summary>Implements decoding of Apricot partitions</summary>
public sealed class Apricot : IPartition
{
const string MODULE_NAME = "Apricot partitions plugin";
readonly int[] _baudRates =
{
50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200
};
const string MODULE_NAME = "Apricot partitions plugin";
readonly int[] _baudRates = { 50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200 };
readonly string[] _bootTypeCodes =
{
Localization.Non_bootable, Localization.Apricot_XI_RAM_BIOS, Localization.Generic_ROM_BIOS,
@@ -60,14 +57,8 @@ public sealed class Apricot : IPartition
{
Localization.MF1DD_70_track, "MF1DD", "MF2DD", "Winchester 5M", "Winchester 10M", "Winchester 20M"
};
readonly int[] _lineModes =
{
256, 200
};
readonly int[] _lineWidths =
{
80, 40
};
readonly int[] _lineModes = { 256, 200 };
readonly int[] _lineWidths = { 80, 40 };
readonly string[] _operatingSystemCodes =
{
Localization.Invalid_operating_system, "MS-DOS", "UCSD Pascal", Localization.CPM, "Concurrent CP/M"
@@ -77,19 +68,17 @@ public sealed class Apricot : IPartition
Localization.None_parity, Localization.Odd_parity, Localization.Even_parity, Localization.Mark_parity,
Localization.Space_parity
};
readonly string[] _printDevices =
{
Localization.Parallel_print_device, Localization.Serial_print_device
};
readonly double[] _stopBits =
{
1, 1.5, 2
};
readonly string[] _printDevices = { Localization.Parallel_print_device, Localization.Serial_print_device };
readonly double[] _stopBits = { 1, 1.5, 2 };
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.Apricot_Name;
/// <inheritdoc />
public Guid Id => new("8CBF5864-7B5A-47A0-8CEB-199C74FA22DE");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -130,31 +119,32 @@ public sealed class Apricot : IPartition
: Localization.Unknown_operating_system);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.writeProtected = {0}", label.writeProtected);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyProtected = {0}", label.copyProtected);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyProtected = {0}", label.copyProtected);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootType = {0} ({1})", label.bootType,
label.bootType < _bootTypeCodes.Length ? _bootTypeCodes[label.bootType]
label.bootType < _bootTypeCodes.Length
? _bootTypeCodes[label.bootType]
: Localization.Unknown_boot_type);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitionCount = {0}", label.partitionCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.winchester = {0}", label.winchester);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.sectorSize = {0}", label.sectorSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spt = {0}", label.spt);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.cylinders = {0}", label.cylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.heads = {0}", label.heads);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.interleave = {0}", label.interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.skew = {0}", label.skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootLocation = {0}", label.bootLocation);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootSize = {0}", label.bootSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitionCount = {0}", label.partitionCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.winchester = {0}", label.winchester);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.sectorSize = {0}", label.sectorSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spt = {0}", label.spt);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.cylinders = {0}", label.cylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.heads = {0}", label.heads);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.interleave = {0}", label.interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.skew = {0}", label.skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootLocation = {0}", label.bootLocation);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootSize = {0}", label.bootSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootAddress = 0x{0:X8}", label.bootAddress);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootOffset:label.bootSegment = {0:X4}:{1:X4}",
label.bootOffset, label.bootSegment);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.firstDataBlock = {0}", label.firstDataBlock);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.generation = {0}", label.generation);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyCount = {0}", label.copyCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.maxCopies = {0}", label.maxCopies);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.generation = {0}", label.generation);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyCount = {0}", label.copyCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.maxCopies = {0}", label.maxCopies);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.serialNumber = \"{0}\"",
StringHandlers.CToString(label.serialNumber));
@@ -165,18 +155,19 @@ public sealed class Apricot : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyright = \"{0}\"",
StringHandlers.CToString(label.copyright));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.bps = {0}", label.mainBPB.bps);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spc = {0}", label.mainBPB.spc);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.bps = {0}", label.mainBPB.bps);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spc = {0}", label.mainBPB.spc);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.rsectors = {0}", label.mainBPB.rsectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.fats_no = {0}", label.mainBPB.fats_no);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.fats_no = {0}", label.mainBPB.fats_no);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.root_ent = {0}", label.mainBPB.root_ent);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.sectors = {0}", label.mainBPB.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.media = {0}", label.mainBPB.media);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spfat = {0}", label.mainBPB.spfat);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.sectors = {0}", label.mainBPB.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.media = {0}", label.mainBPB.media);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spfat = {0}", label.mainBPB.spfat);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.diskType = {0} ({1})", label.mainBPB.diskType,
label.mainBPB.diskType < _diskTypeCodes.Length
? _diskTypeCodes[label.mainBPB.diskType] : Localization.Unknown_disk_type);
? _diskTypeCodes[label.mainBPB.diskType]
: Localization.Unknown_disk_type);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.startSector = {0}", label.mainBPB.startSector);
@@ -188,23 +179,24 @@ public sealed class Apricot : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosMajorVersion = {0}", label.biosMajorVersion);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosMinorVersion = {0}", label.biosMinorVersion);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.diagnosticsFlag = {0}", label.diagnosticsFlag);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.diagnosticsFlag = {0}", label.diagnosticsFlag);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.prnDevice = {0} ({1})", label.prnDevice,
label.prnDevice < _printDevices.Length ? _printDevices[label.prnDevice]
label.prnDevice < _printDevices.Length
? _printDevices[label.prnDevice]
: Localization.Unknown_print_device);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bellVolume = {0}", label.bellVolume);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableCache = {0}", label.enableCache);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableGraphics = {0}", label.enableGraphics);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosLength = {0}", label.dosLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontLength = {0}", label.fontLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardLength = {0}", label.keyboardLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosStart = {0}", label.dosStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontStart = {0}", label.fontStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardStart = {0}", label.keyboardStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardVolume = {0}", label.keyboardVolume);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeat = {0}", label.autorepeat);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bellVolume = {0}", label.bellVolume);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableCache = {0}", label.enableCache);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableGraphics = {0}", label.enableGraphics);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosLength = {0}", label.dosLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontLength = {0}", label.fontLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardLength = {0}", label.keyboardLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosStart = {0}", label.dosStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontStart = {0}", label.fontStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardStart = {0}", label.keyboardStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardVolume = {0}", label.keyboardVolume);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeat = {0}", label.autorepeat);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeatLeadIn = {0}", label.autorepeatLeadIn);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeatInterval = {0}", label.autorepeatInterval);
@@ -240,18 +232,19 @@ public sealed class Apricot : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parityCheck = {0}", label.parityCheck);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parityType = {0} ({1})", label.parityType,
label.parityType < _parityTypes.Length ? _parityTypes[label.parityType]
label.parityType < _parityTypes.Length
? _parityTypes[label.parityType]
: Localization.Unknown_parity_type);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.txXonXoff = {0}", label.txXonXoff);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoff = {0}", label.rxXonXoff);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xonCharacter = {0}", label.xonCharacter);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xoffCharacter = {0}", label.xoffCharacter);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.txXonXoff = {0}", label.txXonXoff);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoff = {0}", label.rxXonXoff);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xonCharacter = {0}", label.xonCharacter);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xoffCharacter = {0}", label.xoffCharacter);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoffBuffer = {0}", label.rxXonXoffBuffer);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dtrDsr = {0}", label.dtrDsr);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.ctsRts = {0}", label.ctsRts);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterCr = {0}", label.nullsAfterCr);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterFF = {0}", label.nullsAfterFF);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dtrDsr = {0}", label.dtrDsr);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.ctsRts = {0}", label.ctsRts);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterCr = {0}", label.nullsAfterCr);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterFF = {0}", label.nullsAfterFF);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCRSerial = {0}", label.lfAfterCRSerial);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportSerial = {0}",
@@ -261,9 +254,9 @@ public sealed class Apricot : IPartition
ArrayHelpers.ArrayIsNullOrEmpty(label.spareSerial));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCrParallel = {0}", label.lfAfterCrParallel);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.selectLine = {0}", label.selectLine);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.paperEmpty = {0}", label.paperEmpty);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.faultLine = {0}", label.faultLine);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.selectLine = {0}", label.selectLine);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.paperEmpty = {0}", label.paperEmpty);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.faultLine = {0}", label.faultLine);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportParallel = {0}",
label.biosErrorReportParallel);
@@ -274,16 +267,16 @@ public sealed class Apricot : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareWinchester is null? = {0}",
ArrayHelpers.ArrayIsNullOrEmpty(label.spareWinchester));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parkingEnabled = {0}", label.parkingEnabled);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parkingEnabled = {0}", label.parkingEnabled);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.formatProtection = {0}", label.formatProtection);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareRamDisk is null? = {0}",
ArrayHelpers.ArrayIsNullOrEmpty(label.spareRamDisk));
for(int i = 0; i < 32; i++)
for(var i = 0; i < 32; i++)
AaruConsole.DebugWriteLine(MODULE_NAME, "label.badBlocks[{1}] = {0}", label.badBlocks[i], i);
for(int i = 0; i < 8; i++)
for(var i = 0; i < 8; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitions[{1}].bps = {0}", label.partitions[i].bps,
i);
@@ -349,6 +342,10 @@ public sealed class Apricot : IPartition
return partitions.Count > 0;
}
#endregion
#region Nested type: Label
/// <summary>Apricot Label.</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Label
@@ -560,6 +557,10 @@ public sealed class Apricot : IPartition
public readonly bool cpmDoubleSided;
}
#endregion
#region Nested type: ParameterBlock
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct ParameterBlock
{
@@ -584,4 +585,6 @@ public sealed class Apricot : IPartition
/// <summary>Volume starting sector</summary>
public readonly ushort startSector;
}
#endregion
}

View File

@@ -61,10 +61,14 @@ public sealed class AtariPartitions : IPartition
const uint TYPE_MINIX2 = 0x004D4E58;
const string MODULE_NAME = "Atari partitions plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.AtariPartitions_Name;
/// <inheritdoc />
public Guid Id => new("d1dd0f24-ec39-4c4d-9072-be31919a3b5e");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -89,22 +93,22 @@ public sealed class AtariPartitions : IPartition
Array.Copy(sector, 0, table.Boot, 0, 342);
for(int i = 0; i < 8; i++)
for(var i = 0; i < 8; i++)
{
table.IcdEntries[i].Type = BigEndianBitConverter.ToUInt32(sector, 342 + (i * 12) + 0);
table.IcdEntries[i].Start = BigEndianBitConverter.ToUInt32(sector, 342 + (i * 12) + 4);
table.IcdEntries[i].Length = BigEndianBitConverter.ToUInt32(sector, 342 + (i * 12) + 8);
table.IcdEntries[i].Type = BigEndianBitConverter.ToUInt32(sector, 342 + i * 12 + 0);
table.IcdEntries[i].Start = BigEndianBitConverter.ToUInt32(sector, 342 + i * 12 + 4);
table.IcdEntries[i].Length = BigEndianBitConverter.ToUInt32(sector, 342 + i * 12 + 8);
}
Array.Copy(sector, 438, table.Unused, 0, 12);
table.Size = BigEndianBitConverter.ToUInt32(sector, 450);
for(int i = 0; i < 4; i++)
for(var i = 0; i < 4; i++)
{
table.Entries[i].Type = BigEndianBitConverter.ToUInt32(sector, 454 + (i * 12) + 0);
table.Entries[i].Start = BigEndianBitConverter.ToUInt32(sector, 454 + (i * 12) + 4);
table.Entries[i].Length = BigEndianBitConverter.ToUInt32(sector, 454 + (i * 12) + 8);
table.Entries[i].Type = BigEndianBitConverter.ToUInt32(sector, 454 + i * 12 + 0);
table.Entries[i].Start = BigEndianBitConverter.ToUInt32(sector, 454 + i * 12 + 4);
table.Entries[i].Length = BigEndianBitConverter.ToUInt32(sector, 454 + i * 12 + 8);
}
table.BadStart = BigEndianBitConverter.ToUInt32(sector, 502);
@@ -115,7 +119,7 @@ public sealed class AtariPartitions : IPartition
sha1Ctx.Update(table.Boot);
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Boot_code_SHA1_0, sha1Ctx.End());
for(int i = 0; i < 8; i++)
for(var i = 0; i < 8; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, Markup.Escape("table.icdEntries[{0}].flag = 0x{1:X2}"),
i, (table.IcdEntries[i].Type & 0xFF000000) >> 24);
@@ -132,7 +136,7 @@ public sealed class AtariPartitions : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size = {0}", table.Size);
for(int i = 0; i < 4; i++)
for(var i = 0; i < 4; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, Markup.Escape("table.entries[{0}].flag = 0x{1:X2}"), i,
(table.Entries[i].Type & 0xFF000000) >> 24);
@@ -147,14 +151,14 @@ public sealed class AtariPartitions : IPartition
table.Entries[i].Length);
}
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badStart = {0}", table.BadStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badLength = {0}", table.BadLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badStart = {0}", table.BadStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badLength = {0}", table.BadLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.checksum = 0x{0:X4}", table.Checksum);
bool validTable = false;
var validTable = false;
ulong partitionSequence = 0;
for(int i = 0; i < 4; i++)
for(var i = 0; i < 4; i++)
{
uint type = table.Entries[i].Type & 0x00FFFFFF;
@@ -176,15 +180,17 @@ public sealed class AtariPartitions : IPartition
if(table.Entries[i].Start <= imagePlugin.Info.Sectors)
{
if(table.Entries[i].Start + table.Entries[i].Length > imagePlugin.Info.Sectors)
{
AaruConsole.DebugWriteLine(MODULE_NAME,
Localization.WARNING_End_of_partition_goes_beyond_device_size);
}
ulong sectorSize = imagePlugin.Info.SectorSize;
if(sectorSize is 2448 or 2352)
sectorSize = 2048;
byte[] partType = new byte[3];
var partType = new byte[3];
partType[0] = (byte)((type & 0xFF0000) >> 16);
partType[1] = (byte)((type & 0x00FF00) >> 8);
partType[2] = (byte)(type & 0x0000FF);
@@ -266,19 +272,19 @@ public sealed class AtariPartitions : IPartition
Entries = new AtariEntry[4]
};
for(int j = 0; j < 4; j++)
for(var j = 0; j < 4; j++)
{
extendedTable.Entries[j].Type =
BigEndianBitConverter.ToUInt32(extendedSector, 454 + (j * 12) + 0);
BigEndianBitConverter.ToUInt32(extendedSector, 454 + j * 12 + 0);
extendedTable.Entries[j].Start =
BigEndianBitConverter.ToUInt32(extendedSector, 454 + (j * 12) + 4);
BigEndianBitConverter.ToUInt32(extendedSector, 454 + j * 12 + 4);
extendedTable.Entries[j].Length =
BigEndianBitConverter.ToUInt32(extendedSector, 454 + (j * 12) + 8);
BigEndianBitConverter.ToUInt32(extendedSector, 454 + j * 12 + 8);
}
for(int j = 0; j < 4; j++)
for(var j = 0; j < 4; j++)
{
uint extendedType = extendedTable.Entries[j].Type & 0x00FFFFFF;
@@ -301,15 +307,17 @@ public sealed class AtariPartitions : IPartition
continue;
if(extendedTable.Entries[j].Start + extendedTable.Entries[j].Length > imagePlugin.Info.Sectors)
{
AaruConsole.DebugWriteLine(MODULE_NAME,
Localization.WARNING_End_of_partition_goes_beyond_device_size);
}
ulong sectorSize = imagePlugin.Info.SectorSize;
if(sectorSize is 2448 or 2352)
sectorSize = 2048;
byte[] partType = new byte[3];
var partType = new byte[3];
partType[0] = (byte)((extendedType & 0xFF0000) >> 16);
partType[1] = (byte)((extendedType & 0x00FF00) >> 8);
partType[2] = (byte)(extendedType & 0x0000FF);
@@ -386,7 +394,7 @@ public sealed class AtariPartitions : IPartition
if(!validTable)
return partitions.Count > 0;
for(int i = 0; i < 8; i++)
for(var i = 0; i < 8; i++)
{
uint type = table.IcdEntries[i].Type & 0x00FFFFFF;
@@ -407,15 +415,17 @@ public sealed class AtariPartitions : IPartition
continue;
if(table.IcdEntries[i].Start + table.IcdEntries[i].Length > imagePlugin.Info.Sectors)
{
AaruConsole.DebugWriteLine(MODULE_NAME,
Localization.WARNING_End_of_partition_goes_beyond_device_size);
}
ulong sectorSize = imagePlugin.Info.SectorSize;
if(sectorSize is 2448 or 2352)
sectorSize = 2048;
byte[] partType = new byte[3];
var partType = new byte[3];
partType[0] = (byte)((type & 0xFF0000) >> 16);
partType[1] = (byte)((type & 0x00FF00) >> 8);
partType[2] = (byte)(type & 0x0000FF);
@@ -488,6 +498,10 @@ public sealed class AtariPartitions : IPartition
return partitions.Count > 0;
}
#endregion
#region Nested type: AtariEntry
/// <summary>Atari partition entry</summary>
struct AtariEntry
{
@@ -499,6 +513,10 @@ public sealed class AtariPartitions : IPartition
public uint Length;
}
#endregion
#region Nested type: AtariTable
struct AtariTable
{
/// <summary>Boot code for 342 bytes</summary>
@@ -518,4 +536,6 @@ public sealed class AtariPartitions : IPartition
/// <summary>Checksum for bootable disks</summary>
public ushort Checksum;
}
#endregion
}

View File

@@ -55,20 +55,18 @@ public sealed class BSD : IPartition
const uint MAX_LABEL_SIZE = 500;
const string MODULE_NAME = "BSD disklabel plugin";
/// <summary>Known sector locations for BSD disklabel</summary>
readonly ulong[] _labelLocations =
{
0, 1, 2, 9
};
readonly ulong[] _labelLocations = { 0, 1, 2, 9 };
/// <summary>Known byte offsets for BSD disklabel</summary>
readonly uint[] _labelOffsets =
{
0, 9, 64, 128, 516
};
readonly uint[] _labelOffsets = { 0, 9, 64, 128, 516 };
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.BSD_Name;
/// <inheritdoc />
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -81,8 +79,8 @@ public sealed class BSD : IPartition
if((MAX_LABEL_SIZE + _labelOffsets.Last()) % imagePlugin.Info.SectorSize > 0)
run++;
var dl = new DiskLabel();
bool found = false;
var dl = new DiskLabel();
var found = false;
foreach(ulong location in _labelLocations)
{
@@ -96,7 +94,7 @@ public sealed class BSD : IPartition
foreach(uint offset in _labelOffsets)
{
byte[] sector = new byte[MAX_LABEL_SIZE];
var sector = new byte[MAX_LABEL_SIZE];
if(offset + MAX_LABEL_SIZE > tmp.Length)
break;
@@ -128,46 +126,46 @@ public sealed class BSD : IPartition
if(dl is { d_magic: DISK_CIGAM, d_magic2: DISK_CIGAM })
dl = SwapDiskLabel(dl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_type = {0}", dl.d_type);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_subtype = {0}", dl.d_subtype);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_typename = {0}", StringHandlers.CToString(dl.d_typename));
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_packname = {0}", StringHandlers.CToString(dl.d_packname));
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secsize = {0}", dl.d_secsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_nsectors = {0}", dl.d_nsectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ntracks = {0}", dl.d_ntracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ncylinders = {0}", dl.d_ncylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secpercyl = {0}", dl.d_secpercyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secperunit = {0}", dl.d_secperunit);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_type = {0}", dl.d_type);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_subtype = {0}", dl.d_subtype);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_typename = {0}", StringHandlers.CToString(dl.d_typename));
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_packname = {0}", StringHandlers.CToString(dl.d_packname));
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secsize = {0}", dl.d_secsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_nsectors = {0}", dl.d_nsectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ntracks = {0}", dl.d_ntracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ncylinders = {0}", dl.d_ncylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secpercyl = {0}", dl.d_secpercyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secperunit = {0}", dl.d_secperunit);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sparespertrack = {0}", dl.d_sparespertrack);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sparespercyl = {0}", dl.d_sparespercyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_acylinders = {0}", dl.d_acylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_rpm = {0}", dl.d_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_interleave = {0}", dl.d_interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trackskew = {0}", dl.d_trackskew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_cylskeew = {0}", dl.d_cylskeew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_headswitch = {0}", dl.d_headswitch);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trkseek = {0}", dl.d_trkseek);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_flags = {0}", dl.d_flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[0] = {0}", dl.d_drivedata[0]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[1] = {0}", dl.d_drivedata[1]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[2] = {0}", dl.d_drivedata[2]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[3] = {0}", dl.d_drivedata[3]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[4] = {0}", dl.d_drivedata[4]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[0] = {0}", dl.d_spare[0]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[1] = {0}", dl.d_spare[1]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[2] = {0}", dl.d_spare[2]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[3] = {0}", dl.d_spare[3]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[4] = {0}", dl.d_spare[4]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_magic2 = 0x{0:X8}", dl.d_magic2);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_checksum = 0x{0:X8}", dl.d_checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_npartitions = {0}", dl.d_npartitions);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_bbsize = {0}", dl.d_bbsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sbsize = {0}", dl.d_sbsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sparespercyl = {0}", dl.d_sparespercyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_acylinders = {0}", dl.d_acylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_rpm = {0}", dl.d_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_interleave = {0}", dl.d_interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trackskew = {0}", dl.d_trackskew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_cylskeew = {0}", dl.d_cylskeew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_headswitch = {0}", dl.d_headswitch);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trkseek = {0}", dl.d_trkseek);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_flags = {0}", dl.d_flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[0] = {0}", dl.d_drivedata[0]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[1] = {0}", dl.d_drivedata[1]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[2] = {0}", dl.d_drivedata[2]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[3] = {0}", dl.d_drivedata[3]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[4] = {0}", dl.d_drivedata[4]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[0] = {0}", dl.d_spare[0]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[1] = {0}", dl.d_spare[1]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[2] = {0}", dl.d_spare[2]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[3] = {0}", dl.d_spare[3]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[4] = {0}", dl.d_spare[4]);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_magic2 = 0x{0:X8}", dl.d_magic2);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_checksum = 0x{0:X8}", dl.d_checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_npartitions = {0}", dl.d_npartitions);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_bbsize = {0}", dl.d_bbsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sbsize = {0}", dl.d_sbsize);
ulong counter = 0;
bool addSectorOffset = false;
var addSectorOffset = false;
for(int i = 0; i < dl.d_npartitions && i < 22; i++)
for(var i = 0; i < dl.d_npartitions && i < 22; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_partitions[i].p_offset = {0}", dl.d_partitions[i].p_offset);
@@ -210,40 +208,71 @@ public sealed class BSD : IPartition
return partitions.Count > 0;
}
#endregion
internal static string FSTypeToString(fsType typ)
{
switch(typ)
{
case fsType.Unused: return Localization.Unused_entry;
case fsType.Swap: return Localization.Swap_partition;
case fsType.V6: return Localization.UNIX_6th_Edition;
case fsType.V7: return Localization.UNIX_7th_Edition;
case fsType.SystemV: return Localization.UNIX_System_V;
case fsType.V7_1K: return Localization.UNIX_7th_Edition_with_1K_blocks;
case fsType.V8: return Localization.UNIX_8th_Edition_with_4K_blocks;
case fsType.BSDFFS: return Localization._4_2_BSD_Fast_File_System;
case fsType.BSDLFS: return Localization._4_4_LFS;
case fsType.HPFS: return Localization.HPFS;
case fsType.ISO9660: return Localization.ISO9660;
case fsType.Unused:
return Localization.Unused_entry;
case fsType.Swap:
return Localization.Swap_partition;
case fsType.V6:
return Localization.UNIX_6th_Edition;
case fsType.V7:
return Localization.UNIX_7th_Edition;
case fsType.SystemV:
return Localization.UNIX_System_V;
case fsType.V7_1K:
return Localization.UNIX_7th_Edition_with_1K_blocks;
case fsType.V8:
return Localization.UNIX_8th_Edition_with_4K_blocks;
case fsType.BSDFFS:
return Localization._4_2_BSD_Fast_File_System;
case fsType.BSDLFS:
return Localization._4_4_LFS;
case fsType.HPFS:
return Localization.HPFS;
case fsType.ISO9660:
return Localization.ISO9660;
case fsType.Boot:
case fsType.SysVBoot: return Localization.Boot;
case fsType.AFFS: return Localization.Amiga_FFS;
case fsType.HFS: return Localization.Apple_HFS;
case fsType.ADVfs: return Localization.Digital_Advanced_File_System;
case fsType.LSMpublic: return Localization.Digital_LSM_Public_Region;
case fsType.LSMprivate: return Localization.Digital_LSM_Private_Region;
case fsType.LSMsimple: return Localization.Digital_LSM_Simple_Disk;
case fsType.CCD: return Localization.Concatenated_disk;
case fsType.JFS2: return Localization.IBM_JFS2;
case fsType.HAMMER: return Localization.Hammer;
case fsType.HAMMER2: return Localization.Hammer2;
case fsType.UDF: return Localization.UDF;
case fsType.EFS: return Localization.EFS;
case fsType.ZFS: return Localization.ZFS;
case fsType.NANDFS: return Localization.FreeBSD_nandfs;
case fsType.MSDOS: return Localization.FAT;
case fsType.Other: return Localization.Other_or_unknown;
default: return Localization.Unknown_partition_type;
case fsType.SysVBoot:
return Localization.Boot;
case fsType.AFFS:
return Localization.Amiga_FFS;
case fsType.HFS:
return Localization.Apple_HFS;
case fsType.ADVfs:
return Localization.Digital_Advanced_File_System;
case fsType.LSMpublic:
return Localization.Digital_LSM_Public_Region;
case fsType.LSMprivate:
return Localization.Digital_LSM_Private_Region;
case fsType.LSMsimple:
return Localization.Digital_LSM_Simple_Disk;
case fsType.CCD:
return Localization.Concatenated_disk;
case fsType.JFS2:
return Localization.IBM_JFS2;
case fsType.HAMMER:
return Localization.Hammer;
case fsType.HAMMER2:
return Localization.Hammer2;
case fsType.UDF:
return Localization.UDF;
case fsType.EFS:
return Localization.EFS;
case fsType.ZFS:
return Localization.ZFS;
case fsType.NANDFS:
return Localization.FreeBSD_nandfs;
case fsType.MSDOS:
return Localization.FAT;
case fsType.Other:
return Localization.Other_or_unknown;
default:
return Localization.Unknown_partition_type;
}
}
@@ -251,18 +280,142 @@ public sealed class BSD : IPartition
{
dl = (DiskLabel)Marshal.SwapStructureMembersEndian(dl);
for(int i = 0; i < dl.d_drivedata.Length; i++)
for(var i = 0; i < dl.d_drivedata.Length; i++)
dl.d_drivedata[i] = Swapping.Swap(dl.d_drivedata[i]);
for(int i = 0; i < dl.d_spare.Length; i++)
for(var i = 0; i < dl.d_spare.Length; i++)
dl.d_spare[i] = Swapping.Swap(dl.d_spare[i]);
for(int i = 0; i < dl.d_partitions.Length; i++)
for(var i = 0; i < dl.d_partitions.Length; i++)
dl.d_partitions[i] = (BSDPartition)Marshal.SwapStructureMembersEndian(dl.d_partitions[i]);
return dl;
}
#region Nested type: BSDPartition
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct BSDPartition
{
/// <summary>Sectors in partition</summary>
public readonly uint p_size;
/// <summary>Starting sector</summary>
public readonly uint p_offset;
/// <summary>Fragment size</summary>
public readonly uint p_fsize;
/// <summary>Filesystem type, <see cref="fsType" /></summary>
public readonly fsType p_fstype;
/// <summary>Fragment size</summary>
public readonly byte p_frag;
/// <summary>Cylinder per group</summary>
public readonly ushort p_cpg;
}
#endregion
#region Nested type: dFlags
/// <summary>Drive flags</summary>
[SuppressMessage("ReSharper", "InconsistentNaming")]
[Flags]
enum dFlags : uint
{
/// <summary>Removable media</summary>
Removable = 0x01,
/// <summary>Drive supports ECC</summary>
ECC = 0x02,
/// <summary>Drive supports bad sector forwarding</summary>
BadSectorForward = 0x04,
/// <summary>Disk emulator</summary>
RAMDisk = 0x08,
/// <summary>Can do back to back transfer</summary>
Chain = 0x10,
/// <summary>Dynamic geometry device</summary>
DynamicGeometry = 0x20
}
#endregion
#region Nested type: DiskLabel
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct DiskLabel
{
/// <summary>
/// <see cref="BSD.DISK_MAGIC" />
/// </summary>
public readonly uint d_magic;
/// <summary>
/// <see cref="dType" />
/// </summary>
public readonly dType d_type;
/// <summary>Disk subtype</summary>
public readonly ushort d_subtype;
/// <summary>Type name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] d_typename;
/// <summary>Pack identifier</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] d_packname;
/// <summary>Bytes per sector</summary>
public readonly uint d_secsize;
/// <summary>Sectors per track</summary>
public readonly uint d_nsectors;
/// <summary>Tracks per cylinder</summary>
public readonly uint d_ntracks;
/// <summary>Cylinders per unit</summary>
public readonly uint d_ncylinders;
/// <summary>Sectors per cylinder</summary>
public readonly uint d_secpercyl;
/// <summary>Sectors per unit</summary>
public readonly uint d_secperunit;
/// <summary>Spare sectors per track</summary>
public readonly ushort d_sparespertrack;
/// <summary>Spare sectors per cylinder</summary>
public readonly ushort d_sparespercyl;
/// <summary>Alternate cylinders</summary>
public readonly uint d_acylinders;
/// <summary>Rotational speed</summary>
public readonly ushort d_rpm;
/// <summary>Hardware sector interleave</summary>
public readonly ushort d_interleave;
/// <summary>Sector 0 skew per track</summary>
public readonly ushort d_trackskew;
/// <summary>Sector 0 sker per cylinder</summary>
public readonly ushort d_cylskeew;
/// <summary>Head switch time in microseconds</summary>
public readonly uint d_headswitch;
/// <summary>Track to track seek in microseconds</summary>
public readonly uint d_trkseek;
/// <summary>
/// <see cref="dFlags" />
/// </summary>
public readonly dFlags d_flags;
/// <summary>Drive-specific information</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public readonly uint[] d_drivedata;
/// <summary>Reserved</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public readonly uint[] d_spare;
/// <summary><see cref="BSD.DISK_MAGIC" /> again</summary>
public readonly uint d_magic2;
/// <summary>XOR of data</summary>
public readonly ushort d_checksum;
/// <summary>How many partitions</summary>
public readonly ushort d_npartitions;
/// <summary>Size of boot area in bytes</summary>
public readonly uint d_bbsize;
/// <summary>Maximum size of superblock in bytes</summary>
public readonly uint d_sbsize;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public readonly BSDPartition[] d_partitions;
}
#endregion
#region Nested type: dType
/// <summary>Drive type</summary>
[SuppressMessage("ReSharper", "InconsistentNaming")]
enum dType : ushort
@@ -313,6 +466,10 @@ public sealed class BSD : IPartition
MD = 22
}
#endregion
#region Nested type: fsType
/// <summary>Filesystem type</summary>
[SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum fsType : byte
@@ -393,112 +550,5 @@ public sealed class BSD : IPartition
NANDFS = 30
}
/// <summary>Drive flags</summary>
[SuppressMessage("ReSharper", "InconsistentNaming"), Flags]
enum dFlags : uint
{
/// <summary>Removable media</summary>
Removable = 0x01,
/// <summary>Drive supports ECC</summary>
ECC = 0x02,
/// <summary>Drive supports bad sector forwarding</summary>
BadSectorForward = 0x04,
/// <summary>Disk emulator</summary>
RAMDisk = 0x08,
/// <summary>Can do back to back transfer</summary>
Chain = 0x10,
/// <summary>Dynamic geometry device</summary>
DynamicGeometry = 0x20
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct DiskLabel
{
/// <summary>
/// <see cref="BSD.DISK_MAGIC" />
/// </summary>
public readonly uint d_magic;
/// <summary>
/// <see cref="dType" />
/// </summary>
public readonly dType d_type;
/// <summary>Disk subtype</summary>
public readonly ushort d_subtype;
/// <summary>Type name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] d_typename;
/// <summary>Pack identifier</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] d_packname;
/// <summary>Bytes per sector</summary>
public readonly uint d_secsize;
/// <summary>Sectors per track</summary>
public readonly uint d_nsectors;
/// <summary>Tracks per cylinder</summary>
public readonly uint d_ntracks;
/// <summary>Cylinders per unit</summary>
public readonly uint d_ncylinders;
/// <summary>Sectors per cylinder</summary>
public readonly uint d_secpercyl;
/// <summary>Sectors per unit</summary>
public readonly uint d_secperunit;
/// <summary>Spare sectors per track</summary>
public readonly ushort d_sparespertrack;
/// <summary>Spare sectors per cylinder</summary>
public readonly ushort d_sparespercyl;
/// <summary>Alternate cylinders</summary>
public readonly uint d_acylinders;
/// <summary>Rotational speed</summary>
public readonly ushort d_rpm;
/// <summary>Hardware sector interleave</summary>
public readonly ushort d_interleave;
/// <summary>Sector 0 skew per track</summary>
public readonly ushort d_trackskew;
/// <summary>Sector 0 sker per cylinder</summary>
public readonly ushort d_cylskeew;
/// <summary>Head switch time in microseconds</summary>
public readonly uint d_headswitch;
/// <summary>Track to track seek in microseconds</summary>
public readonly uint d_trkseek;
/// <summary>
/// <see cref="dFlags" />
/// </summary>
public readonly dFlags d_flags;
/// <summary>Drive-specific information</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public readonly uint[] d_drivedata;
/// <summary>Reserved</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public readonly uint[] d_spare;
/// <summary><see cref="BSD.DISK_MAGIC" /> again</summary>
public readonly uint d_magic2;
/// <summary>XOR of data</summary>
public readonly ushort d_checksum;
/// <summary>How many partitions</summary>
public readonly ushort d_npartitions;
/// <summary>Size of boot area in bytes</summary>
public readonly uint d_bbsize;
/// <summary>Maximum size of superblock in bytes</summary>
public readonly uint d_sbsize;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
public readonly BSDPartition[] d_partitions;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct BSDPartition
{
/// <summary>Sectors in partition</summary>
public readonly uint p_size;
/// <summary>Starting sector</summary>
public readonly uint p_offset;
/// <summary>Fragment size</summary>
public readonly uint p_fsize;
/// <summary>Filesystem type, <see cref="fsType" /></summary>
public readonly fsType p_fstype;
/// <summary>Fragment size</summary>
public readonly byte p_frag;
/// <summary>Cylinder per group</summary>
public readonly ushort p_cpg;
}
#endregion
}

View File

@@ -47,10 +47,14 @@ public sealed class DEC : IPartition
const int PT_MAGIC = 0x032957;
const int PT_VALID = 1;
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.DEC_Name;
/// <inheritdoc />
public Guid Id => new("58CEC3B7-3B93-4D47-86EE-D6DADE9D444F");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -93,6 +97,10 @@ public sealed class DEC : IPartition
return true;
}
#endregion
#region Nested type: Label
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Label
{
@@ -104,10 +112,16 @@ public sealed class DEC : IPartition
public readonly Partition[] pt_part;
}
#endregion
#region Nested type: Partition
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partition
{
public readonly int pi_nblocks;
public readonly uint pi_blkoff;
}
#endregion
}

View File

@@ -48,10 +48,14 @@ public sealed class DragonFlyBSD : IPartition
{
const uint DISK_MAGIC64 = 0xC4464C59;
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.DragonFlyBSD_Name;
/// <inheritdoc />
public Guid Id => new("D49E41A6-D952-4760-9D94-03DAE2450C5F");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -84,14 +88,15 @@ public sealed class DragonFlyBSD : IPartition
{
var part = new Partition
{
Start = (entry.p_boffset / imagePlugin.Info.SectorSize) + sectorOffset,
Offset = entry.p_boffset + (sectorOffset * imagePlugin.Info.SectorSize),
Start = entry.p_boffset / imagePlugin.Info.SectorSize + sectorOffset,
Offset = entry.p_boffset + sectorOffset * imagePlugin.Info.SectorSize,
Size = entry.p_bsize,
Length = entry.p_bsize / imagePlugin.Info.SectorSize,
Name = entry.p_stor_uuid.ToString(),
Sequence = counter,
Scheme = Name,
Type = (BSD.fsType)entry.p_fstype == BSD.fsType.Other ? entry.p_type_uuid.ToString()
Type = (BSD.fsType)entry.p_fstype == BSD.fsType.Other
? entry.p_type_uuid.ToString()
: BSD.FSTypeToString((BSD.fsType)entry.p_fstype)
};
@@ -109,6 +114,10 @@ public sealed class DragonFlyBSD : IPartition
return true;
}
#endregion
#region Nested type: Disklabel64
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Disklabel64
{
@@ -132,6 +141,10 @@ public sealed class DragonFlyBSD : IPartition
public readonly Partition64[] d_partitions;
}
#endregion
#region Nested type: Partition64
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partition64
{
@@ -147,4 +160,6 @@ public sealed class DragonFlyBSD : IPartition
public readonly Guid p_type_uuid;
public readonly Guid p_stor_uuid;
}
#endregion
}

View File

@@ -52,10 +52,14 @@ public sealed class GuidPartitionTable : IPartition
const uint GPT_REVISION1 = 0x00010000;
const string MODULE_NAME = "GUID Partition Table (GPT) Plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.GuidPartitionTable_Name;
/// <inheritdoc />
public Guid Id => new("CBC9D281-C1D0-44E8-9038-4D66FD2678AB");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -74,12 +78,13 @@ public sealed class GuidPartitionTable : IPartition
Header hdr;
ulong signature = BitConverter.ToUInt64(hdrBytes, 0);
bool misaligned = false;
var signature = BitConverter.ToUInt64(hdrBytes, 0);
var misaligned = false;
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.signature = 0x{0:X16}", signature);
if(signature != GPT_MAGIC)
{
if(imagePlugin.Info.MetadataMediaType == MetadataMediaType.OpticalDisc)
{
errno = imagePlugin.ReadSector(sectorOffset, out hdrBytes);
@@ -93,7 +98,7 @@ public sealed class GuidPartitionTable : IPartition
if(signature == GPT_MAGIC)
{
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_unaligned_signature, signature);
byte[] real = new byte[512];
var real = new byte[512];
Array.Copy(hdrBytes, 512, real, 0, 512);
hdrBytes = real;
misaligned = true;
@@ -103,6 +108,7 @@ public sealed class GuidPartitionTable : IPartition
}
else
return false;
}
try
{
@@ -113,18 +119,18 @@ public sealed class GuidPartitionTable : IPartition
return false;
}
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.revision = 0x{0:X8}", hdr.revision);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerSize = {0}", hdr.headerSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerCrc = 0x{0:X8}", hdr.headerCrc);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.reserved = 0x{0:X8}", hdr.reserved);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.myLBA = {0}", hdr.myLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.alternateLBA = {0}", hdr.alternateLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.firstUsableLBA = {0}", hdr.firstUsableLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.lastUsableLBA = {0}", hdr.lastUsableLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.diskGuid = {0}", hdr.diskGuid);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entryLBA = {0}", hdr.entryLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entries = {0}", hdr.entries);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entriesSize = {0}", hdr.entriesSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.revision = 0x{0:X8}", hdr.revision);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerSize = {0}", hdr.headerSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerCrc = 0x{0:X8}", hdr.headerCrc);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.reserved = 0x{0:X8}", hdr.reserved);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.myLBA = {0}", hdr.myLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.alternateLBA = {0}", hdr.alternateLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.firstUsableLBA = {0}", hdr.firstUsableLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.lastUsableLBA = {0}", hdr.lastUsableLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.diskGuid = {0}", hdr.diskGuid);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entryLBA = {0}", hdr.entryLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entries = {0}", hdr.entries);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entriesSize = {0}", hdr.entriesSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entriesCrc = 0x{0:X8}", hdr.entriesCrc);
if(hdr.signature != GPT_MAGIC)
@@ -158,24 +164,24 @@ public sealed class GuidPartitionTable : IPartition
if(errno != ErrorNumber.NoError)
return false;
byte[] entriesBytes = new byte[temp.Length - (modulo * 512)];
var entriesBytes = new byte[temp.Length - modulo * 512];
Array.Copy(temp, modulo * 512, entriesBytes, 0, entriesBytes.Length);
List<Entry> entries = new();
for(int i = 0; i < hdr.entries; i++)
for(var i = 0; i < hdr.entries; i++)
{
try
{
byte[] entryBytes = new byte[hdr.entriesSize];
var entryBytes = new byte[hdr.entriesSize];
Array.Copy(entriesBytes, hdr.entriesSize * i, entryBytes, 0, hdr.entriesSize);
entries.Add(Marshal.ByteArrayToStructureLittleEndian<Entry>(entryBytes));
}
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch
{
// ignored
}
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
}
if(entries.Count == 0)
@@ -186,12 +192,12 @@ public sealed class GuidPartitionTable : IPartition
foreach(Entry entry in entries.Where(entry => entry.partitionType != Guid.Empty &&
entry.partitionId != Guid.Empty))
{
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionType = {0}", entry.partitionType);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionId = {0}", entry.partitionId);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.startLBA = {0}", entry.startLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.endLBA = {0}", entry.endLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionType = {0}", entry.partitionType);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionId = {0}", entry.partitionId);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.startLBA = {0}", entry.startLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.endLBA = {0}", entry.endLBA);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.attributes = 0x{0:X16}", entry.attributes);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.name = {0}", entry.name);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.name = {0}", entry.name);
if(entry.startLBA / divisor > imagePlugin.Info.Sectors ||
entry.endLBA / divisor > imagePlugin.Info.Sectors)
@@ -217,115 +223,231 @@ public sealed class GuidPartitionTable : IPartition
return true;
}
#endregion
static string GetGuidTypeName(Guid type)
{
string strType = type.ToString().ToUpperInvariant();
switch(strType)
{
case "024DEE41-33E7-11D3-9D69-0008C781F39F": return Localization.MBR_scheme;
case "C12A7328-F81F-11D2-BA4B-00A0C93EC93B": return Localization.EFI_System;
case "21686148-6449-6E6F-744E-656564454649": return Localization.BIOS_Boot;
case "D3BFE2DE-3DAF-11DF-BA40-E3A556D89593": return Localization.Intel_Fast_Flash_iFFS;
case "F4019732-066E-4E12-8273-346C5641494F": return Localization.Sony_boot;
case "BFBFAFE7-A34F-448A-9A5B-6213EB736C22": return Localization.Lenovo_boot;
case "E3C9E316-0B5C-4DB8-817D-F92DF00215AE": return Localization.Microsoft_Reserved_MSR;
case "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7": return Localization.Microsoft_Basic_data;
case "5808C8AA-7E8F-42E0-85D2-E1E90434CFB3": return Localization.Logical_Disk_Manager_LDM_metadata;
case "AF9B60A0-1431-4F62-BC68-3311714A69AD": return Localization.Logical_Disk_Manager_data;
case "DE94BBA4-06D1-4D40-A16A-BFD50179D6AC": return Localization.Windows_Recovery_Environment;
case "37AFFC90-EF7D-4E96-91C3-2D7AE055B174": return Localization.IBM_General_Parallel_File_System_GPFS;
case "E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D": return Localization.Windows_Storage_Spaces;
case "75894C1E-3AEB-11D3-B7C1-7B03A0000000": return Localization.HP_UX_Data;
case "E2A1E728-32E3-11D6-A682-7B03A0000000": return Localization.HP_UX_Service;
case "0FC63DAF-8483-4772-8E79-3D69D8477DE4": return Localization.Linux_filesystem;
case "A19D880F-05FC-4D3B-A006-743F0F84911E": return Localization.Linux_RAID;
case "44479540-F297-41B2-9AF7-D131D5F0458A": return Localization.Linux_Root_x86;
case "4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709": return Localization.Linux_Root_x86_64;
case "69DAD710-2CE4-4E3C-B16C-21A1D49ABED3": return Localization.Linux_Root_32_bit_ARM;
case "B921B045-1DF0-41C3-AF44-4C6F280D3FAE": return Localization.Linux_Root_AArch64;
case "0657FD6D-A4AB-43C4-84E5-0933C84B4F4F": return Localization.Linux_swap;
case "E6D6D379-F507-44C2-A23C-238F2A3DF928": return Localization.Logical_Volume_Manager_LVM;
case "933AC7E1-2EB4-4F13-B844-0E14E2AEF915": return Localization.Linux_home;
case "3B8F8425-20E0-4F3B-907F-1A25A76F98E8": return Localization.Linux_srv;
case "7FFEC5C9-2D00-49B7-8941-3EA10A5586B7": return Localization.Plain_dm_crypt;
case "CA7D7CCB-63ED-4C53-861C-1742536059CC": return Localization.LUKS;
case "8DA63339-0007-60C0-C436-083AC8230908": return Localization.Linux_Reserved;
case "83BD6B9D-7F41-11DC-BE0B-001560B84F0F": return Localization.FreeBSD_Boot;
case "516E7CB4-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_Data;
case "516E7CB5-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_swap;
case "516E7CB6-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_UFS;
case "516E7CB7-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_UFS2;
case "516E7CB8-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_Vinum;
case "516E7CBA-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_ZFS;
case "74BA7DD9-A689-11E1-BD04-00E081286ACF": return Localization.FreeBSD_nandfs;
case "48465300-0000-11AA-AA11-00306543ECAC": return Localization.Apple_HFS;
case "55465300-0000-11AA-AA11-00306543ECAC": return Localization.Apple_UFS;
case "52414944-0000-11AA-AA11-00306543ECAC": return Localization.Apple_RAID;
case "52414944-5F4F-11AA-AA11-00306543ECAC": return Localization.Apple_RAID_offline;
case "426F6F74-0000-11AA-AA11-00306543ECAC": return Localization.Apple_Boot;
case "4C616265-6C00-11AA-AA11-00306543ECAC": return Localization.Apple_Label;
case "5265636F-7665-11AA-AA11-00306543ECAC": return Localization.Apple_TV_Recovery;
case "53746F72-6167-11AA-AA11-00306543ECAC": return Localization.Apple_Core_Storage;
case "6A82CB45-1DD2-11B2-99A6-080020736631": return Localization.Solaris_boot;
case "6A85CF4D-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Root;
case "6A87C46F-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Swap;
case "6A8B642B-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Backup;
case "6A898CC3-1DD2-11B2-99A6-080020736631": return Localization.Solaris_usr_or_Apple_ZFS;
case "6A8EF2E9-1DD2-11B2-99A6-080020736631": return Localization.Solaris_var;
case "6A90BA39-1DD2-11B2-99A6-080020736631": return Localization.Solaris_home;
case "6A9283A5-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Alternate_sector;
case "024DEE41-33E7-11D3-9D69-0008C781F39F":
return Localization.MBR_scheme;
case "C12A7328-F81F-11D2-BA4B-00A0C93EC93B":
return Localization.EFI_System;
case "21686148-6449-6E6F-744E-656564454649":
return Localization.BIOS_Boot;
case "D3BFE2DE-3DAF-11DF-BA40-E3A556D89593":
return Localization.Intel_Fast_Flash_iFFS;
case "F4019732-066E-4E12-8273-346C5641494F":
return Localization.Sony_boot;
case "BFBFAFE7-A34F-448A-9A5B-6213EB736C22":
return Localization.Lenovo_boot;
case "E3C9E316-0B5C-4DB8-817D-F92DF00215AE":
return Localization.Microsoft_Reserved_MSR;
case "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7":
return Localization.Microsoft_Basic_data;
case "5808C8AA-7E8F-42E0-85D2-E1E90434CFB3":
return Localization.Logical_Disk_Manager_LDM_metadata;
case "AF9B60A0-1431-4F62-BC68-3311714A69AD":
return Localization.Logical_Disk_Manager_data;
case "DE94BBA4-06D1-4D40-A16A-BFD50179D6AC":
return Localization.Windows_Recovery_Environment;
case "37AFFC90-EF7D-4E96-91C3-2D7AE055B174":
return Localization.IBM_General_Parallel_File_System_GPFS;
case "E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D":
return Localization.Windows_Storage_Spaces;
case "75894C1E-3AEB-11D3-B7C1-7B03A0000000":
return Localization.HP_UX_Data;
case "E2A1E728-32E3-11D6-A682-7B03A0000000":
return Localization.HP_UX_Service;
case "0FC63DAF-8483-4772-8E79-3D69D8477DE4":
return Localization.Linux_filesystem;
case "A19D880F-05FC-4D3B-A006-743F0F84911E":
return Localization.Linux_RAID;
case "44479540-F297-41B2-9AF7-D131D5F0458A":
return Localization.Linux_Root_x86;
case "4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709":
return Localization.Linux_Root_x86_64;
case "69DAD710-2CE4-4E3C-B16C-21A1D49ABED3":
return Localization.Linux_Root_32_bit_ARM;
case "B921B045-1DF0-41C3-AF44-4C6F280D3FAE":
return Localization.Linux_Root_AArch64;
case "0657FD6D-A4AB-43C4-84E5-0933C84B4F4F":
return Localization.Linux_swap;
case "E6D6D379-F507-44C2-A23C-238F2A3DF928":
return Localization.Logical_Volume_Manager_LVM;
case "933AC7E1-2EB4-4F13-B844-0E14E2AEF915":
return Localization.Linux_home;
case "3B8F8425-20E0-4F3B-907F-1A25A76F98E8":
return Localization.Linux_srv;
case "7FFEC5C9-2D00-49B7-8941-3EA10A5586B7":
return Localization.Plain_dm_crypt;
case "CA7D7CCB-63ED-4C53-861C-1742536059CC":
return Localization.LUKS;
case "8DA63339-0007-60C0-C436-083AC8230908":
return Localization.Linux_Reserved;
case "83BD6B9D-7F41-11DC-BE0B-001560B84F0F":
return Localization.FreeBSD_Boot;
case "516E7CB4-6ECF-11D6-8FF8-00022D09712B":
return Localization.FreeBSD_Data;
case "516E7CB5-6ECF-11D6-8FF8-00022D09712B":
return Localization.FreeBSD_swap;
case "516E7CB6-6ECF-11D6-8FF8-00022D09712B":
return Localization.FreeBSD_UFS;
case "516E7CB7-6ECF-11D6-8FF8-00022D09712B":
return Localization.FreeBSD_UFS2;
case "516E7CB8-6ECF-11D6-8FF8-00022D09712B":
return Localization.FreeBSD_Vinum;
case "516E7CBA-6ECF-11D6-8FF8-00022D09712B":
return Localization.FreeBSD_ZFS;
case "74BA7DD9-A689-11E1-BD04-00E081286ACF":
return Localization.FreeBSD_nandfs;
case "48465300-0000-11AA-AA11-00306543ECAC":
return Localization.Apple_HFS;
case "55465300-0000-11AA-AA11-00306543ECAC":
return Localization.Apple_UFS;
case "52414944-0000-11AA-AA11-00306543ECAC":
return Localization.Apple_RAID;
case "52414944-5F4F-11AA-AA11-00306543ECAC":
return Localization.Apple_RAID_offline;
case "426F6F74-0000-11AA-AA11-00306543ECAC":
return Localization.Apple_Boot;
case "4C616265-6C00-11AA-AA11-00306543ECAC":
return Localization.Apple_Label;
case "5265636F-7665-11AA-AA11-00306543ECAC":
return Localization.Apple_TV_Recovery;
case "53746F72-6167-11AA-AA11-00306543ECAC":
return Localization.Apple_Core_Storage;
case "6A82CB45-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_boot;
case "6A85CF4D-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_Root;
case "6A87C46F-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_Swap;
case "6A8B642B-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_Backup;
case "6A898CC3-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_usr_or_Apple_ZFS;
case "6A8EF2E9-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_var;
case "6A90BA39-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_home;
case "6A9283A5-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_Alternate_sector;
case "6A945A3B-1DD2-11B2-99A6-080020736631":
case "6A9630D1-1DD2-11B2-99A6-080020736631":
case "6A980767-1DD2-11B2-99A6-080020736631":
case "6A96237F-1DD2-11B2-99A6-080020736631":
case "6A8D2AC7-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Reserved;
case "49F48D32-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_Swap;
case "49F48D5A-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_FFS;
case "49F48D82-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_LFS;
case "49F48DAA-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_RAID;
case "2DB519C4-B10F-11DC-B99B-0019D1879648": return Localization.NetBSD_Concatenated;
case "2DB519EC-B10F-11DC-B99B-0019D1879648": return Localization.NetBSD_Encrypted;
case "FE3A2A5D-4F32-41A7-B725-ACCC3285A309": return Localization.ChromeOS_kernel;
case "3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC": return Localization.ChromeOS_rootfs;
case "2E0A753D-9E48-43B0-8337-B15192CB1B5E": return Localization.ChromeOS_future_use;
case "42465331-3BA3-10F1-802A-4861696B7521": return Localization.Haiku_BFS;
case "85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Boot;
case "85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Data;
case "85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Swap;
case "0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_UFS;
case "85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Vinum;
case "85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_ZFS;
case "45B0969E-9B03-4F30-B4C6-B4B80CEFF106": return Localization.Ceph_Journal;
case "45B0969E-9B03-4F30-B4C6-5EC00CEFF106": return Localization.Ceph_dm_crypt_Encrypted_Journal;
case "4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D": return Localization.Ceph_OSD;
case "4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D": return Localization.Ceph_dm_crypt_OSD;
case "89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE": return Localization.Ceph_disk_in_creation;
case "89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE": return Localization.Ceph_dm_crypt_disk_in_creation;
case "824CC7A0-36A8-11E3-890A-952519AD3F61": return Localization.OpenBSD_Data;
case "CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1": return Localization.QNX_Power_safe_QNX6;
case "C91818F9-8025-47AF-89D2-F030D7000C2C": return Localization.Plan_9;
case "9D275380-40AD-11DB-BF97-000C2911D1B8": return Localization.VMware_vmkcore_coredump;
case "AA31E02A-400F-11DB-9590-000C2911D1B8": return Localization.VMware_VMFS;
case "9198EFFC-31C0-11DB-8F78-000C2911D1B8": return Localization.VMware_Reserved;
case "7412F7D5-A156-4B13-81DC-867174929325": return Localization.ONIE_boot;
case "D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149": return Localization.ONIE_config;
case "9E1A2D38-C612-4316-AA26-8B49521E5A8B": return Localization.PowerPC_PReP_boot;
case "0311FC50-01CA-4725-AD77-9ADBB20ACE98": return Localization.Acronis_Secure_Zone;
case "7C3457EF-0000-11AA-AA11-00306543ECAC": return Localization.Apple_File_System;
case "9D087404-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Label;
case "9D58FDBD-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Swap;
case "9D94CE7C-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_UFS;
case "9DD4478F-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Vinum;
case "DBD5211B-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_CCD;
case "3D48CE54-1D16-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Label;
case "BD215AB2-1D16-11DC-8696-01301BB8A9F5": return Localization.DragonflyBSD_Legacy;
case "61DC63AC-6E38-11DC-8513-01301BB8A9F5": return Localization.DragonflyBSD_Hammer;
case "5CBB9AD1-862D-11DC-A94D-01301BB8A9F5": return Localization.DragonflyBSD_Hammer2;
default: return "";
case "6A8D2AC7-1DD2-11B2-99A6-080020736631":
return Localization.Solaris_Reserved;
case "49F48D32-B10E-11DC-B99B-0019D1879648":
return Localization.NetBSD_Swap;
case "49F48D5A-B10E-11DC-B99B-0019D1879648":
return Localization.NetBSD_FFS;
case "49F48D82-B10E-11DC-B99B-0019D1879648":
return Localization.NetBSD_LFS;
case "49F48DAA-B10E-11DC-B99B-0019D1879648":
return Localization.NetBSD_RAID;
case "2DB519C4-B10F-11DC-B99B-0019D1879648":
return Localization.NetBSD_Concatenated;
case "2DB519EC-B10F-11DC-B99B-0019D1879648":
return Localization.NetBSD_Encrypted;
case "FE3A2A5D-4F32-41A7-B725-ACCC3285A309":
return Localization.ChromeOS_kernel;
case "3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC":
return Localization.ChromeOS_rootfs;
case "2E0A753D-9E48-43B0-8337-B15192CB1B5E":
return Localization.ChromeOS_future_use;
case "42465331-3BA3-10F1-802A-4861696B7521":
return Localization.Haiku_BFS;
case "85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7":
return Localization.MidnightBSD_Boot;
case "85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7":
return Localization.MidnightBSD_Data;
case "85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7":
return Localization.MidnightBSD_Swap;
case "0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7":
return Localization.MidnightBSD_UFS;
case "85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7":
return Localization.MidnightBSD_Vinum;
case "85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7":
return Localization.MidnightBSD_ZFS;
case "45B0969E-9B03-4F30-B4C6-B4B80CEFF106":
return Localization.Ceph_Journal;
case "45B0969E-9B03-4F30-B4C6-5EC00CEFF106":
return Localization.Ceph_dm_crypt_Encrypted_Journal;
case "4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D":
return Localization.Ceph_OSD;
case "4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D":
return Localization.Ceph_dm_crypt_OSD;
case "89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE":
return Localization.Ceph_disk_in_creation;
case "89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE":
return Localization.Ceph_dm_crypt_disk_in_creation;
case "824CC7A0-36A8-11E3-890A-952519AD3F61":
return Localization.OpenBSD_Data;
case "CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1":
return Localization.QNX_Power_safe_QNX6;
case "C91818F9-8025-47AF-89D2-F030D7000C2C":
return Localization.Plan_9;
case "9D275380-40AD-11DB-BF97-000C2911D1B8":
return Localization.VMware_vmkcore_coredump;
case "AA31E02A-400F-11DB-9590-000C2911D1B8":
return Localization.VMware_VMFS;
case "9198EFFC-31C0-11DB-8F78-000C2911D1B8":
return Localization.VMware_Reserved;
case "7412F7D5-A156-4B13-81DC-867174929325":
return Localization.ONIE_boot;
case "D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149":
return Localization.ONIE_config;
case "9E1A2D38-C612-4316-AA26-8B49521E5A8B":
return Localization.PowerPC_PReP_boot;
case "0311FC50-01CA-4725-AD77-9ADBB20ACE98":
return Localization.Acronis_Secure_Zone;
case "7C3457EF-0000-11AA-AA11-00306543ECAC":
return Localization.Apple_File_System;
case "9D087404-1CA5-11DC-8817-01301BB8A9F5":
return Localization.DragonflyBSD_Label;
case "9D58FDBD-1CA5-11DC-8817-01301BB8A9F5":
return Localization.DragonflyBSD_Swap;
case "9D94CE7C-1CA5-11DC-8817-01301BB8A9F5":
return Localization.DragonflyBSD_UFS;
case "9DD4478F-1CA5-11DC-8817-01301BB8A9F5":
return Localization.DragonflyBSD_Vinum;
case "DBD5211B-1CA5-11DC-8817-01301BB8A9F5":
return Localization.DragonflyBSD_CCD;
case "3D48CE54-1D16-11DC-8817-01301BB8A9F5":
return Localization.DragonflyBSD_Label;
case "BD215AB2-1D16-11DC-8696-01301BB8A9F5":
return Localization.DragonflyBSD_Legacy;
case "61DC63AC-6E38-11DC-8513-01301BB8A9F5":
return Localization.DragonflyBSD_Hammer;
case "5CBB9AD1-862D-11DC-A94D-01301BB8A9F5":
return Localization.DragonflyBSD_Hammer2;
default:
return "";
}
}
#region Nested type: Entry
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct Entry
{
public readonly Guid partitionType;
public readonly Guid partitionId;
public readonly ulong startLBA;
public readonly ulong endLBA;
public readonly ulong attributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
public readonly string name;
}
#endregion
#region Nested type: Header
[StructLayout(LayoutKind.Sequential)]
struct Header
{
@@ -345,15 +467,5 @@ public sealed class GuidPartitionTable : IPartition
public readonly uint entriesCrc;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct Entry
{
public readonly Guid partitionType;
public readonly Guid partitionId;
public readonly ulong startLBA;
public readonly ulong endLBA;
public readonly ulong attributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
public readonly string name;
}
#endregion
}

View File

@@ -51,10 +51,14 @@ public sealed class Human68K : IPartition
const uint X68K_MAGIC = 0x5836384B;
const string MODULE_NAME = "Human68k partitions plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.Human68K_Name;
/// <inheritdoc />
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -89,7 +93,8 @@ public sealed class Human68K : IPartition
sectsPerUnit = 1;
break;
default: return false;
default:
return false;
}
if(errno != ErrorNumber.NoError)
@@ -102,11 +107,11 @@ public sealed class Human68K : IPartition
if(table.magic != X68K_MAGIC)
return false;
for(int i = 0; i < table.entries.Length; i++)
for(var i = 0; i < table.entries.Length; i++)
table.entries[i] = (Entry)Marshal.SwapStructureMembersEndian(table.entries[i]);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size = {0:X4}", table.size);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size2 = {0:X4}", table.size2);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size = {0:X4}", table.size);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size2 = {0:X4}", table.size2);
AaruConsole.DebugWriteLine(MODULE_NAME, "table.unknown = {0:X4}", table.unknown);
ulong counter = 0;
@@ -117,7 +122,7 @@ public sealed class Human68K : IPartition
StringHandlers.CToString(entry.name, Encoding.GetEncoding(932)));
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.stateStart = {0}", entry.stateStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.length = {0}", entry.length);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.length = {0}", entry.length);
AaruConsole.DebugWriteLine(MODULE_NAME, "sectsPerUnit = {0} {1}", sectsPerUnit,
imagePlugin.Info.SectorSize);
@@ -144,6 +149,23 @@ public sealed class Human68K : IPartition
return true;
}
#endregion
#region Nested type: Entry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Entry
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] name;
public readonly uint stateStart;
public readonly uint length;
}
#endregion
#region Nested type: Table
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Table
{
@@ -155,12 +177,5 @@ public sealed class Human68K : IPartition
public readonly Entry[] entries;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Entry
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] name;
public readonly uint stateStart;
public readonly uint length;
}
#endregion
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -303,10 +303,14 @@ public sealed class MBR : IPartition
Localization.Xenix_bad_block
};
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.MBR_Name;
/// <inheritdoc />
public Guid Id => new("5E8A34E8-4F1A-59E6-4BF7-7EA647063A76");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -349,7 +353,7 @@ public sealed class MBR : IPartition
DiskManagerMasterBootRecord mbrOntrack =
Marshal.ByteArrayToStructureLittleEndian<DiskManagerMasterBootRecord>(sector);
AaruConsole.DebugWriteLine(MODULE_NAME, "xmlmedia = {0}", imagePlugin.Info.MetadataMediaType);
AaruConsole.DebugWriteLine(MODULE_NAME, "xmlmedia = {0}", imagePlugin.Info.MetadataMediaType);
AaruConsole.DebugWriteLine(MODULE_NAME, "mbr.magic = {0:X4}", mbr.magic);
if(mbr.magic != MBR_MAGIC)
@@ -360,7 +364,7 @@ public sealed class MBR : IPartition
if(errno != ErrorNumber.NoError)
return false;
ulong signature = BitConverter.ToUInt64(hdrBytes, 0);
var signature = BitConverter.ToUInt64(hdrBytes, 0);
AaruConsole.DebugWriteLine(MODULE_NAME, "gpt.signature = 0x{0:X16}", signature);
@@ -392,18 +396,18 @@ public sealed class MBR : IPartition
foreach(PartitionEntry entry in entries)
{
byte startSector = (byte)(entry.start_sector & 0x3F);
ushort startCylinder = (ushort)(((entry.start_sector & 0xC0) << 2) | entry.start_cylinder);
byte endSector = (byte)(entry.end_sector & 0x3F);
ushort endCylinder = (ushort)(((entry.end_sector & 0xC0) << 2) | entry.end_cylinder);
ulong lbaStart = entry.lba_start;
ulong lbaSectors = entry.lba_sectors;
var startSector = (byte)(entry.start_sector & 0x3F);
var startCylinder = (ushort)((entry.start_sector & 0xC0) << 2 | entry.start_cylinder);
var endSector = (byte)(entry.end_sector & 0x3F);
var endCylinder = (ushort)((entry.end_sector & 0xC0) << 2 | entry.end_cylinder);
ulong lbaStart = entry.lba_start;
ulong lbaSectors = entry.lba_sectors;
// Let's start the fun...
bool valid = true;
bool extended = false;
bool minix = false;
var valid = true;
var extended = false;
var minix = false;
if(entry.status != 0x00 &&
entry.status != 0x80)
@@ -449,27 +453,29 @@ public sealed class MBR : IPartition
if(lbaStart + lbaSectors > imagePlugin.Info.Sectors)
lbaSectors = imagePlugin.Info.Sectors - lbaStart;
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.status {0}", entry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.type {0}", entry.type);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_start {0}", entry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_sectors {0}", entry.lba_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.status {0}", entry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.type {0}", entry.type);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_start {0}", entry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_sectors {0}", entry.lba_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_cylinder {0}", startCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_head {0}", entry.start_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_cylinder {0}", endCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_head {0}", entry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_sector {0}", endSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_head {0}", entry.start_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_cylinder {0}", endCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_head {0}", entry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_sector {0}", endSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.minix = {0}", minix);
AaruConsole.DebugWriteLine(MODULE_NAME, "lba_start {0}", lbaStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "lba_start {0}", lbaStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "lba_sectors {0}", lbaSectors);
if(valid && minix) // Let's mix the fun
{
if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize, out List<Partition> mnxParts))
partitions.AddRange(mnxParts);
else
minix = false;
}
if(valid && !minix)
{
@@ -505,7 +511,7 @@ public sealed class MBR : IPartition
if(!extended)
continue;
bool processingExtended = true;
var processingExtended = true;
ulong chainStart = lbaStart;
while(processingExtended)
@@ -526,25 +532,25 @@ public sealed class MBR : IPartition
foreach(PartitionEntry ebrEntry in ebr.entries)
{
bool extValid = true;
var extValid = true;
startSector = (byte)(ebrEntry.start_sector & 0x3F);
startCylinder = (ushort)(((ebrEntry.start_sector & 0xC0) << 2) | ebrEntry.start_cylinder);
startCylinder = (ushort)((ebrEntry.start_sector & 0xC0) << 2 | ebrEntry.start_cylinder);
endSector = (byte)(ebrEntry.end_sector & 0x3F);
endCylinder = (ushort)(((ebrEntry.end_sector & 0xC0) << 2) | ebrEntry.end_cylinder);
endCylinder = (ushort)((ebrEntry.end_sector & 0xC0) << 2 | ebrEntry.end_cylinder);
ulong extStart = ebrEntry.lba_start;
ulong extSectors = ebrEntry.lba_sectors;
bool extMinix = false;
var extMinix = false;
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.status {0}", ebrEntry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.type {0}", ebrEntry.type);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_start {0}", ebrEntry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_sectors {0}", ebrEntry.lba_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.status {0}", ebrEntry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.type {0}", ebrEntry.type);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_start {0}", ebrEntry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_sectors {0}", ebrEntry.lba_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_cylinder {0}", startCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_head {0}", ebrEntry.start_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_cylinder {0}", endCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_head {0}", ebrEntry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_sector {0}", endSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_head {0}", ebrEntry.start_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_cylinder {0}", endCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_head {0}", ebrEntry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_sector {0}", endSector);
// Let's start the fun...
extValid &= ebrEntry.status is 0x00 or 0x80;
@@ -569,7 +575,7 @@ public sealed class MBR : IPartition
extStart /= divider;
extSectors /= divider;
AaruConsole.DebugWriteLine(MODULE_NAME, "ext_start {0}", extStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "ext_start {0}", extStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "ext_sectors {0}", extSectors);
if(ebrEntry.type is 0x05 or 0x0F or 0x15 or 0x1F or 0x85 or 0x91 or 0x9B or 0xC5 or 0xCF or 0xD5)
@@ -586,11 +592,13 @@ public sealed class MBR : IPartition
extSectors = imagePlugin.Info.Sectors - extStart;
if(extValid && extMinix) // Let's mix the fun
{
if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize,
out List<Partition> mnxParts))
partitions.AddRange(mnxParts);
else
extMinix = false;
}
if(!extValid || extMinix)
continue;
@@ -632,6 +640,8 @@ public sealed class MBR : IPartition
return partitions.Count != 0;
}
#endregion
static bool GetMinix(IMediaImage imagePlugin, ulong start, ulong divider, ulong sectorOffset, uint sectorSize,
out List<Partition> partitions)
{
@@ -649,28 +659,28 @@ public sealed class MBR : IPartition
if(mnx.magic != MBR_MAGIC)
return false;
bool anyMnx = false;
var anyMnx = false;
foreach(PartitionEntry mnxEntry in mnx.entries)
{
bool mnxValid = true;
byte startSector = (byte)(mnxEntry.start_sector & 0x3F);
ushort startCylinder = (ushort)(((mnxEntry.start_sector & 0xC0) << 2) | mnxEntry.start_cylinder);
byte endSector = (byte)(mnxEntry.end_sector & 0x3F);
ushort endCylinder = (ushort)(((mnxEntry.end_sector & 0xC0) << 2) | mnxEntry.end_cylinder);
ulong mnxStart = mnxEntry.lba_start;
ulong mnxSectors = mnxEntry.lba_sectors;
var mnxValid = true;
var startSector = (byte)(mnxEntry.start_sector & 0x3F);
var startCylinder = (ushort)((mnxEntry.start_sector & 0xC0) << 2 | mnxEntry.start_cylinder);
var endSector = (byte)(mnxEntry.end_sector & 0x3F);
var endCylinder = (ushort)((mnxEntry.end_sector & 0xC0) << 2 | mnxEntry.end_cylinder);
ulong mnxStart = mnxEntry.lba_start;
ulong mnxSectors = mnxEntry.lba_sectors;
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.status {0}", mnxEntry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.type {0}", mnxEntry.type);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_start {0}", mnxEntry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_sectors {0}", mnxEntry.lba_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.status {0}", mnxEntry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.type {0}", mnxEntry.type);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_start {0}", mnxEntry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_sectors {0}", mnxEntry.lba_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_cylinder {0}", startCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_head {0}", mnxEntry.start_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_cylinder {0}", endCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_head {0}", mnxEntry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_sector {0}", endSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_head {0}", mnxEntry.start_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_cylinder {0}", endCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_head {0}", mnxEntry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_sector {0}", endSector);
mnxValid &= mnxEntry.status is 0x00 or 0x80;
mnxValid &= mnxEntry.type is 0x81 or 0x80;
@@ -692,7 +702,7 @@ public sealed class MBR : IPartition
mnxStart /= divider;
mnxSectors /= divider;
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_start {0}", mnxStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_start {0}", mnxStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_sectors {0}", mnxSectors);
if(!mnxValid)
@@ -728,14 +738,20 @@ public sealed class MBR : IPartition
static string DecodeMbrType(byte type) => _mbrTypes[type];
#region Nested type: DiskManagerMasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct MasterBootRecord
readonly struct DiskManagerMasterBootRecord
{
/// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 446)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 252)]
public readonly byte[] boot_code;
/// <summary>
/// <see cref="MBR.DM_MAGIC" />
/// </summary>
public readonly ushort dm_magic;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly PartitionEntry[] entries;
/// <summary>
/// <see cref="MBR.MBR_MAGIC" />
@@ -743,6 +759,10 @@ public sealed class MBR : IPartition
public readonly ushort magic;
}
#endregion
#region Nested type: ExtendedBootRecord
// TODO: IBM Boot Manager
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct ExtendedBootRecord
@@ -759,25 +779,16 @@ public sealed class MBR : IPartition
public readonly ushort magic;
}
#endregion
#region Nested type: MasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct TimedMasterBootRecord
readonly struct MasterBootRecord
{
/// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 218)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 446)]
public readonly byte[] boot_code;
/// <summary>Set to 0</summary>
public readonly ushort zero;
/// <summary>Original physical drive</summary>
public readonly byte drive;
/// <summary>Disk timestamp, seconds</summary>
public readonly byte seconds;
/// <summary>Disk timestamp, minutes</summary>
public readonly byte minutes;
/// <summary>Disk timestamp, hours</summary>
public readonly byte hours;
/// <summary>Boot code, continuation</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 222)]
public readonly byte[] boot_code2;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly PartitionEntry[] entries;
@@ -787,24 +798,9 @@ public sealed class MBR : IPartition
public readonly ushort magic;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct SerializedMasterBootRecord
{
/// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 440)]
public readonly byte[] boot_code;
/// <summary>Disk serial number</summary>
public readonly uint serial;
/// <summary>Set to 0</summary>
public readonly ushort zero;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly PartitionEntry[] entries;
/// <summary>
/// <see cref="MBR.MBR_MAGIC" />
/// </summary>
public readonly ushort magic;
}
#endregion
#region Nested type: ModernMasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct ModernMasterBootRecord
@@ -838,6 +834,10 @@ public sealed class MBR : IPartition
public readonly ushort magic;
}
#endregion
#region Nested type: NecMasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct NecMasterBootRecord
{
@@ -857,24 +857,9 @@ public sealed class MBR : IPartition
public readonly ushort magic;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct DiskManagerMasterBootRecord
{
/// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 252)]
public readonly byte[] boot_code;
/// <summary>
/// <see cref="MBR.DM_MAGIC" />
/// </summary>
public readonly ushort dm_magic;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly PartitionEntry[] entries;
/// <summary>
/// <see cref="MBR.MBR_MAGIC" />
/// </summary>
public readonly ushort magic;
}
#endregion
#region Nested type: PartitionEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct PartitionEntry
@@ -900,4 +885,61 @@ public sealed class MBR : IPartition
/// <summary>Total sectors</summary>
public readonly uint lba_sectors;
}
#endregion
#region Nested type: SerializedMasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct SerializedMasterBootRecord
{
/// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 440)]
public readonly byte[] boot_code;
/// <summary>Disk serial number</summary>
public readonly uint serial;
/// <summary>Set to 0</summary>
public readonly ushort zero;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly PartitionEntry[] entries;
/// <summary>
/// <see cref="MBR.MBR_MAGIC" />
/// </summary>
public readonly ushort magic;
}
#endregion
#region Nested type: TimedMasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct TimedMasterBootRecord
{
/// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 218)]
public readonly byte[] boot_code;
/// <summary>Set to 0</summary>
public readonly ushort zero;
/// <summary>Original physical drive</summary>
public readonly byte drive;
/// <summary>Disk timestamp, seconds</summary>
public readonly byte seconds;
/// <summary>Disk timestamp, minutes</summary>
public readonly byte minutes;
/// <summary>Disk timestamp, hours</summary>
public readonly byte hours;
/// <summary>Boot code, continuation</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 222)]
public readonly byte[] boot_code2;
/// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly PartitionEntry[] entries;
/// <summary>
/// <see cref="MBR.MBR_MAGIC" />
/// </summary>
public readonly ushort magic;
}
#endregion
}

View File

@@ -49,7 +49,8 @@ namespace Aaru.Partitions;
/// <inheritdoc />
/// <summary>Implements decoding of NeXT disklabels</summary>
[SuppressMessage("ReSharper", "UnusedMember.Local"), SuppressMessage("ReSharper", "UnusedType.Local")]
[SuppressMessage("ReSharper", "UnusedMember.Local")]
[SuppressMessage("ReSharper", "UnusedType.Local")]
public sealed class NeXTDisklabel : IPartition
{
/// <summary>"NeXT"</summary>
@@ -64,17 +65,21 @@ public sealed class NeXTDisklabel : IPartition
const ushort DISKTAB_ENTRY_SIZE = 0x2C;
const string MODULE_NAME = "NeXT disklabel plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.NeXTDisklabel_Name;
/// <inheritdoc />
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
/// <inheritdoc />
public bool GetInformation(IMediaImage imagePlugin, out List<Partition> partitions, ulong sectorOffset)
{
bool magicFound = false;
var magicFound = false;
byte[] labelSector;
uint sectorSize = imagePlugin.Info.SectorSize is 2352 or 2448 ? 2048 : imagePlugin.Info.SectorSize;
@@ -84,17 +89,14 @@ public sealed class NeXTDisklabel : IPartition
ulong labelPosition = 0;
ErrorNumber errno;
foreach(ulong i in new ulong[]
{
0, 4, 15, 16
}.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
foreach(ulong i in new ulong[] { 0, 4, 15, 16 }.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
{
errno = imagePlugin.ReadSector(i + sectorOffset, out labelSector);
if(errno != ErrorNumber.NoError)
continue;
uint magic = BigEndianBitConverter.ToUInt32(labelSector, 0x00);
var magic = BigEndianBitConverter.ToUInt32(labelSector, 0x00);
if(magic != NEXT_MAGIC1 &&
magic != NEXT_MAGIC2 &&
@@ -120,19 +122,19 @@ public sealed class NeXTDisklabel : IPartition
if(errno != ErrorNumber.NoError)
return false;
Label label = Marshal.ByteArrayToStructureBigEndian<Label>(labelSector);
byte[] disktabB = new byte[498];
Label label = Marshal.ByteArrayToStructureBigEndian<Label>(labelSector);
var disktabB = new byte[498];
Array.Copy(labelSector, 44, disktabB, 0, 498);
label.dl_dt = Marshal.ByteArrayToStructureBigEndian<DiskTab>(disktabB);
label.dl_dt.d_partitions = new Entry[8];
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_version = 0x{0:X8}", label.dl_version);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_label_blkno = {0}", label.dl_label_blkno);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_size = {0}", label.dl_size);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_label_blkno = {0}", label.dl_label_blkno);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_size = {0}", label.dl_size);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_label = \"{0}\"", StringHandlers.CToString(label.dl_label));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_flags = {0}", label.dl_flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_flags = {0}", label.dl_flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_tag = 0x{0:X8}", label.dl_tag);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_name = \"{0}\"",
@@ -141,17 +143,17 @@ public sealed class NeXTDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_type = \"{0}\"",
StringHandlers.CToString(label.dl_dt.d_type));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_secsize = {0}", label.dl_dt.d_secsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ntracks = {0}", label.dl_dt.d_ntracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_nsectors = {0}", label.dl_dt.d_nsectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_secsize = {0}", label.dl_dt.d_secsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ntracks = {0}", label.dl_dt.d_ntracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_nsectors = {0}", label.dl_dt.d_nsectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ncylinders = {0}", label.dl_dt.d_ncylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rpm = {0}", label.dl_dt.d_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_front = {0}", label.dl_dt.d_front);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_back = {0}", label.dl_dt.d_back);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ngroups = {0}", label.dl_dt.d_ngroups);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_size = {0}", label.dl_dt.d_ag_size);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_alts = {0}", label.dl_dt.d_ag_alts);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_off = {0}", label.dl_dt.d_ag_off);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rpm = {0}", label.dl_dt.d_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_front = {0}", label.dl_dt.d_front);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_back = {0}", label.dl_dt.d_back);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ngroups = {0}", label.dl_dt.d_ngroups);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_size = {0}", label.dl_dt.d_ag_size);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_alts = {0}", label.dl_dt.d_ag_alts);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_off = {0}", label.dl_dt.d_ag_off);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_boot0_blkno[0] = {0}", label.dl_dt.d_boot0_blkno[0]);
@@ -164,12 +166,12 @@ public sealed class NeXTDisklabel : IPartition
StringHandlers.CToString(label.dl_dt.d_hostname));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rootpartition = {0}", label.dl_dt.d_rootpartition);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rwpartition = {0}", label.dl_dt.d_rwpartition);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rwpartition = {0}", label.dl_dt.d_rwpartition);
for(int i = 0; i < 8; i++)
for(var i = 0; i < 8; i++)
{
byte[] partB = new byte[44];
Array.Copy(labelSector, 44 + 146 + (44 * i), partB, 0, 44);
var partB = new byte[44];
Array.Copy(labelSector, 44 + 146 + 44 * i, partB, 0, 44);
label.dl_dt.d_partitions[i] = Marshal.ByteArrayToStructureBigEndian<Entry>(partB);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_partitions[{0}].p_base = {1}", i,
@@ -237,7 +239,7 @@ public sealed class NeXTDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_partitions[{0}].p_size = {1}", i, part.Length);
}
sb.AppendFormat(Localization._0_bytes_per_block, label.dl_dt.d_partitions[i].p_bsize).AppendLine();
sb.AppendFormat(Localization._0_bytes_per_block, label.dl_dt.d_partitions[i].p_bsize).AppendLine();
sb.AppendFormat(Localization._0_bytes_per_fragment, label.dl_dt.d_partitions[i].p_fsize).AppendLine();
if(label.dl_dt.d_partitions[i].p_opt == 's')
@@ -248,7 +250,7 @@ public sealed class NeXTDisklabel : IPartition
sb.AppendFormat(Localization.Unknown_optimization_0_X2, label.dl_dt.d_partitions[i].p_opt).AppendLine();
sb.AppendFormat(Localization._0_cylinders_per_group, label.dl_dt.d_partitions[i].p_cpg).AppendLine();
sb.AppendFormat(Localization._0_bytes_per_inode, label.dl_dt.d_partitions[i].p_density).AppendLine();
sb.AppendFormat(Localization._0_bytes_per_inode, label.dl_dt.d_partitions[i].p_density).AppendLine();
sb.AppendFormat(Localization._0_of_space_must_be_free_at_minimum, label.dl_dt.d_partitions[i].p_minfree).
AppendLine();
@@ -267,54 +269,9 @@ public sealed class NeXTDisklabel : IPartition
return true;
}
/// <summary>NeXT v3 disklabel, 544 bytes</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Label
{
/// <summary>Signature</summary>
public readonly uint dl_version;
/// <summary>Block on which this label resides</summary>
public readonly int dl_label_blkno;
/// <summary>Device size in blocks</summary>
public readonly int dl_size;
/// <summary>Device name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
public readonly byte[] dl_label;
/// <summary>Device flags</summary>
public readonly uint dl_flags;
/// <summary>Device tag</summary>
public readonly uint dl_tag;
/// <summary>Device info and partitions</summary>
public DiskTab dl_dt;
/// <summary>Checksum</summary>
public readonly ushort dl_v3_checksum;
}
#endregion
/// <summary>NeXT v1 and v2 disklabel, 7224 bytes</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct LabelOld
{
/// <summary>Signature</summary>
public readonly uint dl_version;
/// <summary>Block on which this label resides</summary>
public readonly int dl_label_blkno;
/// <summary>Device size in blocks</summary>
public readonly int dl_size;
/// <summary>Device name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
public readonly byte[] dl_label;
/// <summary>Device flags</summary>
public readonly uint dl_flags;
/// <summary>Device tag</summary>
public readonly uint dl_tag;
/// <summary>Device info and partitions</summary>
public readonly DiskTab dl_dt;
/// <summary>Bad sector table</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1670)]
public readonly int[] dl_bad;
/// <summary>Checksum</summary>
public readonly ushort dl_checksum;
}
#region Nested type: DiskTab
/// <summary>NeXT disktab and partitions, 498 bytes</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -366,6 +323,10 @@ public sealed class NeXTDisklabel : IPartition
public Entry[] d_partitions;
}
#endregion
#region Nested type: Entry
/// <summary>Partition entries, 44 bytes each</summary>
[StructLayout(LayoutKind.Sequential, Pack = 2)]
struct Entry
@@ -397,4 +358,63 @@ public sealed class NeXTDisklabel : IPartition
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] p_type;
}
#endregion
#region Nested type: Label
/// <summary>NeXT v3 disklabel, 544 bytes</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Label
{
/// <summary>Signature</summary>
public readonly uint dl_version;
/// <summary>Block on which this label resides</summary>
public readonly int dl_label_blkno;
/// <summary>Device size in blocks</summary>
public readonly int dl_size;
/// <summary>Device name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
public readonly byte[] dl_label;
/// <summary>Device flags</summary>
public readonly uint dl_flags;
/// <summary>Device tag</summary>
public readonly uint dl_tag;
/// <summary>Device info and partitions</summary>
public DiskTab dl_dt;
/// <summary>Checksum</summary>
public readonly ushort dl_v3_checksum;
}
#endregion
#region Nested type: LabelOld
/// <summary>NeXT v1 and v2 disklabel, 7224 bytes</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct LabelOld
{
/// <summary>Signature</summary>
public readonly uint dl_version;
/// <summary>Block on which this label resides</summary>
public readonly int dl_label_blkno;
/// <summary>Device size in blocks</summary>
public readonly int dl_size;
/// <summary>Device name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
public readonly byte[] dl_label;
/// <summary>Device flags</summary>
public readonly uint dl_flags;
/// <summary>Device tag</summary>
public readonly uint dl_tag;
/// <summary>Device info and partitions</summary>
public readonly DiskTab dl_dt;
/// <summary>Bad sector table</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1670)]
public readonly int[] dl_bad;
/// <summary>Checksum</summary>
public readonly ushort dl_checksum;
}
#endregion
}

View File

@@ -47,10 +47,15 @@ namespace Aaru.Partitions;
public sealed class PC98 : IPartition
{
const string MODULE_NAME = "PC-98 partitions plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.PC98_Name;
/// <inheritdoc />
public Guid Id => new("27333401-C7C2-447D-961C-22AD0641A09A");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -84,19 +89,19 @@ public sealed class PC98 : IPartition
foreach(Partition entry in table.entries)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_mid = {0}", entry.dp_mid);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_sid = {0}", entry.dp_sid);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum1 = {0}", entry.dp_dum1);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum2 = {0}", entry.dp_dum2);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_sct = {0}", entry.dp_ipl_sct);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_mid = {0}", entry.dp_mid);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_sid = {0}", entry.dp_sid);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum1 = {0}", entry.dp_dum1);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum2 = {0}", entry.dp_dum2);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_sct = {0}", entry.dp_ipl_sct);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_head = {0}", entry.dp_ipl_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_cyl = {0}", entry.dp_ipl_cyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ssect = {0}", entry.dp_ssect);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_shd = {0}", entry.dp_shd);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_scyl = {0}", entry.dp_scyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_esect = {0}", entry.dp_esect);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ehd = {0}", entry.dp_ehd);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ecyl = {0}", entry.dp_ecyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_cyl = {0}", entry.dp_ipl_cyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ssect = {0}", entry.dp_ssect);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_shd = {0}", entry.dp_shd);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_scyl = {0}", entry.dp_scyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_esect = {0}", entry.dp_esect);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ehd = {0}", entry.dp_ehd);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ecyl = {0}", entry.dp_ecyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_name = \"{0}\"",
StringHandlers.CToString(entry.dp_name, Encoding.GetEncoding(932)));
@@ -128,16 +133,16 @@ public sealed class PC98 : IPartition
part.Size = part.Length * imagePlugin.Info.SectorSize;
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Start = {0}", part.Start);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Type = {0}", part.Type);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Name = {0}", part.Name);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Start = {0}", part.Start);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Type = {0}", part.Type);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Name = {0}", part.Name);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Sequence = {0}", part.Sequence);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Offset = {0}", part.Offset);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Length = {0}", part.Length);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Size = {0}", part.Size);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Offset = {0}", part.Offset);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Length = {0}", part.Length);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Size = {0}", part.Size);
if(((entry.dp_mid & 0x20) != 0x20 && (entry.dp_mid & 0x44) != 0x44) ||
part.Start >= imagePlugin.Info.Sectors ||
if((entry.dp_mid & 0x20) != 0x20 && (entry.dp_mid & 0x44) != 0x44 ||
part.Start >= imagePlugin.Info.Sectors ||
part.End > imagePlugin.Info.Sectors)
continue;
@@ -148,33 +153,39 @@ public sealed class PC98 : IPartition
return partitions.Count > 0;
}
#endregion
static string DecodePC98Sid(byte sid)
{
switch(sid & 0x7F)
{
case 0x01: return Localization.FAT12;
case 0x04: return Localization.PC_UX;
case 0x06: return Localization.N88_BASIC_86;
case 0x01:
return Localization.FAT12;
case 0x04:
return Localization.PC_UX;
case 0x06:
return Localization.N88_BASIC_86;
// Supposedly for FAT16 < 32 MiB, seen in bigger partitions
case 0x11:
case 0x21: return Localization.FAT16;
case 0x21:
return Localization.FAT16;
case 0x28:
case 0x41:
case 0x48: return Localization.Windows_Volume_Set;
case 0x44: return Localization.FreeBSD;
case 0x61: return Localization.FAT32;
case 0x62: return Localization.Linux;
default: return Localization.Unknown_partition_type;
case 0x48:
return Localization.Windows_Volume_Set;
case 0x44:
return Localization.FreeBSD;
case 0x61:
return Localization.FAT32;
case 0x62:
return Localization.Linux;
default:
return Localization.Unknown_partition_type;
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Table
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly Partition[] entries;
}
#region Nested type: Partition
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partition
@@ -197,4 +208,17 @@ public sealed class PC98 : IPartition
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] dp_name;
}
#endregion
#region Nested type: Table
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Table
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly Partition[] entries;
}
#endregion
}

View File

@@ -49,10 +49,14 @@ namespace Aaru.Partitions;
/// <summary>Implements decoding of Plan-9 partitions</summary>
public sealed class Plan9 : IPartition
{
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.Plan9_Name;
/// <inheritdoc />
public Guid Id => new("F0BF4FFC-056E-4E7C-8B65-4EAEE250ADD9");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -95,4 +99,6 @@ public sealed class Plan9 : IPartition
return partitions.Count > 0;
}
#endregion
}

View File

@@ -178,10 +178,14 @@ public sealed class AmigaRigidDiskBlock : IPartition
const uint FLAGS_NO_AUTOMOUNT = 0x00000002;
const string MODULE_NAME = "Amiga Rigid Disk Block (RDB) plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.AmigaRigidDiskBlock_Name;
/// <inheritdoc />
public Guid Id => new("8D72ED97-1854-4170-9CE4-6E8446FD9863");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -190,7 +194,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
{
partitions = new List<Partition>();
ulong rdbBlock = 0;
bool foundRdb = false;
var foundRdb = false;
ErrorNumber errno;
while(rdbBlock < 16)
@@ -210,7 +214,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
continue;
}
uint magic = BigEndianBitConverter.ToUInt32(tmpSector, 0);
var magic = BigEndianBitConverter.ToUInt32(tmpSector, 0);
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Possible_magic_at_block_0_is_1_X8, rdbBlock,
magic);
@@ -280,7 +284,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
rdb.HighCylinder = BigEndianBitConverter.ToUInt32(sector, 0x98);
rdb.Reserved15 = BigEndianBitConverter.ToUInt32(sector, 0x9C);
byte[] tmpString = new byte[8];
var tmpString = new byte[8];
Array.Copy(sector, 0xA0, tmpString, 0, 8);
rdb.DiskVendor = StringHandlers.SpacePaddedToString(tmpString);
tmpString = new byte[16];
@@ -311,61 +315,61 @@ public sealed class AmigaRigidDiskBlock : IPartition
rdb.Reserved24 = BigEndianBitConverter.ToUInt32(sector, 0xF8);
rdb.Reserved25 = BigEndianBitConverter.ToUInt32(sector, 0xFC);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.magic = 0x{0:X8}", rdb.Magic);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.size = {0} longs, {1} bytes", rdb.Size, rdb.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.checksum = 0x{0:X8}", rdb.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.targetID = {0}", rdb.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.block_size = {0}", rdb.BlockSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.badblock_ptr = {0}", rdb.BadblockPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.partition_ptr = {0}", rdb.PartitionPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.fsheader_ptr = {0}", rdb.FsheaderPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.driveinitcode = {0}", rdb.Driveinitcode);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved1 = 0x{0:X8}", rdb.Reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved2 = 0x{0:X8}", rdb.Reserved2);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved3 = 0x{0:X8}", rdb.Reserved3);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved4 = 0x{0:X8}", rdb.Reserved4);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved5 = 0x{0:X8}", rdb.Reserved5);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved6 = 0x{0:X8}", rdb.Reserved6);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.cylinders = {0}", rdb.Cylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.spt = {0}", rdb.Spt);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.heads = {0}", rdb.Heads);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.interleave = {0}", rdb.Interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.parking = {0}", rdb.Parking);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved7 = 0x{0:X8}", rdb.Reserved7);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved8 = 0x{0:X8}", rdb.Reserved8);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved9 = 0x{0:X8}", rdb.Reserved9);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.writeprecomp = {0}", rdb.Writeprecomp);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reducedwrite = {0}", rdb.Reducedwrite);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.steprate = {0}", rdb.Steprate);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved10 = 0x{0:X8}", rdb.Reserved10);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved11 = 0x{0:X8}", rdb.Reserved11);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved12 = 0x{0:X8}", rdb.Reserved12);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved13 = 0x{0:X8}", rdb.Reserved13);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved14 = 0x{0:X8}", rdb.Reserved14);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockLow = {0}", rdb.RdbBlockLow);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockHigh = {0}", rdb.RdbBlockHigh);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.LowCylinder = {0}", rdb.LowCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.CylBlocks = {0}", rdb.CylBlocks);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.AutoParkSeconds = {0}", rdb.AutoParkSeconds);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved15 = 0x{0:X8}", rdb.Reserved15);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskVendor = \"{0}\"", rdb.DiskVendor);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskProduct = \"{0}\"", rdb.DiskProduct);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskRevision = \"{0}\"", rdb.DiskRevision);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerVendor = \"{0}\"", rdb.ControllerVendor);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerProduct = \"{0}\"", rdb.ControllerProduct);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.magic = 0x{0:X8}", rdb.Magic);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.size = {0} longs, {1} bytes", rdb.Size, rdb.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.checksum = 0x{0:X8}", rdb.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.targetID = {0}", rdb.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.block_size = {0}", rdb.BlockSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.badblock_ptr = {0}", rdb.BadblockPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.partition_ptr = {0}", rdb.PartitionPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.fsheader_ptr = {0}", rdb.FsheaderPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.driveinitcode = {0}", rdb.Driveinitcode);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved1 = 0x{0:X8}", rdb.Reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved2 = 0x{0:X8}", rdb.Reserved2);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved3 = 0x{0:X8}", rdb.Reserved3);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved4 = 0x{0:X8}", rdb.Reserved4);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved5 = 0x{0:X8}", rdb.Reserved5);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved6 = 0x{0:X8}", rdb.Reserved6);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.cylinders = {0}", rdb.Cylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.spt = {0}", rdb.Spt);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.heads = {0}", rdb.Heads);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.interleave = {0}", rdb.Interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.parking = {0}", rdb.Parking);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved7 = 0x{0:X8}", rdb.Reserved7);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved8 = 0x{0:X8}", rdb.Reserved8);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved9 = 0x{0:X8}", rdb.Reserved9);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.writeprecomp = {0}", rdb.Writeprecomp);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reducedwrite = {0}", rdb.Reducedwrite);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.steprate = {0}", rdb.Steprate);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved10 = 0x{0:X8}", rdb.Reserved10);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved11 = 0x{0:X8}", rdb.Reserved11);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved12 = 0x{0:X8}", rdb.Reserved12);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved13 = 0x{0:X8}", rdb.Reserved13);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved14 = 0x{0:X8}", rdb.Reserved14);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockLow = {0}", rdb.RdbBlockLow);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockHigh = {0}", rdb.RdbBlockHigh);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.LowCylinder = {0}", rdb.LowCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.CylBlocks = {0}", rdb.CylBlocks);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.AutoParkSeconds = {0}", rdb.AutoParkSeconds);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved15 = 0x{0:X8}", rdb.Reserved15);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskVendor = \"{0}\"", rdb.DiskVendor);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskProduct = \"{0}\"", rdb.DiskProduct);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskRevision = \"{0}\"", rdb.DiskRevision);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerVendor = \"{0}\"", rdb.ControllerVendor);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerProduct = \"{0}\"", rdb.ControllerProduct);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerRevision = \"{0}\"", rdb.ControllerRevision);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved16 = 0x{0:X8}", rdb.Reserved16);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved17 = 0x{0:X8}", rdb.Reserved17);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved18 = 0x{0:X8}", rdb.Reserved18);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved19 = 0x{0:X8}", rdb.Reserved19);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved20 = 0x{0:X8}", rdb.Reserved20);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved21 = 0x{0:X8}", rdb.Reserved21);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved22 = 0x{0:X8}", rdb.Reserved22);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved23 = 0x{0:X8}", rdb.Reserved23);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved24 = 0x{0:X8}", rdb.Reserved24);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved25 = 0x{0:X8}", rdb.Reserved25);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved16 = 0x{0:X8}", rdb.Reserved16);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved17 = 0x{0:X8}", rdb.Reserved17);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved18 = 0x{0:X8}", rdb.Reserved18);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved19 = 0x{0:X8}", rdb.Reserved19);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved20 = 0x{0:X8}", rdb.Reserved20);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved21 = 0x{0:X8}", rdb.Reserved21);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved22 = 0x{0:X8}", rdb.Reserved22);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved23 = 0x{0:X8}", rdb.Reserved23);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved24 = 0x{0:X8}", rdb.Reserved24);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved25 = 0x{0:X8}", rdb.Reserved25);
// Reading BadBlock list
List<BadBlockList> badBlockChain = new();
@@ -381,7 +385,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError)
break;
uint magic = BigEndianBitConverter.ToUInt32(sector, 0);
var magic = BigEndianBitConverter.ToUInt32(sector, 0);
if(magic != BAD_BLOCK_LIST_MAGIC)
break;
@@ -407,15 +411,15 @@ public sealed class AmigaRigidDiskBlock : IPartition
chainEntry.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.checksum = 0x{0:X8}", chainEntry.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.targetID = {0}", chainEntry.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.next_ptr = {0}", chainEntry.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.targetID = {0}", chainEntry.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.next_ptr = {0}", chainEntry.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.reserved = 0x{0:X8}", chainEntry.Reserved);
for(ulong i = 0; i < entries; i++)
{
chainEntry.BlockPairs[i].BadBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + (i * 8) + 0));
chainEntry.BlockPairs[i].BadBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + i * 8 + 0));
chainEntry.BlockPairs[i].GoodBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + (i * 8) + 4));
chainEntry.BlockPairs[i].GoodBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + i * 8 + 4));
AaruConsole.DebugWriteLine(MODULE_NAME,
Localization.Bad_block_at_0_replaced_with_good_block_at_1,
@@ -441,7 +445,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError)
break;
uint magic = BigEndianBitConverter.ToUInt32(sector, 0);
var magic = BigEndianBitConverter.ToUInt32(sector, 0);
if(magic != PARTITION_BLOCK_MAGIC)
break;
@@ -500,7 +504,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
}
};
byte[] driveName = new byte[32];
var driveName = new byte[32];
Array.Copy(sector, 0x24, driveName, 0, 32);
partEntry.DriveName = StringHandlers.PascalToString(driveName, Encoding.GetEncoding("iso-8859-1"));
@@ -509,22 +513,22 @@ public sealed class AmigaRigidDiskBlock : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.size = {0} longs, {1} bytes", partEntry.Size,
partEntry.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.checksum = 0x{0:X8}", partEntry.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.targetID = {0}", partEntry.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.next_ptr = {0}", partEntry.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.flags = 0x{0:X8}", partEntry.Flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved1 = 0x{0:X8}", partEntry.Reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved2 = 0x{0:X8}", partEntry.Reserved2);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.devFlags = 0x{0:X8}", partEntry.DevFlags);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveNameLen = {0}", partEntry.DriveNameLen);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveName = \"{0}\"", partEntry.DriveName);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved3 = 0x{0:X8}", partEntry.Reserved3);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved4 = 0x{0:X8}", partEntry.Reserved4);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved5 = 0x{0:X8}", partEntry.Reserved5);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved6 = 0x{0:X8}", partEntry.Reserved6);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved7 = 0x{0:X8}", partEntry.Reserved7);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved8 = 0x{0:X8}", partEntry.Reserved8);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved9 = 0x{0:X8}", partEntry.Reserved9);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.checksum = 0x{0:X8}", partEntry.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.targetID = {0}", partEntry.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.next_ptr = {0}", partEntry.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.flags = 0x{0:X8}", partEntry.Flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved1 = 0x{0:X8}", partEntry.Reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved2 = 0x{0:X8}", partEntry.Reserved2);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.devFlags = 0x{0:X8}", partEntry.DevFlags);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveNameLen = {0}", partEntry.DriveNameLen);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveName = \"{0}\"", partEntry.DriveName);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved3 = 0x{0:X8}", partEntry.Reserved3);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved4 = 0x{0:X8}", partEntry.Reserved4);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved5 = 0x{0:X8}", partEntry.Reserved5);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved6 = 0x{0:X8}", partEntry.Reserved6);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved7 = 0x{0:X8}", partEntry.Reserved7);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved8 = 0x{0:X8}", partEntry.Reserved8);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved9 = 0x{0:X8}", partEntry.Reserved9);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved10 = 0x{0:X8}", partEntry.Reserved10);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved11 = 0x{0:X8}", partEntry.Reserved11);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved12 = 0x{0:X8}", partEntry.Reserved12);
@@ -610,7 +614,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError)
break;
uint magic = BigEndianBitConverter.ToUInt32(sector, 0);
var magic = BigEndianBitConverter.ToUInt32(sector, 0);
if(magic != FILESYSTEM_HEADER_MAGIC)
break;
@@ -649,10 +653,10 @@ public sealed class AmigaRigidDiskBlock : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.size = {0} longs, {1} bytes", fshd.Size,
fshd.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.checksum = 0x{0:X8}", fshd.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.targetID = {0}", fshd.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.next_ptr = {0}", fshd.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.flags = 0x{0:X8}", fshd.Flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.checksum = 0x{0:X8}", fshd.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.targetID = {0}", fshd.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.next_ptr = {0}", fshd.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.flags = 0x{0:X8}", fshd.Flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.reserved1 = 0x{0:X8}", fshd.Reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.reserved2 = 0x{0:X8}", fshd.Reserved2);
@@ -663,20 +667,20 @@ public sealed class AmigaRigidDiskBlock : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.patchFlags = 0x{0:X8}", fshd.PatchFlags);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.type = {0}", fshd.Dnode.Type);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.task = {0}", fshd.Dnode.Task);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.locked = {0}", fshd.Dnode.Locked);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.handler = {0}", fshd.Dnode.Handler);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.stackSize = {0}", fshd.Dnode.StackSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.priority = {0}", fshd.Dnode.Priority);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.startup = {0}", fshd.Dnode.Startup);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.type = {0}", fshd.Dnode.Type);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.task = {0}", fshd.Dnode.Task);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.locked = {0}", fshd.Dnode.Locked);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.handler = {0}", fshd.Dnode.Handler);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.stackSize = {0}", fshd.Dnode.StackSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.priority = {0}", fshd.Dnode.Priority);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.startup = {0}", fshd.Dnode.Startup);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.seglist_ptr = {0}", fshd.Dnode.SeglistPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.global_vec = 0x{0:X8}", fshd.Dnode.GlobalVec);
nextBlock = fshd.Dnode.SeglistPtr;
bool thereAreLoadSegments = false;
var sha1Ctx = new Sha1Context();
var thereAreLoadSegments = false;
var sha1Ctx = new Sha1Context();
while(nextBlock != 0xFFFFFFFF)
{
@@ -688,7 +692,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError)
break;
uint magicSeg = BigEndianBitConverter.ToUInt32(sector, 0);
var magicSeg = BigEndianBitConverter.ToUInt32(sector, 0);
if(magicSeg != LOAD_SEG_MAGIC)
break;
@@ -715,8 +719,8 @@ public sealed class AmigaRigidDiskBlock : IPartition
loadSeg.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.checksum = 0x{0:X8}", loadSeg.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.targetID = {0}", loadSeg.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.next_ptr = {0}", loadSeg.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.targetID = {0}", loadSeg.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.next_ptr = {0}", loadSeg.NextPtr);
segmentEntries.Add(loadSeg);
nextBlock = loadSeg.NextPtr;
@@ -743,11 +747,11 @@ public sealed class AmigaRigidDiskBlock : IPartition
Sequence = sequence,
Length = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) *
rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt,
Start = (rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt) +
Start = rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt +
sectorOffset,
Type = AmigaDosTypeToString(rdbEntry.DosEnvVec.DosType),
Scheme = Name,
Offset = ((rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt) +
Offset = (rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt +
sectorOffset) * rdb.BlockSize,
Size = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) *
rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt * rdb.BlockSize
@@ -760,34 +764,57 @@ public sealed class AmigaRigidDiskBlock : IPartition
return true;
}
#endregion
static string AmigaDosTypeToDescriptionString(uint amigaDosType)
{
switch(amigaDosType)
{
case TYPEID_OFS: return Localization.Amiga_Original_File_System;
case TYPEID_FFS: return Localization.Amiga_Fast_File_System;
case TYPEID_OFS_INTL: return Localization.Amiga_Original_File_System_with_international_characters;
case TYPEID_FFS_INTL: return Localization.Amiga_Fast_File_System_with_international_characters;
case TYPEID_OFS_CACHE: return Localization.Amiga_Original_File_System_with_directory_cache;
case TYPEID_FFS_CACHE: return Localization.Amiga_Fast_File_System_with_directory_cache;
case TYPEID_OFS2: return Localization.Amiga_Original_File_System_with_long_filenames;
case TYPEID_FFS2: return Localization.Amiga_Fast_File_System_with_long_filenames;
case TYPEID_AMIX_SYSV: return Localization.Amiga_UNIX_System_V_filesystem;
case TYPEID_AMIX_BOOT: return Localization.Amiga_UNIX_boot_filesystem;
case TYPEID_AMIX_FFS: return Localization.Amiga_UNIX_BSD_filesystem;
case TYPEID_AMIX_RESERVED: return Localization.Amiga_UNIX_Reserved_partition__swap_;
case TYPEID_OFS:
return Localization.Amiga_Original_File_System;
case TYPEID_FFS:
return Localization.Amiga_Fast_File_System;
case TYPEID_OFS_INTL:
return Localization.Amiga_Original_File_System_with_international_characters;
case TYPEID_FFS_INTL:
return Localization.Amiga_Fast_File_System_with_international_characters;
case TYPEID_OFS_CACHE:
return Localization.Amiga_Original_File_System_with_directory_cache;
case TYPEID_FFS_CACHE:
return Localization.Amiga_Fast_File_System_with_directory_cache;
case TYPEID_OFS2:
return Localization.Amiga_Original_File_System_with_long_filenames;
case TYPEID_FFS2:
return Localization.Amiga_Fast_File_System_with_long_filenames;
case TYPEID_AMIX_SYSV:
return Localization.Amiga_UNIX_System_V_filesystem;
case TYPEID_AMIX_BOOT:
return Localization.Amiga_UNIX_boot_filesystem;
case TYPEID_AMIX_FFS:
return Localization.Amiga_UNIX_BSD_filesystem;
case TYPEID_AMIX_RESERVED:
return Localization.Amiga_UNIX_Reserved_partition__swap_;
case TYPEID_PFS:
case TYPEID_PFS2:
case TYPEID_PFS_MUSER:
case TYPEID_AFS: return Localization.ProfessionalFileSystem;
case TYPEID_SFS: return Localization.SmartFileSystem_v1;
case TYPEID_SFS2: return Localization.SmartFileSystem_v2;
case TYPEID_JXFS: return Localization.JXFS;
case TYPEID_CROSS_DOS: return Localization.FAT_as_set_by_CrossDOS;
case TYPEID_CROSS_MAC: return Localization.HFS_as_set_by_CrossMac;
case TYPEID_BFFS: return Localization._4_2_UFS_for_BFFS;
case TYPEID_OFS_MUSER: return Localization.Amiga_Original_File_System_with_multi_user_patches;
case TYPEID_FFS_MUSER: return Localization.Amiga_Fast_File_System_with_multi_user_patches;
case TYPEID_AFS:
return Localization.ProfessionalFileSystem;
case TYPEID_SFS:
return Localization.SmartFileSystem_v1;
case TYPEID_SFS2:
return Localization.SmartFileSystem_v2;
case TYPEID_JXFS:
return Localization.JXFS;
case TYPEID_CROSS_DOS:
return Localization.FAT_as_set_by_CrossDOS;
case TYPEID_CROSS_MAC:
return Localization.HFS_as_set_by_CrossMac;
case TYPEID_BFFS:
return Localization._4_2_UFS_for_BFFS;
case TYPEID_OFS_MUSER:
return Localization.Amiga_Original_File_System_with_multi_user_patches;
case TYPEID_FFS_MUSER:
return Localization.Amiga_Fast_File_System_with_multi_user_patches;
case TYPEID_OFS_INTL_MUSER:
return Localization.Amiga_Original_File_System_with_international_characters_and_multi_user_patches;
case TYPEID_FFS_INTL_MUSER:
@@ -796,65 +823,99 @@ public sealed class AmigaRigidDiskBlock : IPartition
return Localization.Amiga_Original_File_System_with_directory_cache_and_multi_user_patches;
case TYPEID_FFS_CACHE_MUSER:
return Localization.Amiga_Fast_File_System_with_directory_cache_and_multi_user_patches;
case TYPEID_OLD_BSD_UNUSED: return Localization.BSD_unused;
case TYPEID_OLD_BSD_SWAP: return Localization.BSD_swap;
case TYPEID_OLD_BSD42_FFS: return Localization.BSD_4_2_FFS;
case TYPEID_OLD_BSD44_LFS: return Localization.BSD_4_4_LFS;
case TYPEID_NETBSD_ROOT_UNUSED: return Localization.NetBSD_unused_root_partition;
case TYPEID_NETBSD_ROOT_42FFS: return Localization.NetBSD_4_2_FFS_root_partition;
case TYPEID_NETBSD_ROOT_44LFS: return Localization.NetBSD_4_4_LFS_root_partition;
case TYPEID_NETBSD_USER_UNUSED: return Localization.NetBSD_unused_user_partition;
case TYPEID_NETBSD_USER_42FFS: return Localization.NetBSD_4_2_FFS_user_partition;
case TYPEID_NETBSD_USER_44LFS: return Localization.NetBSD_4_4_LFS_user_partition;
case TYPEID_NETBSD_SWAP: return Localization.NetBSD_swap_partition;
case TYPEID_LINUX: return Localization.Linux_filesystem_partition;
case TYPEID_LINUX_SWAP: return Localization.Linux_swap_partition;
case TYPEID_OLD_BSD_UNUSED:
return Localization.BSD_unused;
case TYPEID_OLD_BSD_SWAP:
return Localization.BSD_swap;
case TYPEID_OLD_BSD42_FFS:
return Localization.BSD_4_2_FFS;
case TYPEID_OLD_BSD44_LFS:
return Localization.BSD_4_4_LFS;
case TYPEID_NETBSD_ROOT_UNUSED:
return Localization.NetBSD_unused_root_partition;
case TYPEID_NETBSD_ROOT_42FFS:
return Localization.NetBSD_4_2_FFS_root_partition;
case TYPEID_NETBSD_ROOT_44LFS:
return Localization.NetBSD_4_4_LFS_root_partition;
case TYPEID_NETBSD_USER_UNUSED:
return Localization.NetBSD_unused_user_partition;
case TYPEID_NETBSD_USER_42FFS:
return Localization.NetBSD_4_2_FFS_user_partition;
case TYPEID_NETBSD_USER_44LFS:
return Localization.NetBSD_4_4_LFS_user_partition;
case TYPEID_NETBSD_SWAP:
return Localization.NetBSD_swap_partition;
case TYPEID_LINUX:
return Localization.Linux_filesystem_partition;
case TYPEID_LINUX_SWAP:
return Localization.Linux_swap_partition;
case TYPEID_RAID_FRAME:
case TYPEID_RAID_FRAME0: return Localization.RaidFrame_partition;
case TYPEID_RAID_FRAME0:
return Localization.RaidFrame_partition;
default:
{
if((amigaDosType & TYPEID_OFS) == TYPEID_OFS)
{
return string.Format(Localization.Unknown_Amiga_DOS_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_AMIX_SYSV) == TYPEID_AMIX_SYSV)
{
return string.Format(Localization.Unknown_Amiga_UNIX_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & 0x50465300) == 0x50465300 ||
(amigaDosType & 0x41465300) == 0x41465300)
{
return string.Format(Localization.Unknown_ProfessionalFileSystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_SFS) == TYPEID_SFS)
{
return string.Format(Localization.Unknown_SmartFileSystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_OFS_MUSER) == TYPEID_OFS_MUSER)
{
return string.Format(Localization.Unknown_Amiga_DOS_multi_user_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_OLD_BSD_UNUSED) == TYPEID_OLD_BSD_UNUSED)
{
return string.Format(Localization.Unknown_BSD_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_NETBSD_ROOT_UNUSED) == TYPEID_NETBSD_ROOT_UNUSED)
{
return string.Format(Localization.Unknown_NetBSD_root_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_NETBSD_USER_UNUSED) == TYPEID_NETBSD_USER_UNUSED)
{
return string.Format(Localization.Unknown_NetBSD_user_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_NETBSD_SWAP) == TYPEID_NETBSD_SWAP)
{
return string.Format(Localization.Unknown_NetBSD_swap_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_LINUX) == TYPEID_LINUX ||
(amigaDosType & TYPEID_LINUX_SWAP) == TYPEID_LINUX_SWAP)
{
return string.Format(Localization.Unknown_Linux_filesystem_type_0,
AmigaDosTypeToString(amigaDosType));
}
return string.Format(Localization.Unknown_partition_type_0, AmigaDosTypeToString(amigaDosType));
}
@@ -863,7 +924,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
static string AmigaDosTypeToString(uint amigaDosType, bool quoted = true)
{
byte[] textPart = new byte[3];
var textPart = new byte[3];
textPart[0] = (byte)((amigaDosType & 0xFF000000) >> 24);
textPart[1] = (byte)((amigaDosType & 0x00FF0000) >> 16);
@@ -874,6 +935,236 @@ public sealed class AmigaRigidDiskBlock : IPartition
return quoted ? $"\"{textPartString}\\{amigaDosType & 0xFF}\"" : $"{textPartString}\\{amigaDosType & 0xFF}";
}
#region Nested type: BadBlockEntry
/// <summary>Pair for spare blocks</summary>
struct BadBlockEntry
{
/// <summary>Bad block pointer</summary>
public uint BadBlock;
/// <summary>Replacement block pointer</summary>
public uint GoodBlock;
}
#endregion
#region Nested type: BadBlockList
/// <summary>List of bad blocks and spares</summary>
struct BadBlockList
{
/// <summary>"BADB"</summary>
public uint Magic;
/// <summary>Size in longs</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer for next BadBlockList</summary>
public uint NextPtr;
/// <summary>Reserved</summary>
public uint Reserved;
/// <summary>Bad block entries, up to block filling, 8 bytes each</summary>
public BadBlockEntry[] BlockPairs;
}
#endregion
#region Nested type: DeviceNode
/// <summary>Device node, mostly useless, except for pointer to first LoadSegment block</summary>
struct DeviceNode
{
/// <summary>Device node type, =0</summary>
public uint Type;
/// <summary>DOS task field, =0</summary>
public uint Task;
/// <summary>Unused, =0</summary>
public uint Locked;
/// <summary>Filename handler to LoadSegment, =0</summary>
public uint Handler;
/// <summary>Stack size when starting task, =0</summary>
public uint StackSize;
/// <summary>Task priority, =0</summary>
public uint Priority;
/// <summary>Startup message, =0</summary>
public uint Startup;
/// <summary>Pointer to first LoadSegment block</summary>
public uint SeglistPtr;
/// <summary>BCPL globabl vector when starting task, =0xFFFFFFFF</summary>
public uint GlobalVec;
}
#endregion
#region Nested type: DosEnvironmentVector
/// <summary>DOSEnvVec, used by AmigaDOS</summary>
struct DosEnvironmentVector
{
/// <summary>Size in longs, should be 16, minimum 11</summary>
public uint Size;
/// <summary>Block size in longs</summary>
public uint BlockSize;
/// <summary>Unknown, 0</summary>
public uint SecOrg;
/// <summary>Heads in drive</summary>
public uint Surfaces;
/// <summary>Sectors per block</summary>
public uint Spb;
/// <summary>Blocks per track</summary>
public uint Bpt;
/// <summary>DOS reserved blocks at start of partition</summary>
public uint Reservedblocks;
/// <summary>DOS reserved blocks at end of partition</summary>
public uint Prealloc;
/// <summary>Interleave</summary>
public uint Interleave;
/// <summary>First cylinder of a partition, inclusive</summary>
public uint LowCylinder;
/// <summary>Last cylinder of a partition, inclusive</summary>
public uint HighCylinder;
/// <summary>Buffers, usually 30</summary>
public uint NumBuffer;
/// <summary>Type of memory to allocate for buffers</summary>
public uint BufMemType;
/// <summary>Maximum transfer, usually 0x7FFFFFFF</summary>
public uint MaxTransfer;
/// <summary>Address mask to block out certain memory, usually 0xFFFFFFFE</summary>
public uint Mask;
/// <summary>Boot priority</summary>
public uint BootPriority;
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
public uint DosType;
/// <summary>Default baud rate for SER and AUX handlers</summary>
public uint Baud;
/// <summary>Flow control values for SER and AUX handlers</summary>
public uint Control;
/// <summary>Since Kickstart 2, how many boot blocks are to be loaded</summary>
public uint BootBlocks;
}
#endregion
#region Nested type: FileSystemHeader
/// <summary>File system header</summary>
struct FileSystemHeader
{
/// <summary>"FSHD"</summary>
public uint Magic;
/// <summary>Size in longs, 64</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer to next FileSystemHeader block</summary>
public uint NextPtr;
/// <summary>Flags, unknown</summary>
public uint Flags;
/// <summary>Reserved</summary>
public uint Reserved1;
/// <summary>Reserved</summary>
public uint Reserved2;
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
public uint DosType;
/// <summary>Filesystem version Mask 0xFFFF0000, >>16, major version Mask 0x0000FFFF, minor version</summary>
public uint Version;
/// <summary>Bits for DeviceNode fields that should be substituted into a standard device node</summary>
public uint PatchFlags;
/// <summary>Device node</summary>
public DeviceNode Dnode;
}
#endregion
#region Nested type: LoadSegment
/// <summary>Filesystem code</summary>
struct LoadSegment
{
/// <summary>"LSEG"</summary>
public uint Magic;
/// <summary>Size in longs</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer to next LoadSegment</summary>
public uint NextPtr;
/// <summary>Executable code, with relocation hunks, til end of sector</summary>
public byte[] LoadData;
}
#endregion
#region Nested type: PartitionEntry
struct PartitionEntry
{
/// <summary>"PART"</summary>
public uint Magic;
/// <summary>Size in longs</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer to next PartitionEntry</summary>
public uint NextPtr;
/// <summary>Partition flags</summary>
public uint Flags;
/// <summary>Reserved</summary>
public uint Reserved1;
/// <summary>Reserved</summary>
public uint Reserved2;
/// <summary>Preferred flags for OpenDevice()</summary>
public uint DevFlags;
/// <summary>Length of drive name</summary>
public uint DriveNameLen;
/// <summary>Drive name, 31 bytes</summary>
public string DriveName;
/// <summary>Reserved</summary>
public uint Reserved3;
/// <summary>Reserved</summary>
public uint Reserved4;
/// <summary>Reserved</summary>
public uint Reserved5;
/// <summary>Reserved</summary>
public uint Reserved6;
/// <summary>Reserved</summary>
public uint Reserved7;
/// <summary>Reserved</summary>
public uint Reserved8;
/// <summary>Reserved</summary>
public uint Reserved9;
/// <summary>Reserved</summary>
public uint Reserved10;
/// <summary>Reserved</summary>
public uint Reserved11;
/// <summary>Reserved</summary>
public uint Reserved12;
/// <summary>Reserved</summary>
public uint Reserved13;
/// <summary>Reserved</summary>
public uint Reserved14;
/// <summary>Reserved</summary>
public uint Reserved15;
/// <summary>Reserved</summary>
public uint Reserved16;
/// <summary>Reserved</summary>
public uint Reserved17;
/// <summary>DOSEnvVec, more information about partition</summary>
public DosEnvironmentVector DosEnvVec;
}
#endregion
#region Nested type: RigidDiskBlock
/// <summary>Amiga Rigid Disk Block, header for partitioning scheme Can be in any sector from 0 to 15, inclusive</summary>
struct RigidDiskBlock
{
@@ -991,203 +1282,5 @@ public sealed class AmigaRigidDiskBlock : IPartition
public uint Reserved25;
}
/// <summary>Pair for spare blocks</summary>
struct BadBlockEntry
{
/// <summary>Bad block pointer</summary>
public uint BadBlock;
/// <summary>Replacement block pointer</summary>
public uint GoodBlock;
}
/// <summary>List of bad blocks and spares</summary>
struct BadBlockList
{
/// <summary>"BADB"</summary>
public uint Magic;
/// <summary>Size in longs</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer for next BadBlockList</summary>
public uint NextPtr;
/// <summary>Reserved</summary>
public uint Reserved;
/// <summary>Bad block entries, up to block filling, 8 bytes each</summary>
public BadBlockEntry[] BlockPairs;
}
/// <summary>DOSEnvVec, used by AmigaDOS</summary>
struct DosEnvironmentVector
{
/// <summary>Size in longs, should be 16, minimum 11</summary>
public uint Size;
/// <summary>Block size in longs</summary>
public uint BlockSize;
/// <summary>Unknown, 0</summary>
public uint SecOrg;
/// <summary>Heads in drive</summary>
public uint Surfaces;
/// <summary>Sectors per block</summary>
public uint Spb;
/// <summary>Blocks per track</summary>
public uint Bpt;
/// <summary>DOS reserved blocks at start of partition</summary>
public uint Reservedblocks;
/// <summary>DOS reserved blocks at end of partition</summary>
public uint Prealloc;
/// <summary>Interleave</summary>
public uint Interleave;
/// <summary>First cylinder of a partition, inclusive</summary>
public uint LowCylinder;
/// <summary>Last cylinder of a partition, inclusive</summary>
public uint HighCylinder;
/// <summary>Buffers, usually 30</summary>
public uint NumBuffer;
/// <summary>Type of memory to allocate for buffers</summary>
public uint BufMemType;
/// <summary>Maximum transfer, usually 0x7FFFFFFF</summary>
public uint MaxTransfer;
/// <summary>Address mask to block out certain memory, usually 0xFFFFFFFE</summary>
public uint Mask;
/// <summary>Boot priority</summary>
public uint BootPriority;
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
public uint DosType;
/// <summary>Default baud rate for SER and AUX handlers</summary>
public uint Baud;
/// <summary>Flow control values for SER and AUX handlers</summary>
public uint Control;
/// <summary>Since Kickstart 2, how many boot blocks are to be loaded</summary>
public uint BootBlocks;
}
struct PartitionEntry
{
/// <summary>"PART"</summary>
public uint Magic;
/// <summary>Size in longs</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer to next PartitionEntry</summary>
public uint NextPtr;
/// <summary>Partition flags</summary>
public uint Flags;
/// <summary>Reserved</summary>
public uint Reserved1;
/// <summary>Reserved</summary>
public uint Reserved2;
/// <summary>Preferred flags for OpenDevice()</summary>
public uint DevFlags;
/// <summary>Length of drive name</summary>
public uint DriveNameLen;
/// <summary>Drive name, 31 bytes</summary>
public string DriveName;
/// <summary>Reserved</summary>
public uint Reserved3;
/// <summary>Reserved</summary>
public uint Reserved4;
/// <summary>Reserved</summary>
public uint Reserved5;
/// <summary>Reserved</summary>
public uint Reserved6;
/// <summary>Reserved</summary>
public uint Reserved7;
/// <summary>Reserved</summary>
public uint Reserved8;
/// <summary>Reserved</summary>
public uint Reserved9;
/// <summary>Reserved</summary>
public uint Reserved10;
/// <summary>Reserved</summary>
public uint Reserved11;
/// <summary>Reserved</summary>
public uint Reserved12;
/// <summary>Reserved</summary>
public uint Reserved13;
/// <summary>Reserved</summary>
public uint Reserved14;
/// <summary>Reserved</summary>
public uint Reserved15;
/// <summary>Reserved</summary>
public uint Reserved16;
/// <summary>Reserved</summary>
public uint Reserved17;
/// <summary>DOSEnvVec, more information about partition</summary>
public DosEnvironmentVector DosEnvVec;
}
/// <summary>Device node, mostly useless, except for pointer to first LoadSegment block</summary>
struct DeviceNode
{
/// <summary>Device node type, =0</summary>
public uint Type;
/// <summary>DOS task field, =0</summary>
public uint Task;
/// <summary>Unused, =0</summary>
public uint Locked;
/// <summary>Filename handler to LoadSegment, =0</summary>
public uint Handler;
/// <summary>Stack size when starting task, =0</summary>
public uint StackSize;
/// <summary>Task priority, =0</summary>
public uint Priority;
/// <summary>Startup message, =0</summary>
public uint Startup;
/// <summary>Pointer to first LoadSegment block</summary>
public uint SeglistPtr;
/// <summary>BCPL globabl vector when starting task, =0xFFFFFFFF</summary>
public uint GlobalVec;
}
/// <summary>File system header</summary>
struct FileSystemHeader
{
/// <summary>"FSHD"</summary>
public uint Magic;
/// <summary>Size in longs, 64</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer to next FileSystemHeader block</summary>
public uint NextPtr;
/// <summary>Flags, unknown</summary>
public uint Flags;
/// <summary>Reserved</summary>
public uint Reserved1;
/// <summary>Reserved</summary>
public uint Reserved2;
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
public uint DosType;
/// <summary>Filesystem version Mask 0xFFFF0000, >>16, major version Mask 0x0000FFFF, minor version</summary>
public uint Version;
/// <summary>Bits for DeviceNode fields that should be substituted into a standard device node</summary>
public uint PatchFlags;
/// <summary>Device node</summary>
public DeviceNode Dnode;
}
/// <summary>Filesystem code</summary>
struct LoadSegment
{
/// <summary>"LSEG"</summary>
public uint Magic;
/// <summary>Size in longs</summary>
public uint Size;
/// <summary>Checksum</summary>
public int Checksum;
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
public uint TargetId;
/// <summary>Pointer to next LoadSegment</summary>
public uint NextPtr;
/// <summary>Executable code, with relocation hunks, til end of sector</summary>
public byte[] LoadData;
}
#endregion
}

View File

@@ -48,10 +48,14 @@ public sealed class RioKarma : IPartition
const ushort KARMA_MAGIC = 0xAB56;
const byte ENTRY_MAGIC = 0x4D;
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.RioKarma_Name;
/// <inheritdoc />
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -72,20 +76,42 @@ public sealed class RioKarma : IPartition
ulong counter = 0;
partitions = (from entry in table.entries let part = new Partition
{
Start = entry.offset,
Offset = (ulong)(entry.offset * sector.Length),
Size = entry.size,
Length = (ulong)(entry.size * sector.Length),
Type = Localization.Rio_Karma,
Sequence = counter++,
Scheme = Name
} where entry.type == ENTRY_MAGIC select part).ToList();
partitions = (from entry in table.entries
let part = new Partition
{
Start = entry.offset,
Offset = (ulong)(entry.offset * sector.Length),
Size = entry.size,
Length = (ulong)(entry.size * sector.Length),
Type = Localization.Rio_Karma,
Sequence = counter++,
Scheme = Name
}
where entry.type == ENTRY_MAGIC
select part).ToList();
return true;
}
#endregion
#region Nested type: Entry
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Entry
{
public readonly uint reserved;
public readonly byte type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly byte[] reserved2;
public readonly uint offset;
public readonly uint size;
}
#endregion
#region Nested type: Table
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Table
{
@@ -98,14 +124,5 @@ public sealed class RioKarma : IPartition
public readonly ushort magic;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Entry
{
public readonly uint reserved;
public readonly byte type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly byte[] reserved2;
public readonly uint offset;
public readonly uint size;
}
#endregion
}

View File

@@ -53,10 +53,14 @@ public sealed class SGI : IPartition
const int SGI_MAGIC = 0x0BE5A941;
const string MODULE_NAME = "SGI Volume Header plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.SGI_Name;
/// <inheritdoc />
public Guid Id => new("AEF5AB45-4880-4CE8-8735-F0A402E2E5F2");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -73,10 +77,10 @@ public sealed class SGI : IPartition
Label dvh = Marshal.ByteArrayToStructureBigEndian<Label>(sector);
for(int i = 0; i < dvh.volume.Length; i++)
for(var i = 0; i < dvh.volume.Length; i++)
dvh.volume[i] = (Volume)Marshal.SwapStructureMembersEndian(dvh.volume[i]);
for(int i = 0; i < dvh.partitions.Length; i++)
for(var i = 0; i < dvh.partitions.Length; i++)
dvh.partitions[i] = (Partition)Marshal.SwapStructureMembersEndian(dvh.partitions[i]);
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.dvh_magic_equals_0_X8_should_be_1_X8, dvh.magic,
@@ -97,8 +101,8 @@ public sealed class SGI : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_spares_cyl = {0}",
dvh.device_params.dp_spares_cyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_cyls = {0}", dvh.device_params.dp_cyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_shd0 = {0}", dvh.device_params.dp_shd0);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_cyls = {0}", dvh.device_params.dp_cyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_shd0 = {0}", dvh.device_params.dp_shd0);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_trks0 = {0}", dvh.device_params.dp_trks0);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_ctq_depth = {0}",
@@ -122,7 +126,7 @@ public sealed class SGI : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_nretries = {0}",
dvh.device_params.dp_nretries);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_mspw = {0}", dvh.device_params.dp_mspw);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_mspw = {0}", dvh.device_params.dp_mspw);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_xgap1 = {0}", dvh.device_params.dp_xgap1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_xsync = {0}", dvh.device_params.dp_xsync);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_xrdly = {0}", dvh.device_params.dp_xrdly);
@@ -134,7 +138,7 @@ public sealed class SGI : IPartition
ulong counter = 0;
for(int i = 0; i < dvh.partitions.Length; i++)
for(var i = 0; i < dvh.partitions.Length; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.partitions[{0}].num_blocks = {1}", i,
dvh.partitions[i].num_blocks);
@@ -166,86 +170,31 @@ public sealed class SGI : IPartition
return true;
}
#endregion
static string TypeToString(SGIType typ) => typ switch
{
SGIType.Header => Localization.Volume_header,
SGIType.TrkRepl => Localization.Track_replacements,
SGIType.SecRepl => Localization.Sector_replacements,
SGIType.Swap => Localization.Raw_data_swap,
SGIType.Bsd => Localization._4_2_BSD_Fast_File_System,
SGIType.SystemV => Localization.UNIX_System_V,
SGIType.Volume => Localization.Whole_device,
SGIType.EFS => Localization.EFS,
SGIType.Lvol => Localization.Logical_volume,
SGIType.Rlvol => Localization.Raw_logical_volume,
SGIType.XFS => Localization.XFS,
SGIType.Xlvol => Localization.XFS_log_device,
SGIType.Rxlvol => Localization.XLV_volume,
SGIType.Xvm => Localization.SGI_XVM,
SGIType.LinuxSwap => Localization.Linux_swap,
SGIType.Linux => Localization.Linux,
SGIType.LinuxRAID => Localization.Linux_RAID,
_ => Localization.Unknown_partition_type
};
{
SGIType.Header => Localization.Volume_header,
SGIType.TrkRepl => Localization.Track_replacements,
SGIType.SecRepl => Localization.Sector_replacements,
SGIType.Swap => Localization.Raw_data_swap,
SGIType.Bsd => Localization._4_2_BSD_Fast_File_System,
SGIType.SystemV => Localization.UNIX_System_V,
SGIType.Volume => Localization.Whole_device,
SGIType.EFS => Localization.EFS,
SGIType.Lvol => Localization.Logical_volume,
SGIType.Rlvol => Localization.Raw_logical_volume,
SGIType.XFS => Localization.XFS,
SGIType.Xlvol => Localization.XFS_log_device,
SGIType.Rxlvol => Localization.XLV_volume,
SGIType.Xvm => Localization.SGI_XVM,
SGIType.LinuxSwap => Localization.Linux_swap,
SGIType.Linux => Localization.Linux,
SGIType.LinuxRAID => Localization.Linux_RAID,
_ => Localization.Unknown_partition_type
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Label
{
/// <summary></summary>
public readonly uint magic;
/// <summary></summary>
public readonly short root_part_num;
/// <summary></summary>
public readonly short swap_part_num;
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] boot_file;
/// <summary></summary>
public readonly DeviceParameters device_params;
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public readonly Volume[] volume;
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly Partition[] partitions;
/// <summary></summary>
public readonly uint csum;
/// <summary></summary>
public readonly uint padding;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Volume
{
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] name;
/// <summary></summary>
public readonly uint block_num;
/// <summary></summary>
public readonly uint num_bytes;
}
enum SGIType : uint
{
Header = 0, TrkRepl = 1, SecRepl = 2,
Swap = 3, Bsd = 4, SystemV = 5,
Volume = 6, EFS = 7, Lvol = 8,
Rlvol = 9, XFS = 0xA, Xlvol = 0xB,
Rxlvol = 0xC, Xvm = 0x0D, LinuxSwap = 0x82,
Linux = 0x83, LinuxRAID = 0xFD
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Partition
{
/// <summary></summary>
public readonly uint num_blocks;
/// <summary></summary>
public readonly uint first_block;
/// <summary></summary>
public readonly SGIType type;
}
#region Nested type: DeviceParameters
struct DeviceParameters
{
@@ -273,4 +222,92 @@ public sealed class SGI : IPartition
public ushort dp_xrgate;
public ushort dp_xwcont;
}
#endregion
#region Nested type: Label
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Label
{
/// <summary></summary>
public readonly uint magic;
/// <summary></summary>
public readonly short root_part_num;
/// <summary></summary>
public readonly short swap_part_num;
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] boot_file;
/// <summary></summary>
public readonly DeviceParameters device_params;
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public readonly Volume[] volume;
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly Partition[] partitions;
/// <summary></summary>
public readonly uint csum;
/// <summary></summary>
public readonly uint padding;
}
#endregion
#region Nested type: Partition
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Partition
{
/// <summary></summary>
public readonly uint num_blocks;
/// <summary></summary>
public readonly uint first_block;
/// <summary></summary>
public readonly SGIType type;
}
#endregion
#region Nested type: SGIType
enum SGIType : uint
{
Header = 0,
TrkRepl = 1,
SecRepl = 2,
Swap = 3,
Bsd = 4,
SystemV = 5,
Volume = 6,
EFS = 7,
Lvol = 8,
Rlvol = 9,
XFS = 0xA,
Xlvol = 0xB,
Rxlvol = 0xC,
Xvm = 0x0D,
LinuxSwap = 0x82,
Linux = 0x83,
LinuxRAID = 0xFD
}
#endregion
#region Nested type: Volume
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Volume
{
/// <summary></summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] name;
/// <summary></summary>
public readonly uint block_num;
/// <summary></summary>
public readonly uint num_bytes;
}
#endregion
}

View File

@@ -68,18 +68,22 @@ public sealed class SunDisklabel : IPartition
/// <summary>Length of v_volume</summary>
const int LEN_DKL_VVOL = 8;
/// <summary>Size of padding in SunOS disk label</summary>
const int LEN_DKL_PAD = DK_LABEL_SIZE - (LEN_DKL_ASCII + (NDKMAP * 8) + (14 * 2));
const int LEN_DKL_PAD = DK_LABEL_SIZE - (LEN_DKL_ASCII + NDKMAP * 8 + 14 * 2);
/// <summary>Size of padding in Solaris disk label with 8 partitions</summary>
const int LEN_DKL_PAD8 = DK_LABEL_SIZE - (LEN_DKL_ASCII + 136 + // sizeof(dk_vtoc8)
(NDKMAP * 8) + (14 * 2) + (2 * 2));
const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16)
(4 * 4) + (12 * 2) + (2 * 2));
const int LEN_DKL_PAD8 = DK_LABEL_SIZE - (LEN_DKL_ASCII + 136 + // sizeof(dk_vtoc8)
NDKMAP * 8 + 14 * 2 + 2 * 2);
const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16)
4 * 4 + 12 * 2 + 2 * 2);
const string MODULE_NAME = "Sun partitions plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.SunDisklabel_Name;
/// <inheritdoc />
public Guid Id => new("50F35CC4-8375-4445-8DCB-1BA550C931A3");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -105,17 +109,19 @@ public sealed class SunDisklabel : IPartition
dk_label8 dkl8 = Marshal.ByteArrayToStructureLittleEndian<dk_label8>(sunSector);
dk_label16 dkl16 = Marshal.ByteArrayToStructureLittleEndian<dk_label16>(sunSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_magic = 0x{0:X4}", dkl.dkl_magic);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_sanity = 0x{0:X8}", dkl8.dkl_vtoc.v_sanity);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_magic = 0x{0:X4}", dkl.dkl_magic);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_sanity = 0x{0:X8}", dkl8.dkl_vtoc.v_sanity);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_sanity = 0x{0:X8}", dkl16.dkl_vtoc.v_sanity);
if(dkl.dkl_magic is DKL_MAGIC or DKL_CIGAM)
{
if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl16 = true;
else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl8 = true;
else
useDkl = true;
}
if(!useDkl &&
!useDkl8 &&
@@ -130,12 +136,14 @@ public sealed class SunDisklabel : IPartition
dkl16 = Marshal.ByteArrayToStructureLittleEndian<dk_label16>(sunSector);
if(dkl.dkl_magic is DKL_MAGIC or DKL_CIGAM)
{
if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl16 = true;
else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl8 = true;
else
useDkl = true;
}
}
}
@@ -153,25 +161,25 @@ public sealed class SunDisklabel : IPartition
if(useDkl)
{
ulong sectorsPerCylinder = (ulong)(dkl.dkl_nsect * dkl.dkl_nhead);
var sectorsPerCylinder = (ulong)(dkl.dkl_nsect * dkl.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_asciilabel = \"{0}\"",
StringHandlers.CToString(dkl.dkl_asciilabel));
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_rpm = {0}", dkl.dkl_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_pcyl = {0}", dkl.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_apc = {0}", dkl.dkl_apc);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap1 = {0}", dkl.dkl_gap1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap2 = {0}", dkl.dkl_gap2);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_rpm = {0}", dkl.dkl_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_pcyl = {0}", dkl.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_apc = {0}", dkl.dkl_apc);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap1 = {0}", dkl.dkl_gap1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap2 = {0}", dkl.dkl_gap2);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_intrlv = {0}", dkl.dkl_intrlv);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ncyl = {0}", dkl.dkl_ncyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_acyl = {0}", dkl.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nhead = {0}", dkl.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nsect = {0}", dkl.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_bhead = {0}", dkl.dkl_bhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ppart = {0}", dkl.dkl_ppart);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ncyl = {0}", dkl.dkl_ncyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_acyl = {0}", dkl.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nhead = {0}", dkl.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nsect = {0}", dkl.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_bhead = {0}", dkl.dkl_bhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ppart = {0}", dkl.dkl_ppart);
for(int i = 0; i < NDKMAP; i++)
for(var i = 0; i < NDKMAP; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_map[{0}].dkl_cylno = {1}", i,
dkl.dkl_map[i].dkl_cylno);
@@ -183,7 +191,8 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_cksum = 0x{0:X4}", dkl.dkl_cksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "sectorsPerCylinder = {0}", sectorsPerCylinder);
for(int i = 0; i < NDKMAP; i++)
for(var i = 0; i < NDKMAP; i++)
{
if(dkl.dkl_map[i].dkl_cylno > 0 &&
dkl.dkl_map[i].dkl_nblk > 0)
{
@@ -193,8 +202,8 @@ public sealed class SunDisklabel : IPartition
Length = (ulong)(dkl.dkl_map[i].dkl_nblk * DK_LABEL_SIZE / imagePlugin.Info.SectorSize),
Sequence = (ulong)i,
Offset =
(((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) * DK_LABEL_SIZE,
Start = (((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) *
((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) * DK_LABEL_SIZE,
Start = ((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) *
DK_LABEL_SIZE / imagePlugin.Info.SectorSize,
Type = Localization.SunOS_partition,
Scheme = Name
@@ -204,10 +213,11 @@ public sealed class SunDisklabel : IPartition
part.End <= imagePlugin.Info.Sectors)
partitions.Add(part);
}
}
}
else if(useDkl8)
{
ulong sectorsPerCylinder = (ulong)(dkl8.dkl_nsect * dkl8.dkl_nhead);
var sectorsPerCylinder = (ulong)(dkl8.dkl_nsect * dkl8.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_asciilabel = \"{0}\"",
StringHandlers.CToString(dkl8.dkl_asciilabel));
@@ -217,24 +227,24 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_volume = \"{0}\"",
StringHandlers.CToString(dkl8.dkl_vtoc.v_volume));
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_nparts = {0}", dkl8.dkl_vtoc.v_nparts);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_nparts = {0}", dkl8.dkl_vtoc.v_nparts);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_sanity = 0x{0:X8}", dkl8.dkl_vtoc.v_sanity);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_write_reinstruct = {0}", dkl8.dkl_write_reinstruct);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_read_reinstruct = {0}", dkl8.dkl_read_reinstruct);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_rpm = {0}", dkl8.dkl_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_pcyl = {0}", dkl8.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_apc = {0}", dkl8.dkl_apc);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs1 = {0}", dkl8.dkl_obs1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs2 = {0}", dkl8.dkl_obs2);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_intrlv = {0}", dkl8.dkl_intrlv);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_ncyl = {0}", dkl8.dkl_ncyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_acyl = {0}", dkl8.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nhead = {0}", dkl8.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nsect = {0}", dkl8.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs3 = {0}", dkl8.dkl_obs3);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs4 = {0}", dkl8.dkl_obs4);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_write_reinstruct = {0}", dkl8.dkl_write_reinstruct);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_read_reinstruct = {0}", dkl8.dkl_read_reinstruct);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_rpm = {0}", dkl8.dkl_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_pcyl = {0}", dkl8.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_apc = {0}", dkl8.dkl_apc);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs1 = {0}", dkl8.dkl_obs1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs2 = {0}", dkl8.dkl_obs2);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_intrlv = {0}", dkl8.dkl_intrlv);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_ncyl = {0}", dkl8.dkl_ncyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_acyl = {0}", dkl8.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nhead = {0}", dkl8.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nsect = {0}", dkl8.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs3 = {0}", dkl8.dkl_obs3);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs4 = {0}", dkl8.dkl_obs4);
for(int i = 0; i < NDKMAP; i++)
for(var i = 0; i < NDKMAP; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_map[{0}].dkl_cylno = {1}", i,
dkl8.dkl_map[i].dkl_cylno);
@@ -254,12 +264,13 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_magic = 0x{0:X4}", dkl8.dkl_magic);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_cksum = 0x{0:X4}", dkl8.dkl_cksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "sectorsPerCylinder = {0}", sectorsPerCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "sectorsPerCylinder = {0}", sectorsPerCylinder);
if(dkl8.dkl_vtoc.v_nparts > NDKMAP)
return false;
for(int i = 0; i < dkl8.dkl_vtoc.v_nparts; i++)
for(var i = 0; i < dkl8.dkl_vtoc.v_nparts; i++)
{
if(dkl8.dkl_map[i].dkl_nblk > 0 &&
dkl8.dkl_vtoc.v_part[i].p_tag != SunTag.SunEmpty &&
dkl8.dkl_vtoc.v_part[i].p_tag != SunTag.SunWholeDisk)
@@ -270,54 +281,57 @@ public sealed class SunDisklabel : IPartition
Size = (ulong)dkl8.dkl_map[i].dkl_nblk * DK_LABEL_SIZE,
Length = (ulong)(dkl8.dkl_map[i].dkl_nblk * DK_LABEL_SIZE / imagePlugin.Info.SectorSize),
Sequence = (ulong)i,
Offset = (((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) *
Offset = ((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) *
DK_LABEL_SIZE,
Start = (((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) *
Start = ((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) *
DK_LABEL_SIZE / imagePlugin.Info.SectorSize,
Type = SunIdToString(dkl8.dkl_vtoc.v_part[i].p_tag),
Scheme = Name
};
if(dkl8.dkl_vtoc.v_timestamp[i] != 0)
{
part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0,
DateHandlers.
UnixToDateTime(dkl8.dkl_vtoc.v_timestamp[i]));
}
if(part.Start < imagePlugin.Info.Sectors &&
part.End <= imagePlugin.Info.Sectors)
partitions.Add(part);
}
}
}
else
{
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_sanity = 0x{0:X8}", dkl16.dkl_vtoc.v_sanity);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_version = {0}", dkl16.dkl_vtoc.v_version);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_version = {0}", dkl16.dkl_vtoc.v_version);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_volume = \"{0}\"",
StringHandlers.CToString(dkl16.dkl_vtoc.v_volume));
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_sectorsz = {0}", dkl16.dkl_vtoc.v_sectorsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_nparts = {0}", dkl16.dkl_vtoc.v_nparts);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_nparts = {0}", dkl16.dkl_vtoc.v_nparts);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_asciilabel = \"{0}\"",
StringHandlers.CToString(dkl16.dkl_vtoc.v_asciilabel));
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_pcyl = {0}", dkl16.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_ncyl = {0}", dkl16.dkl_ncyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_acyl = {0}", dkl16.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_bcyl = {0}", dkl16.dkl_bcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nhead = {0}", dkl16.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nsect = {0}", dkl16.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_pcyl = {0}", dkl16.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_ncyl = {0}", dkl16.dkl_ncyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_acyl = {0}", dkl16.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_bcyl = {0}", dkl16.dkl_bcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nhead = {0}", dkl16.dkl_nhead);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nsect = {0}", dkl16.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_intrlv = {0}", dkl16.dkl_intrlv);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_skew = {0}", dkl16.dkl_skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_apc = {0}", dkl16.dkl_apc);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_rpm = {0}", dkl16.dkl_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_skew = {0}", dkl16.dkl_skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_apc = {0}", dkl16.dkl_apc);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_rpm = {0}", dkl16.dkl_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_write_reinstruct = {0}", dkl16.dkl_write_reinstruct);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_read_reinstruct = {0}", dkl16.dkl_read_reinstruct);
for(int i = 0; i < NDKMAP16; i++)
for(var i = 0; i < NDKMAP16; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_part[{0}].p_start = {1}", i,
dkl16.dkl_vtoc.v_part[i].p_start);
@@ -341,7 +355,8 @@ public sealed class SunDisklabel : IPartition
if(dkl16.dkl_vtoc.v_nparts > NDKMAP16)
return false;
for(int i = 0; i < dkl16.dkl_vtoc.v_nparts; i++)
for(var i = 0; i < dkl16.dkl_vtoc.v_nparts; i++)
{
if(dkl16.dkl_vtoc.v_part[i].p_size > 0 &&
dkl16.dkl_vtoc.v_part[i].p_tag != SunTag.SunEmpty &&
dkl16.dkl_vtoc.v_part[i].p_tag != SunTag.SunWholeDisk)
@@ -361,25 +376,30 @@ public sealed class SunDisklabel : IPartition
};
if(dkl16.dkl_vtoc.v_timestamp[i] != 0)
{
part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0,
DateHandlers.
UnixToDateTime(dkl16.dkl_vtoc.v_timestamp[i]));
}
if(part.Start < imagePlugin.Info.Sectors &&
part.End <= imagePlugin.Info.Sectors)
partitions.Add(part);
}
}
}
return partitions.Count > 0;
}
#endregion
static dk_label SwapDiskLabel(dk_label label)
{
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label);
label = (dk_label)Marshal.SwapStructureMembersEndian(label);
for(int i = 0; i < label.dkl_map.Length; i++)
for(var i = 0; i < label.dkl_map.Length; i++)
label.dkl_map[i] = (dk_map)Marshal.SwapStructureMembersEndian(label.dkl_map[i]);
return label;
@@ -390,22 +410,22 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label8);
label = (dk_label8)Marshal.SwapStructureMembersEndian(label);
for(int i = 0; i < label.dkl_map.Length; i++)
for(var i = 0; i < label.dkl_map.Length; i++)
label.dkl_map[i] = (dk_map)Marshal.SwapStructureMembersEndian(label.dkl_map[i]);
for(int i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
label.dkl_vtoc.v_bootinfo[i] = Swapping.Swap(label.dkl_vtoc.v_bootinfo[i]);
for(int i = 0; i < label.dkl_vtoc.v_part.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_part.Length; i++)
{
label.dkl_vtoc.v_part[i].p_flag = (SunFlags)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_flag);
label.dkl_vtoc.v_part[i].p_tag = (SunTag)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_tag);
}
for(int i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
label.dkl_vtoc.v_timestamp[i] = Swapping.Swap(label.dkl_vtoc.v_timestamp[i]);
for(int i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
label.dkl_vtoc.v_reserved[i] = Swapping.Swap(label.dkl_vtoc.v_reserved[i]);
return label;
@@ -416,10 +436,10 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label16);
label = (dk_label16)Marshal.SwapStructureMembersEndian(label);
for(int i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
label.dkl_vtoc.v_bootinfo[i] = Swapping.Swap(label.dkl_vtoc.v_bootinfo[i]);
for(int i = 0; i < label.dkl_vtoc.v_part.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_part.Length; i++)
{
label.dkl_vtoc.v_part[i].p_flag = (SunFlags)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_flag);
label.dkl_vtoc.v_part[i].p_tag = (SunTag)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_tag);
@@ -427,10 +447,10 @@ public sealed class SunDisklabel : IPartition
label.dkl_vtoc.v_part[i].p_start = Swapping.Swap(label.dkl_vtoc.v_part[i].p_start);
}
for(int i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
label.dkl_vtoc.v_timestamp[i] = Swapping.Swap(label.dkl_vtoc.v_timestamp[i]);
for(int i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
for(var i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
label.dkl_vtoc.v_reserved[i] = Swapping.Swap(label.dkl_vtoc.v_reserved[i]);
return label;
@@ -450,61 +470,35 @@ public sealed class SunDisklabel : IPartition
}
static string SunIdToString(SunTag id) => id switch
{
SunTag.Linux => Localization.Linux,
SunTag.LinuxRaid => Localization.Linux_RAID,
SunTag.LinuxSwap => Localization.Linux_swap,
SunTag.LVM => Localization.LVM,
SunTag.SunBoot => Localization.Sun_boot,
SunTag.SunEmpty => Localization.Empty,
SunTag.SunHome => Localization.Sun_home,
SunTag.SunRoot => Localization.Sun_root,
SunTag.SunStand => Localization.Sun_stand,
SunTag.SunSwap => Localization.Sun_swap,
SunTag.SunUsr => Localization.Sun_usr,
SunTag.SunVar => Localization.Sun_var,
SunTag.SunWholeDisk => Localization.Whole_disk,
SunTag.SunAlt => Localization.Replacement_sectors,
SunTag.SunCache => Localization.Sun_cachefs,
SunTag.SunReserved => Localization.Reserved_for_SMI,
SunTag.VxVmPublic => Localization.Veritas_public,
SunTag.VxVmPrivate => Localization.Veritas_private,
SunTag.NetBSD => Localization.NetBSD,
SunTag.FreeBSD_Swap => Localization.FreeBSD_swap,
SunTag.FreeBSD_UFS => Localization.FreeBSD,
SunTag.FreeBSD_Vinum => Localization.Vinum,
SunTag.FreeBSD_ZFS => Localization.FreeBSD_ZFS,
SunTag.FreeBSD_NANDFS => Localization.FreeBSD_nandfs,
_ => Localization.Unknown_partition_type
};
{
SunTag.Linux => Localization.Linux,
SunTag.LinuxRaid => Localization.Linux_RAID,
SunTag.LinuxSwap => Localization.Linux_swap,
SunTag.LVM => Localization.LVM,
SunTag.SunBoot => Localization.Sun_boot,
SunTag.SunEmpty => Localization.Empty,
SunTag.SunHome => Localization.Sun_home,
SunTag.SunRoot => Localization.Sun_root,
SunTag.SunStand => Localization.Sun_stand,
SunTag.SunSwap => Localization.Sun_swap,
SunTag.SunUsr => Localization.Sun_usr,
SunTag.SunVar => Localization.Sun_var,
SunTag.SunWholeDisk => Localization.Whole_disk,
SunTag.SunAlt => Localization.Replacement_sectors,
SunTag.SunCache => Localization.Sun_cachefs,
SunTag.SunReserved => Localization.Reserved_for_SMI,
SunTag.VxVmPublic => Localization.Veritas_public,
SunTag.VxVmPrivate => Localization.Veritas_private,
SunTag.NetBSD => Localization.NetBSD,
SunTag.FreeBSD_Swap => Localization.FreeBSD_swap,
SunTag.FreeBSD_UFS => Localization.FreeBSD,
SunTag.FreeBSD_Vinum => Localization.Vinum,
SunTag.FreeBSD_ZFS => Localization.FreeBSD_ZFS,
SunTag.FreeBSD_NANDFS => Localization.FreeBSD_nandfs,
_ => Localization.Unknown_partition_type
};
enum SunTag : ushort
{
SunEmpty = 0x0000, SunBoot = 0x0001, SunRoot = 0x0002,
SunSwap = 0x0003, SunUsr = 0x0004, SunWholeDisk = 0x0005,
SunStand = 0x0006, SunVar = 0x0007, SunHome = 0x0008,
SunAlt = 0x0009, SunCache = 0x000A, SunReserved = 0x000B,
VxVmPublic = 0x000E, VxVmPrivate = 0x000F, LinuxSwap = 0x0082,
Linux = 0x0083, LVM = 0x008E, LinuxRaid = 0x00FD,
NetBSD = 0x00FF, FreeBSD_Swap = 0x0901, FreeBSD_UFS = 0x0902,
FreeBSD_Vinum = 0x0903, FreeBSD_ZFS = 0x0904, FreeBSD_NANDFS = 0x0905
}
[Flags]
enum SunFlags : ushort
{
NoMount = 0x0001, ReadOnly = 0x0010
}
/// <summary>SunOS logical partitions</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_map
{
/// <summary>starting cylinder</summary>
public readonly int dkl_cylno;
/// <summary>number of blocks</summary>
public readonly int dkl_nblk;
}
#region Nested type: dk_label
/// <summary>SunOS disk label</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -549,88 +543,54 @@ public sealed class SunDisklabel : IPartition
public readonly ushort dkl_cksum;
}
/// <summary>Solaris logical partition for small disk label</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_map2
{
/// <summary> ID tag of partition</summary>
public SunTag p_tag;
/// <summary> permission flag</summary>
public SunFlags p_flag;
}
#endregion
/// <summary>Solaris logical partition</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dkl_partition
{
/// <summary>ID tag of partition</summary>
public SunTag p_tag;
/// <summary>permision flags</summary>
public SunFlags p_flag;
/// <summary>start sector no of partition</summary>
public int p_start;
/// <summary># of blocks in partition</summary>
public int p_size;
}
#region Nested type: dk_label16
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_vtoc8
struct dk_label16
{
/// <summary> layout version</summary>
public readonly uint v_version;
/// <summary> volume name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
public readonly byte[] v_volume;
/// <summary> number of partitions </summary>
public readonly ushort v_nparts;
/// <summary> partition hdrs, sec 2</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
public readonly dk_map2[] v_part;
/// <summary>Alignment</summary>
public readonly ushort padding;
/// <summary> info needed by mboot</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly uint[] v_bootinfo;
/// <summary> to verify vtoc sanity</summary>
public readonly uint v_sanity;
/// <summary> free space</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved;
/// <summary> partition timestamp</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
public readonly int[] v_timestamp;
/// <summary>vtoc inclusions from AT&amp;T SVr4</summary>
public readonly dk_vtoc16 dkl_vtoc;
/// <summary># of physical cylinders</summary>
public readonly uint dkl_pcyl;
/// <summary># of data cylinders</summary>
public readonly uint dkl_ncyl;
/// <summary># of alternate cylinders</summary>
public readonly ushort dkl_acyl;
/// <summary>cyl offset (for fixed head area)</summary>
public readonly ushort dkl_bcyl;
/// <summary># of heads</summary>
public readonly uint dkl_nhead;
/// <summary># of data sectors per track</summary>
public readonly uint dkl_nsect;
/// <summary>interleave factor</summary>
public readonly ushort dkl_intrlv;
/// <summary>skew factor</summary>
public readonly ushort dkl_skew;
/// <summary>alternates per cyl (SCSI only) </summary>
public readonly ushort dkl_apc;
/// <summary>revolutions per minute</summary>
public readonly ushort dkl_rpm;
/// <summary># sectors to skip, writes</summary>
public readonly ushort dkl_write_reinstruct;
/// <summary># sectors to skip, reads </summary>
public readonly ushort dkl_read_reinstruct;
/// <summary>for compatible expansion</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly ushort[] dkl_extra;
/// <summary>unused part of 512 bytes</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_PAD16)]
public readonly byte[] dkl_pad;
/// <summary>identifies this label format</summary>
public readonly ushort dkl_magic;
/// <summary>xor checksum of sector</summary>
public readonly ushort dkl_cksum;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_vtoc16
{
/// <summary>info needed by mboot</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly uint[] v_bootinfo;
/// <summary>to verify vtoc sanity</summary>
public readonly uint v_sanity;
/// <summary>layout version</summary>
public readonly uint v_version;
/// <summary>volume name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
public readonly byte[] v_volume;
/// <summary>sector size in bytes</summary>
public readonly ushort v_sectorsz;
/// <summary>number of partitions</summary>
public readonly ushort v_nparts;
/// <summary>free space</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved;
/// <summary>partition headers</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
public readonly dkl_partition[] v_part;
/// <summary>partition timestamp</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
public readonly int[] v_timestamp;
/// <summary>for compatibility</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_ASCII)]
public readonly byte[] v_asciilabel;
}
#endregion
#region Nested type: dk_label8
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_label8
@@ -680,44 +640,161 @@ public sealed class SunDisklabel : IPartition
public readonly ushort dkl_cksum;
}
#endregion
#region Nested type: dk_map
/// <summary>SunOS logical partitions</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_label16
struct dk_map
{
/// <summary>vtoc inclusions from AT&amp;T SVr4</summary>
public readonly dk_vtoc16 dkl_vtoc;
/// <summary># of physical cylinders</summary>
public readonly uint dkl_pcyl;
/// <summary># of data cylinders</summary>
public readonly uint dkl_ncyl;
/// <summary># of alternate cylinders</summary>
public readonly ushort dkl_acyl;
/// <summary>cyl offset (for fixed head area)</summary>
public readonly ushort dkl_bcyl;
/// <summary># of heads</summary>
public readonly uint dkl_nhead;
/// <summary># of data sectors per track</summary>
public readonly uint dkl_nsect;
/// <summary>interleave factor</summary>
public readonly ushort dkl_intrlv;
/// <summary>skew factor</summary>
public readonly ushort dkl_skew;
/// <summary>alternates per cyl (SCSI only) </summary>
public readonly ushort dkl_apc;
/// <summary>revolutions per minute</summary>
public readonly ushort dkl_rpm;
/// <summary># sectors to skip, writes</summary>
public readonly ushort dkl_write_reinstruct;
/// <summary># sectors to skip, reads </summary>
public readonly ushort dkl_read_reinstruct;
/// <summary>for compatible expansion</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly ushort[] dkl_extra;
/// <summary>unused part of 512 bytes</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_PAD16)]
public readonly byte[] dkl_pad;
/// <summary>identifies this label format</summary>
public readonly ushort dkl_magic;
/// <summary>xor checksum of sector</summary>
public readonly ushort dkl_cksum;
/// <summary>starting cylinder</summary>
public readonly int dkl_cylno;
/// <summary>number of blocks</summary>
public readonly int dkl_nblk;
}
#endregion
#region Nested type: dk_map2
/// <summary>Solaris logical partition for small disk label</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_map2
{
/// <summary> ID tag of partition</summary>
public SunTag p_tag;
/// <summary> permission flag</summary>
public SunFlags p_flag;
}
#endregion
#region Nested type: dk_vtoc16
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_vtoc16
{
/// <summary>info needed by mboot</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly uint[] v_bootinfo;
/// <summary>to verify vtoc sanity</summary>
public readonly uint v_sanity;
/// <summary>layout version</summary>
public readonly uint v_version;
/// <summary>volume name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
public readonly byte[] v_volume;
/// <summary>sector size in bytes</summary>
public readonly ushort v_sectorsz;
/// <summary>number of partitions</summary>
public readonly ushort v_nparts;
/// <summary>free space</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved;
/// <summary>partition headers</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
public readonly dkl_partition[] v_part;
/// <summary>partition timestamp</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
public readonly int[] v_timestamp;
/// <summary>for compatibility</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_ASCII)]
public readonly byte[] v_asciilabel;
}
#endregion
#region Nested type: dk_vtoc8
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_vtoc8
{
/// <summary> layout version</summary>
public readonly uint v_version;
/// <summary> volume name</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
public readonly byte[] v_volume;
/// <summary> number of partitions </summary>
public readonly ushort v_nparts;
/// <summary> partition hdrs, sec 2</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
public readonly dk_map2[] v_part;
/// <summary>Alignment</summary>
public readonly ushort padding;
/// <summary> info needed by mboot</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly uint[] v_bootinfo;
/// <summary> to verify vtoc sanity</summary>
public readonly uint v_sanity;
/// <summary> free space</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved;
/// <summary> partition timestamp</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
public readonly int[] v_timestamp;
}
#endregion
#region Nested type: dkl_partition
/// <summary>Solaris logical partition</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dkl_partition
{
/// <summary>ID tag of partition</summary>
public SunTag p_tag;
/// <summary>permision flags</summary>
public SunFlags p_flag;
/// <summary>start sector no of partition</summary>
public int p_start;
/// <summary># of blocks in partition</summary>
public int p_size;
}
#endregion
#region Nested type: SunFlags
[Flags]
enum SunFlags : ushort
{
NoMount = 0x0001,
ReadOnly = 0x0010
}
#endregion
#region Nested type: SunTag
enum SunTag : ushort
{
SunEmpty = 0x0000,
SunBoot = 0x0001,
SunRoot = 0x0002,
SunSwap = 0x0003,
SunUsr = 0x0004,
SunWholeDisk = 0x0005,
SunStand = 0x0006,
SunVar = 0x0007,
SunHome = 0x0008,
SunAlt = 0x0009,
SunCache = 0x000A,
SunReserved = 0x000B,
VxVmPublic = 0x000E,
VxVmPrivate = 0x000F,
LinuxSwap = 0x0082,
Linux = 0x0083,
LVM = 0x008E,
LinuxRaid = 0x00FD,
NetBSD = 0x00FF,
FreeBSD_Swap = 0x0901,
FreeBSD_UFS = 0x0902,
FreeBSD_Vinum = 0x0903,
FreeBSD_ZFS = 0x0904,
FreeBSD_NANDFS = 0x0905
}
#endregion
}

View File

@@ -1373,10 +1373,14 @@ public sealed class UNIX : IPartition
}
};
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.UNIX_Name;
/// <inheritdoc />
public Guid Id => new("9ED7E30B-53BF-4619-87A0-5D2002155617");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -1465,14 +1469,17 @@ public sealed class UNIX : IPartition
parts = RP06;
break;
default: return false;
default:
return false;
}
for(int i = 0; i < parts.Length; i++)
for(var i = 0; i < parts.Length; i++)
parts[i].Scheme = "";
partitions = parts.ToList();
return partitions.Count > 0;
}
#endregion
}

View File

@@ -57,10 +57,14 @@ public sealed class VTOC : IPartition
const uint XPDVERS = 3; /* 1st version of extended pdinfo */
const string MODULE_NAME = "UNIX VTOC plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.VTOC_Name;
/// <inheritdoc />
public Guid Id => new("6D35A66F-8D77-426F-A562-D88F6A1F1702");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -72,14 +76,11 @@ public sealed class VTOC : IPartition
uint magic = 0;
ulong pdloc = 0;
byte[] pdsector = null;
bool magicFound = false;
bool absolute = false;
var magicFound = false;
var absolute = false;
ErrorNumber errno;
foreach(ulong i in new ulong[]
{
0, 1, 8, 29
}.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
foreach(ulong i in new ulong[] { 0, 1, 8, 29 }.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
{
errno = imagePlugin.ReadSector(i + sectorOffset, out pdsector);
@@ -122,48 +123,48 @@ public sealed class VTOC : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sanity = 0x{0:X8} (should be 0x{1:X8})", pd.sanity, PD_MAGIC);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.version = {0}", pd.version);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.version = {0}", pd.version);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.serial = \"{0}\"", StringHandlers.CToString(pd.serial));
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.cyls = {0}", pd.cyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.tracks = {0}", pd.tracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sectors = {0}", pd.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.bytes = {0}", pd.bytes);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.logicalst = {0}", pd.logicalst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogst = {0}", pd.errlogst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogsz = {0}", pd.errlogsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgst = {0}", pd.mfgst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgsz = {0}", pd.mfgsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectst = {0}", pd.defectst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectsz = {0}", pd.defectsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relno = {0}", pd.relno);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relst = {0}", pd.relst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relsz = {0}", pd.relsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relnext = {0}", pd.relnext);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcstrt = {0}", pdold.allcstrt);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcend = {0}", pdold.allcend);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_ptr = {0}", pd.vtoc_ptr);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_len = {0}", pd.vtoc_len);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_pad = {0}", pd.vtoc_pad);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_ptr = {0}", pd.alt_ptr);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_len = {0}", pd.alt_len);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pcyls = {0}", pd.pcyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.ptracks = {0}", pd.ptracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.psectors = {0}", pd.psectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pbytes = {0}", pd.pbytes);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.secovhd = {0}", pd.secovhd);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.cyls = {0}", pd.cyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.tracks = {0}", pd.tracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sectors = {0}", pd.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.bytes = {0}", pd.bytes);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.logicalst = {0}", pd.logicalst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogst = {0}", pd.errlogst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogsz = {0}", pd.errlogsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgst = {0}", pd.mfgst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgsz = {0}", pd.mfgsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectst = {0}", pd.defectst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectsz = {0}", pd.defectsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relno = {0}", pd.relno);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relst = {0}", pd.relst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relsz = {0}", pd.relsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relnext = {0}", pd.relnext);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcstrt = {0}", pdold.allcstrt);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcend = {0}", pdold.allcend);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_ptr = {0}", pd.vtoc_ptr);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_len = {0}", pd.vtoc_len);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_pad = {0}", pd.vtoc_pad);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_ptr = {0}", pd.alt_ptr);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_len = {0}", pd.alt_len);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pcyls = {0}", pd.pcyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.ptracks = {0}", pd.ptracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.psectors = {0}", pd.psectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pbytes = {0}", pd.pbytes);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.secovhd = {0}", pd.secovhd);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.interleave = {0}", pd.interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.skew = {0}", pd.skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[0] = {0}", pd.pad[0]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[1] = {0}", pd.pad[1]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[2] = {0}", pd.pad[2]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[3] = {0}", pd.pad[3]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[4] = {0}", pd.pad[4]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[5] = {0}", pd.pad[5]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[6] = {0}", pd.pad[6]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[7] = {0}", pd.pad[7]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.skew = {0}", pd.skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[0] = {0}", pd.pad[0]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[1] = {0}", pd.pad[1]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[2] = {0}", pd.pad[2]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[3] = {0}", pd.pad[3]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[4] = {0}", pd.pad[4]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[5] = {0}", pd.pad[5]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[6] = {0}", pd.pad[6]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[7] = {0}", pd.pad[7]);
magicFound = false;
bool useOld = false;
var useOld = false;
errno = imagePlugin.ReadSector(pdloc + sectorOffset + 1, out byte[] vtocsector);
if(errno != ErrorNumber.NoError)
@@ -184,7 +185,7 @@ public sealed class VTOC : IPartition
{
vtoc = Marshal.ByteArrayToStructureBigEndian<vtoc>(vtocsector);
for(int i = 0; i < vtoc.v_part.Length; i++)
for(var i = 0; i < vtoc.v_part.Length; i++)
{
vtoc.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtoc.v_part[i].p_tag);
vtoc.v_part[i].p_flag = (pFlag)Swapping.Swap((ushort)vtoc.v_part[i].p_flag);
@@ -212,7 +213,7 @@ public sealed class VTOC : IPartition
{
vtocOld = Marshal.ByteArrayToStructureBigEndian<vtocold>(vtocsector);
for(int i = 0; i < vtocOld.v_part.Length; i++)
for(var i = 0; i < vtocOld.v_part.Length; i++)
{
vtocOld.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtocOld.v_part[i].p_tag);
vtocOld.v_part[i].p_flag = (pFlag)Swapping.Swap((ushort)vtocOld.v_part[i].p_flag);
@@ -265,7 +266,7 @@ public sealed class VTOC : IPartition
{
vtoc = Marshal.ByteArrayToStructureBigEndian<vtoc>(vtocsector);
for(int i = 0; i < vtoc.v_part.Length; i++)
for(var i = 0; i < vtoc.v_part.Length; i++)
{
vtoc.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtoc.v_part[i].p_tag);
vtoc.v_part[i].p_flag = (pFlag)Swapping.Swap((ushort)vtoc.v_part[i].p_flag);
@@ -295,9 +296,9 @@ public sealed class VTOC : IPartition
StringHandlers.CToString(vtocOld.v_volume));
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_sectorsz = {0}", vtocOld.v_sectorsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_nparts = {0}", vtocOld.v_nparts);
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_nparts = {0}", vtocOld.v_nparts);
for(int i = 0; i < V_NUMPAR; i++)
for(var i = 0; i < V_NUMPAR; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_part[{0}].p_tag = {1} ({2})", i,
vtocOld.v_part[i].p_tag, (ushort)vtocOld.v_part[i].p_tag);
@@ -325,10 +326,10 @@ public sealed class VTOC : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_volume = \"{0}\"",
StringHandlers.CToString(vtoc.v_volume));
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_pad = {0}", vtoc.v_pad);
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_pad = {0}", vtoc.v_pad);
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_nparts = {0}", vtoc.v_nparts);
for(int i = 0; i < V_NUMPAR; i++)
for(var i = 0; i < V_NUMPAR; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_part[{0}].p_tag = {1} ({2})", i, vtoc.v_part[i].p_tag,
(ushort)vtoc.v_part[i].p_tag);
@@ -364,7 +365,8 @@ public sealed class VTOC : IPartition
// Check for a partition describing the VTOC whose start is the same as the start we know.
// This means partition starts are absolute, not relative, to the VTOC position
for(int i = 0; i < V_NUMPAR; i++)
for(var i = 0; i < V_NUMPAR; i++)
{
if(parts[i].p_tag == pTag.V_BACKUP &&
(ulong)parts[i].p_start == sectorOffset)
{
@@ -372,8 +374,10 @@ public sealed class VTOC : IPartition
break;
}
}
for(int i = 0; i < V_NUMPAR; i++)
for(var i = 0; i < V_NUMPAR; i++)
{
if(parts[i].p_tag != pTag.V_UNUSED)
{
var part = new Partition
@@ -387,7 +391,7 @@ public sealed class VTOC : IPartition
Scheme = Name
};
string info = "";
var info = "";
// Apparently old ones are absolute :?
if(!useOld &&
@@ -420,30 +424,59 @@ public sealed class VTOC : IPartition
if(part.End < imagePlugin.Info.Sectors)
partitions.Add(part);
}
}
return partitions.Count > 0;
}
#endregion
static string DecodeUnixtag(pTag type, bool isNew) => type switch
{
pTag.V_UNUSED => Localization.Unused,
pTag.V_BOOT => Localization.Boot,
pTag.V_ROOT => "/",
pTag.V_SWAP => Localization.swap,
pTag.V_USER => "/usr",
pTag.V_BACKUP => Localization.Whole_disk,
pTag.V_STAND_OLD => isNew
? "Stand"
: Localization.Alternate_sector_space,
pTag.V_VAR_OLD => isNew ? "/var" : Localization.non_UNIX,
pTag.V_HOME_OLD => isNew
? "/home"
: Localization.Alternate_track_space,
pTag.V_ALTSCTR_OLD => isNew
? Localization.Alternate_sector_track
: "Stand",
pTag.V_CACHE => isNew ? Localization.Cache : "/var",
pTag.V_RESERVED =>
isNew ? Localization.Reserved : "/home",
pTag.V_DUMP => Localization.dump,
pTag.V_ALTSCTR => Localization.Alternate_sector_track,
pTag.V_VMPUBLIC => Localization.
volume_mgt_public_partition,
pTag.V_VMPRIVATE => Localization.
volume_mgt_private_partition,
_ => string.Format(Localization.Unknown_TAG_0, type)
};
#region Nested type: partition
[StructLayout(LayoutKind.Sequential, Pack = 1)]
// ReSharper disable once InconsistentNaming
struct partition
{
pTag.V_UNUSED => Localization.Unused,
pTag.V_BOOT => Localization.Boot,
pTag.V_ROOT => "/",
pTag.V_SWAP => Localization.swap,
pTag.V_USER => "/usr",
pTag.V_BACKUP => Localization.Whole_disk,
pTag.V_STAND_OLD => isNew ? "Stand" : Localization.Alternate_sector_space,
pTag.V_VAR_OLD => isNew ? "/var" : Localization.non_UNIX,
pTag.V_HOME_OLD => isNew ? "/home" : Localization.Alternate_track_space,
pTag.V_ALTSCTR_OLD => isNew ? Localization.Alternate_sector_track : "Stand",
pTag.V_CACHE => isNew ? Localization.Cache : "/var",
pTag.V_RESERVED => isNew ? Localization.Reserved : "/home",
pTag.V_DUMP => Localization.dump,
pTag.V_ALTSCTR => Localization.Alternate_sector_track,
pTag.V_VMPUBLIC => Localization.volume_mgt_public_partition,
pTag.V_VMPRIVATE => Localization.volume_mgt_private_partition,
_ => string.Format(Localization.Unknown_TAG_0, type)
};
public pTag p_tag; /*ID tag of partition*/
public pFlag p_flag; /*permision flags*/
public int p_start; /*start sector no of partition*/
public int p_size; /*# of blocks in partition*/
}
#endregion
#region Nested type: PDInfo
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -489,6 +522,10 @@ public sealed class VTOC : IPartition
public readonly uint[] pad; /*space for more stuff*/
}
#endregion
#region Nested type: PDInfoOld
[StructLayout(LayoutKind.Sequential, Pack = 1)]
// ReSharper disable once InconsistentNaming
@@ -518,56 +555,26 @@ public sealed class VTOC : IPartition
public readonly uint allcend; /*end of allocatable disk*/
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
#endregion
// ReSharper disable once InconsistentNaming
struct vtocold
#region Nested type: pFlag
[Flags]
[SuppressMessage("ReSharper", "InconsistentNaming")]
enum pFlag : ushort
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly uint[] v_bootinfo; /*info needed by mboot*/
public readonly uint v_sanity; /*to verify vtoc sanity*/
public readonly uint v_version; /*layout version*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] v_volume; /*volume name*/
public readonly ushort v_sectorsz; /*sector size in bytes*/
public readonly ushort v_nparts; /*number of partitions*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved; /*free space*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly partition[] v_part; /*partition headers*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly int[] timestamp; /* SCSI time stamp */
/* Partition permission flags */
V_UNMNT = 0x01, /* Unmountable partition */
V_RONLY = 0x10, /* Read only */
V_REMAP = 0x20, /* do alternate sector mapping */
V_OPEN = 0x100, /* Partition open (for driver use) */
V_VALID = 0x200, /* Partition is valid to use */
V_VOMASK = 0x300 /* mask for open and valid */
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
#endregion
// ReSharper disable once InconsistentNaming
struct vtoc
{
public readonly uint v_sanity; /*to verify vtoc sanity*/
public readonly uint v_version; /*layout version*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] v_volume; /*volume name*/
public readonly ushort v_nparts; /*number of partitions*/
public readonly ushort v_pad; /*pad for 286 compiler*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved; /*free space*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly partition[] v_part; /*partition headers*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly int[] timestamp; /* SCSI time stamp */
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
// ReSharper disable once InconsistentNaming
struct partition
{
public pTag p_tag; /*ID tag of partition*/
public pFlag p_flag; /*permision flags*/
public int p_start; /*start sector no of partition*/
public int p_size; /*# of blocks in partition*/
}
#region Nested type: pTag
[SuppressMessage("ReSharper", "InconsistentNaming")]
enum pTag : ushort
@@ -618,11 +625,53 @@ public sealed class VTOC : IPartition
V_VMPRIVATE = 0x000F
}
[Flags, SuppressMessage("ReSharper", "InconsistentNaming")]
enum pFlag : ushort
#endregion
#region Nested type: vtoc
[StructLayout(LayoutKind.Sequential, Pack = 1)]
// ReSharper disable once InconsistentNaming
struct vtoc
{
/* Partition permission flags */ V_UNMNT = 0x01, /* Unmountable partition */ V_RONLY = 0x10, /* Read only */
V_REMAP = 0x20, /* do alternate sector mapping */ V_OPEN = 0x100, /* Partition open (for driver use) */
V_VALID = 0x200, /* Partition is valid to use */ V_VOMASK = 0x300 /* mask for open and valid */
public readonly uint v_sanity; /*to verify vtoc sanity*/
public readonly uint v_version; /*layout version*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] v_volume; /*volume name*/
public readonly ushort v_nparts; /*number of partitions*/
public readonly ushort v_pad; /*pad for 286 compiler*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved; /*free space*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly partition[] v_part; /*partition headers*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly int[] timestamp; /* SCSI time stamp */
}
#endregion
#region Nested type: vtocold
[StructLayout(LayoutKind.Sequential, Pack = 1)]
// ReSharper disable once InconsistentNaming
struct vtocold
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly uint[] v_bootinfo; /*info needed by mboot*/
public readonly uint v_sanity; /*to verify vtoc sanity*/
public readonly uint v_version; /*layout version*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] v_volume; /*volume name*/
public readonly ushort v_sectorsz; /*sector size in bytes*/
public readonly ushort v_nparts; /*number of partitions*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public readonly uint[] v_reserved; /*free space*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly partition[] v_part; /*partition headers*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
public readonly int[] timestamp; /* SCSI time stamp */
}
#endregion
}

View File

@@ -53,10 +53,14 @@ public sealed class XENIX : IPartition
const uint XENIX_OFFSET = 977;
const string MODULE_NAME = "XENIX partitions plugin";
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.XENIX_Name;
/// <inheritdoc />
public Guid Id => new("53BE01DE-E68B-469F-A17F-EC2E4BD61CD9");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -81,9 +85,9 @@ public sealed class XENIX : IPartition
if(xnxtbl.p_magic != PAMAGIC)
return false;
for(int i = 0; i < MAXPARTS; i++)
for(var i = 0; i < MAXPARTS; i++)
{
AaruConsole.DebugWriteLine(MODULE_NAME, "xnxtbl.p[{0}].p_off = {1}", i, xnxtbl.p[i].p_off);
AaruConsole.DebugWriteLine(MODULE_NAME, "xnxtbl.p[{0}].p_off = {1}", i, xnxtbl.p[i].p_off);
AaruConsole.DebugWriteLine(MODULE_NAME, "xnxtbl.p[{0}].p_size = {1}", i, xnxtbl.p[i].p_size);
if(xnxtbl.p[i].p_size <= 0)
@@ -91,11 +95,11 @@ public sealed class XENIX : IPartition
var part = new CommonTypes.Partition
{
Start = ((ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) / imagePlugin.Info.SectorSize) +
Start = (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) / imagePlugin.Info.SectorSize +
sectorOffset,
Length = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE) / imagePlugin.Info.SectorSize,
Offset = (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) +
(imagePlugin.Info.SectorSize * sectorOffset),
imagePlugin.Info.SectorSize * sectorOffset,
Size = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE),
Sequence = (ulong)i,
Type = "XENIX",
@@ -109,6 +113,10 @@ public sealed class XENIX : IPartition
return partitions.Count > 0;
}
#endregion
#region Nested type: Partable
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partable
{
@@ -117,10 +125,16 @@ public sealed class XENIX : IPartition
public readonly Partition[] p; /*partition headers*/
}
#endregion
#region Nested type: Partition
[StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partition
{
public readonly int p_off; /*start 1K block no of partition*/
public readonly int p_size; /*# of 1K blocks in partition*/
}
#endregion
}

View File

@@ -64,10 +64,14 @@ public sealed class Xbox : IPartition
const long XBOX360_COMPAT_LEN = 0x10000000;
const uint XBOX360_DEVKIT_MAGIC = 0x00020000;
#region IPartition Members
/// <inheritdoc />
public string Name => Localization.Xbox_Name;
/// <inheritdoc />
public Guid Id => new("E3F6FB91-D358-4F22-A550-81E92D50EB78");
/// <inheritdoc />
public string Author => Authors.NataliaPortillo;
@@ -146,8 +150,8 @@ public sealed class Xbox : IPartition
var dataPart = new Partition
{
Description = Localization.Data_volume,
Size = (imagePlugin.Info.Sectors * imagePlugin.Info.SectorSize) - MEMORY_UNIT_DATA_OFF,
Length = imagePlugin.Info.Sectors - sysCachePart.Length,
Size = imagePlugin.Info.Sectors * imagePlugin.Info.SectorSize - MEMORY_UNIT_DATA_OFF,
Length = imagePlugin.Info.Sectors - sysCachePart.Length,
Sequence = 2,
Offset = MEMORY_UNIT_DATA_OFF,
Start = sysCachePart.Length,
@@ -266,6 +270,10 @@ public sealed class Xbox : IPartition
}
}
#endregion
#region Nested type: Xbox360DevKitPartitionTable
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Xbox360DevKitPartitionTable
{
@@ -276,4 +284,6 @@ public sealed class Xbox : IPartition
public readonly uint dashboardOff;
public readonly uint dashboardLen;
}
#endregion
}