[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> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<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"/> <PackageReference Include="Unclassified.NetRevisionTask" Version="0.4.3" PrivateAssets="all"/>
</ItemGroup> </ItemGroup>
<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" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xml:space="preserve"> xml:space="preserve">
<s:Boolean <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; const uint TYPE_MASK = 15;
readonly byte[] _linuxIcsMagic = "LinuxPart"u8.ToArray(); readonly byte[] _linuxIcsMagic = "LinuxPart"u8.ToArray();
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.Acorn_Name; public string Name => Localization.Acorn_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("A7C8FEBE-8D00-4933-B9F3-42184C8BA808"); public Guid Id => new("A7C8FEBE-8D00-4933-B9F3-42184C8BA808");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -77,8 +81,10 @@ public sealed class Acorn : IPartition
return partitions.Count != 0; return partitions.Count != 0;
} }
#endregion
static void GetFileCorePartitions(IMediaImage imagePlugin, List<Partition> partitions, ulong sectorOffset, 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. // RISC OS always checks for the partition on 0. Afaik no emulator chains it.
if(sectorOffset != 0) if(sectorOffset != 0)
@@ -99,12 +105,12 @@ public sealed class Acorn : IPartition
AcornBootBlock bootBlock = Marshal.ByteArrayToStructureLittleEndian<AcornBootBlock>(sector); 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]; 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 secCyl = bootBlock.discRecord.spt * heads;
int mapSector = bootBlock.startCylinder * secCyl; int mapSector = bootBlock.startCylinder * secCyl;
@@ -120,8 +126,8 @@ public sealed class Acorn : IPartition
{ {
var part = new Partition var part = new Partition
{ {
Size = ((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) / Length = ((ulong)bootBlock.discRecord.disc_size_high * 0x100000000 + bootBlock.discRecord.disc_size) /
imagePlugin.Info.SectorSize, imagePlugin.Info.SectorSize,
Type = Localization.Filecore, Type = Localization.Filecore,
Name = StringHandlers.CToString(bootBlock.discRecord.disc_name, Encoding.GetEncoding("iso-8859-1")) Name = StringHandlers.CToString(bootBlock.discRecord.disc_name, Encoding.GetEncoding("iso-8859-1"))
@@ -150,11 +156,11 @@ public sealed class Acorn : IPartition
Sequence = counter, Sequence = counter,
Scheme = "Filecore/Linux", Scheme = "Filecore/Linux",
Type = entry.magic switch Type = entry.magic switch
{ {
LINUX_MAGIC => Localization.Linux, LINUX_MAGIC => Localization.Linux,
SWAP_MAGIC => Localization.Linux_swap, SWAP_MAGIC => Localization.Linux_swap,
_ => Localization.Unknown_partition_type _ => Localization.Unknown_partition_type
} }
}; };
part.Offset = part.Start * (ulong)sector.Length; part.Offset = part.Start * (ulong)sector.Length;
@@ -175,6 +181,7 @@ public sealed class Acorn : IPartition
RiscIxTable table = Marshal.ByteArrayToStructureLittleEndian<RiscIxTable>(map); RiscIxTable table = Marshal.ByteArrayToStructureLittleEndian<RiscIxTable>(map);
if(table.magic == RISCIX_MAGIC) if(table.magic == RISCIX_MAGIC)
{
foreach(RiscIxEntry entry in table.partitions) foreach(RiscIxEntry entry in table.partitions)
{ {
var part = new Partition var part = new Partition
@@ -196,6 +203,7 @@ public sealed class Acorn : IPartition
partitions.Add(part); partitions.Add(part);
counter++; counter++;
} }
}
break; break;
} }
@@ -216,10 +224,10 @@ public sealed class Acorn : IPartition
uint icsSum = 0x50617274; uint icsSum = 0x50617274;
for(int i = 0; i < 508; i++) for(var i = 0; i < 508; i++)
icsSum += sector[i]; icsSum += sector[i];
uint discCheck = BitConverter.ToUInt32(sector, 508); var discCheck = BitConverter.ToUInt32(sector, 508);
if(icsSum != discCheck) if(icsSum != discCheck)
return; 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)] [StructLayout(LayoutKind.Sequential)]
struct DiscRecord struct DiscRecord
{ {
@@ -310,17 +335,44 @@ public sealed class Acorn : IPartition
public readonly byte[] reserved; public readonly byte[] reserved;
} }
#endregion
#region Nested type: IcsEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AcornBootBlock struct IcsEntry
{ {
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x1C0)] public readonly uint start;
public readonly byte[] spare; public readonly int size;
public readonly DiscRecord discRecord;
public readonly byte flags;
public readonly ushort startCylinder;
public readonly byte checksum;
} }
#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)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct LinuxTable struct LinuxTable
{ {
@@ -330,22 +382,9 @@ public sealed class Acorn : IPartition
public readonly byte[] padding; public readonly byte[] padding;
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #endregion
struct LinuxEntry
{
public readonly uint magic;
public readonly uint start;
public readonly uint size;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] #region Nested type: RiscIxEntry
struct RiscIxTable
{
public readonly uint magic;
public readonly uint date;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly RiscIxEntry[] partitions;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct RiscIxEntry struct RiscIxEntry
@@ -357,17 +396,18 @@ public sealed class Acorn : IPartition
public readonly byte[] name; public readonly byte[] name;
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #endregion
struct IcsTable
{ #region Nested type: RiscIxTable
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly IcsEntry[] entries;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct IcsEntry struct RiscIxTable
{ {
public readonly uint start; public readonly uint magic;
public readonly int size; 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 uint HFS_MAGIC_OLD = 0x54465331;
const string MODULE_NAME = "Apple Partition Map (APM) Plugin"; const string MODULE_NAME = "Apple Partition Map (APM) Plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.AppleMap_Name; public string Name => Localization.AppleMap_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("36405F8D-4F1A-07F5-209C-223D735D6D22"); public Guid Id => new("36405F8D-4F1A-07F5-209C-223D735D6D22");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -89,37 +93,39 @@ public sealed class AppleMap : IPartition
{ {
case 256: case 256:
{ {
byte[] tmp = new byte[512]; var tmp = new byte[512];
Array.Copy(ddmSector, 0, tmp, 0, 256); Array.Copy(ddmSector, 0, tmp, 0, 256);
ddmSector = tmp; ddmSector = tmp;
maxDrivers = 29; maxDrivers = 29;
break; break;
} }
case < 256: return false; case < 256:
return false;
} }
AppleDriverDescriptorMap ddm = Marshal.ByteArrayToStructureBigEndian<AppleDriverDescriptorMap>(ddmSector); 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.sbBlockSize = {0}", ddm.sbBlockSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlocks = {0}", ddm.sbBlocks); AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlocks = {0}", ddm.sbBlocks);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevType = {0}", ddm.sbDevType); AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevType = {0}", ddm.sbDevType);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevId = {0}", ddm.sbDevId); 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.sbData = 0x{0:X8}", ddm.sbData);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDrvrCount = {0}", ddm.sbDrvrCount); AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDrvrCount = {0}", ddm.sbDrvrCount);
uint sequence = 0; uint sequence = 0;
if(ddm.sbSig == DDM_MAGIC) if(ddm.sbSig == DDM_MAGIC)
{
if(ddm.sbDrvrCount < maxDrivers) if(ddm.sbDrvrCount < maxDrivers)
{ {
ddm.sbMap = new AppleDriverEntry[ddm.sbDrvrCount]; 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]; var tmp = new byte[8];
Array.Copy(ddmSector, 18 + (i * 8), tmp, 0, 8); Array.Copy(ddmSector, 18 + i * 8, tmp, 0, 8);
ddm.sbMap[i] = Marshal.ByteArrayToStructureBigEndian<AppleDriverEntry>(tmp); ddm.sbMap[i] = Marshal.ByteArrayToStructureBigEndian<AppleDriverEntry>(tmp);
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbMap[{1}].ddBlock = {0}", ddm.sbMap[i].ddBlock, AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbMap[{1}].ddBlock = {0}", ddm.sbMap[i].ddBlock,
@@ -152,6 +158,7 @@ public sealed class AppleMap : IPartition
sequence++; sequence++;
} }
} }
}
errno = imagePlugin.ReadSector(1 + sectorOffset, out byte[] partSector); 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 // This is the easy one, no sector size mixing
if(oldMap.pdSig == APM_MAGIC_OLD) 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); Array.Copy(partSector, i, tmp, 0, 12);
AppleMapOldPartitionEntry oldEntry = AppleMapOldPartitionEntry oldEntry =
@@ -217,7 +224,7 @@ public sealed class AppleMap : IPartition
// If sector is bigger than 512 // If sector is bigger than 512
if(ddmSector.Length > 512) if(ddmSector.Length > 512)
{ {
byte[] tmp = new byte[512]; var tmp = new byte[512];
Array.Copy(ddmSector, 512, tmp, 0, 512); Array.Copy(ddmSector, 512, tmp, 0, 512);
entry = Marshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp); entry = Marshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp);
@@ -228,7 +235,7 @@ public sealed class AppleMap : IPartition
entrySize = 512; entrySize = 512;
entryCount = entry.entries; entryCount = entry.entries;
skipDdm = 512; skipDdm = 512;
sectorsToRead = ((entryCount + 1) * 512 / sectorSize) + 1; sectorsToRead = (entryCount + 1) * 512 / sectorSize + 1;
} }
else else
{ {
@@ -267,18 +274,18 @@ public sealed class AppleMap : IPartition
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
return false; return false;
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_size = {0}", entrySize); AaruConsole.DebugWriteLine(MODULE_NAME, "entry_size = {0}", entrySize);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_count = {0}", entryCount); AaruConsole.DebugWriteLine(MODULE_NAME, "entry_count = {0}", entryCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "skip_ddm = {0}", skipDdm); AaruConsole.DebugWriteLine(MODULE_NAME, "skip_ddm = {0}", skipDdm);
AaruConsole.DebugWriteLine(MODULE_NAME, "sectors_to_read = {0}", sectorsToRead); 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); Array.Copy(entries, skipDdm, copy, 0, copy.Length);
entries = copy; 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); Array.Copy(entries, i * entrySize, tmp, 0, entrySize);
entry = Marshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp); 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}].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}].reserved1 = 0x{1:X4}", i, entry.reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].entries = {1}", i, entry.entries); 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}].start = {1}", i, entry.start);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].sectors = {1}", i, entry.sectors); AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].sectors = {1}", i, entry.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].name = \"{1}\"", i, AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].name = \"{1}\"", i,
StringHandlers.CToString(entry.name)); StringHandlers.CToString(entry.name));
@@ -301,7 +308,7 @@ public sealed class AppleMap : IPartition
entry.first_data_block); entry.first_data_block);
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].data_sectors = {1}", i, entry.data_sectors); 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, AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].first_boot_block = {1}", i,
entry.first_boot_block); entry.first_boot_block);
@@ -338,8 +345,8 @@ public sealed class AppleMap : IPartition
Name = StringHandlers.CToString(entry.name), Name = StringHandlers.CToString(entry.name),
Offset = entry.start * entrySize, Offset = entry.start * entrySize,
Size = entry.sectors * entrySize, Size = entry.sectors * entrySize,
Start = (entry.start * entrySize / sectorSize) + sectorOffset, Start = entry.start * entrySize / sectorSize + sectorOffset,
Length = entry.sectors * entrySize / sectorSize, Length = entry.sectors * entrySize / sectorSize,
Scheme = Name Scheme = Name
}; };
@@ -398,14 +405,20 @@ public sealed class AppleMap : IPartition
sequence++; sequence++;
} }
else else
{
AaruConsole.DebugWriteLine(MODULE_NAME, AaruConsole.DebugWriteLine(MODULE_NAME,
Localization.Not_adding_partition_because_start_0_is_outside_media_size_1, Localization.Not_adding_partition_because_start_0_is_outside_media_size_1,
partition.Start, imagePlugin.Info.Sectors - 1); partition.Start, imagePlugin.Info.Sectors - 1);
}
} }
return partitions.Count > 0; return partitions.Count > 0;
} }
#endregion
#region Nested type: AppleDriverDescriptorMap
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleDriverDescriptorMap struct AppleDriverDescriptorMap
{ {
@@ -428,6 +441,10 @@ public sealed class AppleMap : IPartition
public AppleDriverEntry[] sbMap; public AppleDriverEntry[] sbMap;
} }
#endregion
#region Nested type: AppleDriverEntry
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleDriverEntry struct AppleDriverEntry
{ {
@@ -439,26 +456,9 @@ public sealed class AppleMap : IPartition
public readonly ushort ddType; public readonly ushort ddType;
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #endregion
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;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] #region Nested type: AppleMapFlags
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;
}
[Flags] [Flags]
enum AppleMapFlags : uint enum AppleMapFlags : uint
@@ -489,6 +489,25 @@ public sealed class AppleMap : IPartition
Reserved = 0xBFFFFC00 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)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct AppleMapPartitionEntry struct AppleMapPartitionEntry
{ {
@@ -535,4 +554,20 @@ public sealed class AppleMap : IPartition
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public readonly uint[] boot_arguments; 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> /// <summary>Implements decoding of Apricot partitions</summary>
public sealed class Apricot : IPartition public sealed class Apricot : IPartition
{ {
const string MODULE_NAME = "Apricot partitions plugin"; const string MODULE_NAME = "Apricot partitions plugin";
readonly int[] _baudRates = readonly int[] _baudRates = { 50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200 };
{
50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200
};
readonly string[] _bootTypeCodes = readonly string[] _bootTypeCodes =
{ {
Localization.Non_bootable, Localization.Apricot_XI_RAM_BIOS, Localization.Generic_ROM_BIOS, 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" Localization.MF1DD_70_track, "MF1DD", "MF2DD", "Winchester 5M", "Winchester 10M", "Winchester 20M"
}; };
readonly int[] _lineModes = readonly int[] _lineModes = { 256, 200 };
{ readonly int[] _lineWidths = { 80, 40 };
256, 200
};
readonly int[] _lineWidths =
{
80, 40
};
readonly string[] _operatingSystemCodes = readonly string[] _operatingSystemCodes =
{ {
Localization.Invalid_operating_system, "MS-DOS", "UCSD Pascal", Localization.CPM, "Concurrent CP/M" 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.None_parity, Localization.Odd_parity, Localization.Even_parity, Localization.Mark_parity,
Localization.Space_parity Localization.Space_parity
}; };
readonly string[] _printDevices = readonly string[] _printDevices = { Localization.Parallel_print_device, Localization.Serial_print_device };
{ readonly double[] _stopBits = { 1, 1.5, 2 };
Localization.Parallel_print_device, Localization.Serial_print_device
}; #region IPartition Members
readonly double[] _stopBits =
{
1, 1.5, 2
};
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.Apricot_Name; public string Name => Localization.Apricot_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("8CBF5864-7B5A-47A0-8CEB-199C74FA22DE"); public Guid Id => new("8CBF5864-7B5A-47A0-8CEB-199C74FA22DE");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -130,31 +119,32 @@ public sealed class Apricot : IPartition
: Localization.Unknown_operating_system); : Localization.Unknown_operating_system);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.writeProtected = {0}", label.writeProtected); 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, 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); : Localization.Unknown_boot_type);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitionCount = {0}", label.partitionCount); AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitionCount = {0}", label.partitionCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.winchester = {0}", label.winchester); AaruConsole.DebugWriteLine(MODULE_NAME, "label.winchester = {0}", label.winchester);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.sectorSize = {0}", label.sectorSize); AaruConsole.DebugWriteLine(MODULE_NAME, "label.sectorSize = {0}", label.sectorSize);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spt = {0}", label.spt); AaruConsole.DebugWriteLine(MODULE_NAME, "label.spt = {0}", label.spt);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.cylinders = {0}", label.cylinders); AaruConsole.DebugWriteLine(MODULE_NAME, "label.cylinders = {0}", label.cylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.heads = {0}", label.heads); AaruConsole.DebugWriteLine(MODULE_NAME, "label.heads = {0}", label.heads);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.interleave = {0}", label.interleave); AaruConsole.DebugWriteLine(MODULE_NAME, "label.interleave = {0}", label.interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.skew = {0}", label.skew); AaruConsole.DebugWriteLine(MODULE_NAME, "label.skew = {0}", label.skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootLocation = {0}", label.bootLocation); AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootLocation = {0}", label.bootLocation);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootSize = {0}", label.bootSize); 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.bootAddress = 0x{0:X8}", label.bootAddress);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootOffset:label.bootSegment = {0:X4}:{1:X4}", AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootOffset:label.bootSegment = {0:X4}:{1:X4}",
label.bootOffset, label.bootSegment); label.bootOffset, label.bootSegment);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.firstDataBlock = {0}", label.firstDataBlock); AaruConsole.DebugWriteLine(MODULE_NAME, "label.firstDataBlock = {0}", label.firstDataBlock);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.generation = {0}", label.generation); AaruConsole.DebugWriteLine(MODULE_NAME, "label.generation = {0}", label.generation);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyCount = {0}", label.copyCount); AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyCount = {0}", label.copyCount);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.maxCopies = {0}", label.maxCopies); AaruConsole.DebugWriteLine(MODULE_NAME, "label.maxCopies = {0}", label.maxCopies);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.serialNumber = \"{0}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "label.serialNumber = \"{0}\"",
StringHandlers.CToString(label.serialNumber)); StringHandlers.CToString(label.serialNumber));
@@ -165,18 +155,19 @@ public sealed class Apricot : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyright = \"{0}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyright = \"{0}\"",
StringHandlers.CToString(label.copyright)); StringHandlers.CToString(label.copyright));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.bps = {0}", label.mainBPB.bps); 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.spc = {0}", label.mainBPB.spc);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.rsectors = {0}", label.mainBPB.rsectors); 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.root_ent = {0}", label.mainBPB.root_ent);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.sectors = {0}", label.mainBPB.sectors); 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.media = {0}", label.mainBPB.media);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spfat = {0}", label.mainBPB.spfat); AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spfat = {0}", label.mainBPB.spfat);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.diskType = {0} ({1})", label.mainBPB.diskType, AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.diskType = {0} ({1})", label.mainBPB.diskType,
label.mainBPB.diskType < _diskTypeCodes.Length 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); 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.biosMajorVersion = {0}", label.biosMajorVersion);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosMinorVersion = {0}", label.biosMinorVersion); 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, 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); : Localization.Unknown_print_device);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bellVolume = {0}", label.bellVolume); AaruConsole.DebugWriteLine(MODULE_NAME, "label.bellVolume = {0}", label.bellVolume);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableCache = {0}", label.enableCache); AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableCache = {0}", label.enableCache);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableGraphics = {0}", label.enableGraphics); AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableGraphics = {0}", label.enableGraphics);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosLength = {0}", label.dosLength); AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosLength = {0}", label.dosLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontLength = {0}", label.fontLength); AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontLength = {0}", label.fontLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardLength = {0}", label.keyboardLength); AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardLength = {0}", label.keyboardLength);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosStart = {0}", label.dosStart); AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosStart = {0}", label.dosStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontStart = {0}", label.fontStart); AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontStart = {0}", label.fontStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardStart = {0}", label.keyboardStart); AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardStart = {0}", label.keyboardStart);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardVolume = {0}", label.keyboardVolume); AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardVolume = {0}", label.keyboardVolume);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeat = {0}", label.autorepeat); AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeat = {0}", label.autorepeat);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeatLeadIn = {0}", label.autorepeatLeadIn); AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeatLeadIn = {0}", label.autorepeatLeadIn);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeatInterval = {0}", label.autorepeatInterval); 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.parityCheck = {0}", label.parityCheck);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parityType = {0} ({1})", label.parityType, 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); : Localization.Unknown_parity_type);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.txXonXoff = {0}", label.txXonXoff); AaruConsole.DebugWriteLine(MODULE_NAME, "label.txXonXoff = {0}", label.txXonXoff);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoff = {0}", label.rxXonXoff); AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoff = {0}", label.rxXonXoff);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xonCharacter = {0}", label.xonCharacter); AaruConsole.DebugWriteLine(MODULE_NAME, "label.xonCharacter = {0}", label.xonCharacter);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xoffCharacter = {0}", label.xoffCharacter); AaruConsole.DebugWriteLine(MODULE_NAME, "label.xoffCharacter = {0}", label.xoffCharacter);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoffBuffer = {0}", label.rxXonXoffBuffer); AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoffBuffer = {0}", label.rxXonXoffBuffer);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dtrDsr = {0}", label.dtrDsr); AaruConsole.DebugWriteLine(MODULE_NAME, "label.dtrDsr = {0}", label.dtrDsr);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.ctsRts = {0}", label.ctsRts); AaruConsole.DebugWriteLine(MODULE_NAME, "label.ctsRts = {0}", label.ctsRts);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterCr = {0}", label.nullsAfterCr); AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterCr = {0}", label.nullsAfterCr);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterFF = {0}", label.nullsAfterFF); AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterFF = {0}", label.nullsAfterFF);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCRSerial = {0}", label.lfAfterCRSerial); AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCRSerial = {0}", label.lfAfterCRSerial);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportSerial = {0}", AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportSerial = {0}",
@@ -261,9 +254,9 @@ public sealed class Apricot : IPartition
ArrayHelpers.ArrayIsNullOrEmpty(label.spareSerial)); ArrayHelpers.ArrayIsNullOrEmpty(label.spareSerial));
AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCrParallel = {0}", label.lfAfterCrParallel); AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCrParallel = {0}", label.lfAfterCrParallel);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.selectLine = {0}", label.selectLine); AaruConsole.DebugWriteLine(MODULE_NAME, "label.selectLine = {0}", label.selectLine);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.paperEmpty = {0}", label.paperEmpty); AaruConsole.DebugWriteLine(MODULE_NAME, "label.paperEmpty = {0}", label.paperEmpty);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.faultLine = {0}", label.faultLine); AaruConsole.DebugWriteLine(MODULE_NAME, "label.faultLine = {0}", label.faultLine);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportParallel = {0}", AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportParallel = {0}",
label.biosErrorReportParallel); label.biosErrorReportParallel);
@@ -274,16 +267,16 @@ public sealed class Apricot : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareWinchester is null? = {0}", AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareWinchester is null? = {0}",
ArrayHelpers.ArrayIsNullOrEmpty(label.spareWinchester)); 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.formatProtection = {0}", label.formatProtection);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareRamDisk is null? = {0}", AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareRamDisk is null? = {0}",
ArrayHelpers.ArrayIsNullOrEmpty(label.spareRamDisk)); 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); 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, AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitions[{1}].bps = {0}", label.partitions[i].bps,
i); i);
@@ -349,6 +342,10 @@ public sealed class Apricot : IPartition
return partitions.Count > 0; return partitions.Count > 0;
} }
#endregion
#region Nested type: Label
/// <summary>Apricot Label.</summary> /// <summary>Apricot Label.</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Label readonly struct Label
@@ -560,6 +557,10 @@ public sealed class Apricot : IPartition
public readonly bool cpmDoubleSided; public readonly bool cpmDoubleSided;
} }
#endregion
#region Nested type: ParameterBlock
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct ParameterBlock struct ParameterBlock
{ {
@@ -584,4 +585,6 @@ public sealed class Apricot : IPartition
/// <summary>Volume starting sector</summary> /// <summary>Volume starting sector</summary>
public readonly ushort startSector; public readonly ushort startSector;
} }
#endregion
} }

View File

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

View File

@@ -55,20 +55,18 @@ public sealed class BSD : IPartition
const uint MAX_LABEL_SIZE = 500; const uint MAX_LABEL_SIZE = 500;
const string MODULE_NAME = "BSD disklabel plugin"; const string MODULE_NAME = "BSD disklabel plugin";
/// <summary>Known sector locations for BSD disklabel</summary> /// <summary>Known sector locations for BSD disklabel</summary>
readonly ulong[] _labelLocations = readonly ulong[] _labelLocations = { 0, 1, 2, 9 };
{
0, 1, 2, 9
};
/// <summary>Known byte offsets for BSD disklabel</summary> /// <summary>Known byte offsets for BSD disklabel</summary>
readonly uint[] _labelOffsets = readonly uint[] _labelOffsets = { 0, 9, 64, 128, 516 };
{
0, 9, 64, 128, 516 #region IPartition Members
};
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.BSD_Name; public string Name => Localization.BSD_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9"); public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -81,8 +79,8 @@ public sealed class BSD : IPartition
if((MAX_LABEL_SIZE + _labelOffsets.Last()) % imagePlugin.Info.SectorSize > 0) if((MAX_LABEL_SIZE + _labelOffsets.Last()) % imagePlugin.Info.SectorSize > 0)
run++; run++;
var dl = new DiskLabel(); var dl = new DiskLabel();
bool found = false; var found = false;
foreach(ulong location in _labelLocations) foreach(ulong location in _labelLocations)
{ {
@@ -96,7 +94,7 @@ public sealed class BSD : IPartition
foreach(uint offset in _labelOffsets) 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) if(offset + MAX_LABEL_SIZE > tmp.Length)
break; break;
@@ -128,46 +126,46 @@ public sealed class BSD : IPartition
if(dl is { d_magic: DISK_CIGAM, d_magic2: DISK_CIGAM }) if(dl is { d_magic: DISK_CIGAM, d_magic2: DISK_CIGAM })
dl = SwapDiskLabel(dl); dl = SwapDiskLabel(dl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_type = {0}", dl.d_type); 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_subtype = {0}", dl.d_subtype);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_typename = {0}", StringHandlers.CToString(dl.d_typename)); 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_packname = {0}", StringHandlers.CToString(dl.d_packname));
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secsize = {0}", dl.d_secsize); 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_nsectors = {0}", dl.d_nsectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ntracks = {0}", dl.d_ntracks); 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_ncylinders = {0}", dl.d_ncylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secpercyl = {0}", dl.d_secpercyl); 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_secperunit = {0}", dl.d_secperunit);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sparespertrack = {0}", dl.d_sparespertrack); 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_sparespercyl = {0}", dl.d_sparespercyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_acylinders = {0}", dl.d_acylinders); 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_rpm = {0}", dl.d_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_interleave = {0}", dl.d_interleave); 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_trackskew = {0}", dl.d_trackskew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_cylskeew = {0}", dl.d_cylskeew); 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_headswitch = {0}", dl.d_headswitch);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trkseek = {0}", dl.d_trkseek); 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_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[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[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[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[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_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[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[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[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[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_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_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_checksum = 0x{0:X8}", dl.d_checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_npartitions = {0}", dl.d_npartitions); 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_bbsize = {0}", dl.d_bbsize);
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sbsize = {0}", dl.d_sbsize); AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sbsize = {0}", dl.d_sbsize);
ulong counter = 0; 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); 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; return partitions.Count > 0;
} }
#endregion
internal static string FSTypeToString(fsType typ) internal static string FSTypeToString(fsType typ)
{ {
switch(typ) switch(typ)
{ {
case fsType.Unused: return Localization.Unused_entry; case fsType.Unused:
case fsType.Swap: return Localization.Swap_partition; return Localization.Unused_entry;
case fsType.V6: return Localization.UNIX_6th_Edition; case fsType.Swap:
case fsType.V7: return Localization.UNIX_7th_Edition; return Localization.Swap_partition;
case fsType.SystemV: return Localization.UNIX_System_V; case fsType.V6:
case fsType.V7_1K: return Localization.UNIX_7th_Edition_with_1K_blocks; return Localization.UNIX_6th_Edition;
case fsType.V8: return Localization.UNIX_8th_Edition_with_4K_blocks; case fsType.V7:
case fsType.BSDFFS: return Localization._4_2_BSD_Fast_File_System; return Localization.UNIX_7th_Edition;
case fsType.BSDLFS: return Localization._4_4_LFS; case fsType.SystemV:
case fsType.HPFS: return Localization.HPFS; return Localization.UNIX_System_V;
case fsType.ISO9660: return Localization.ISO9660; 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.Boot:
case fsType.SysVBoot: return Localization.Boot; case fsType.SysVBoot:
case fsType.AFFS: return Localization.Amiga_FFS; return Localization.Boot;
case fsType.HFS: return Localization.Apple_HFS; case fsType.AFFS:
case fsType.ADVfs: return Localization.Digital_Advanced_File_System; return Localization.Amiga_FFS;
case fsType.LSMpublic: return Localization.Digital_LSM_Public_Region; case fsType.HFS:
case fsType.LSMprivate: return Localization.Digital_LSM_Private_Region; return Localization.Apple_HFS;
case fsType.LSMsimple: return Localization.Digital_LSM_Simple_Disk; case fsType.ADVfs:
case fsType.CCD: return Localization.Concatenated_disk; return Localization.Digital_Advanced_File_System;
case fsType.JFS2: return Localization.IBM_JFS2; case fsType.LSMpublic:
case fsType.HAMMER: return Localization.Hammer; return Localization.Digital_LSM_Public_Region;
case fsType.HAMMER2: return Localization.Hammer2; case fsType.LSMprivate:
case fsType.UDF: return Localization.UDF; return Localization.Digital_LSM_Private_Region;
case fsType.EFS: return Localization.EFS; case fsType.LSMsimple:
case fsType.ZFS: return Localization.ZFS; return Localization.Digital_LSM_Simple_Disk;
case fsType.NANDFS: return Localization.FreeBSD_nandfs; case fsType.CCD:
case fsType.MSDOS: return Localization.FAT; return Localization.Concatenated_disk;
case fsType.Other: return Localization.Other_or_unknown; case fsType.JFS2:
default: return Localization.Unknown_partition_type; 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); 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]); 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]); 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]); dl.d_partitions[i] = (BSDPartition)Marshal.SwapStructureMembersEndian(dl.d_partitions[i]);
return dl; 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> /// <summary>Drive type</summary>
[SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "InconsistentNaming")]
enum dType : ushort enum dType : ushort
@@ -313,6 +466,10 @@ public sealed class BSD : IPartition
MD = 22 MD = 22
} }
#endregion
#region Nested type: fsType
/// <summary>Filesystem type</summary> /// <summary>Filesystem type</summary>
[SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "InconsistentNaming")]
internal enum fsType : byte internal enum fsType : byte
@@ -393,112 +550,5 @@ public sealed class BSD : IPartition
NANDFS = 30 NANDFS = 30
} }
/// <summary>Drive flags</summary> #endregion
[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;
}
} }

View File

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

View File

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

View File

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

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 Localization.Xenix_bad_block
}; };
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.MBR_Name; public string Name => Localization.MBR_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("5E8A34E8-4F1A-59E6-4BF7-7EA647063A76"); public Guid Id => new("5E8A34E8-4F1A-59E6-4BF7-7EA647063A76");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -349,7 +353,7 @@ public sealed class MBR : IPartition
DiskManagerMasterBootRecord mbrOntrack = DiskManagerMasterBootRecord mbrOntrack =
Marshal.ByteArrayToStructureLittleEndian<DiskManagerMasterBootRecord>(sector); 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); AaruConsole.DebugWriteLine(MODULE_NAME, "mbr.magic = {0:X4}", mbr.magic);
if(mbr.magic != MBR_MAGIC) if(mbr.magic != MBR_MAGIC)
@@ -360,7 +364,7 @@ public sealed class MBR : IPartition
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
return false; return false;
ulong signature = BitConverter.ToUInt64(hdrBytes, 0); var signature = BitConverter.ToUInt64(hdrBytes, 0);
AaruConsole.DebugWriteLine(MODULE_NAME, "gpt.signature = 0x{0:X16}", signature); AaruConsole.DebugWriteLine(MODULE_NAME, "gpt.signature = 0x{0:X16}", signature);
@@ -392,18 +396,18 @@ public sealed class MBR : IPartition
foreach(PartitionEntry entry in entries) foreach(PartitionEntry entry in entries)
{ {
byte startSector = (byte)(entry.start_sector & 0x3F); var startSector = (byte)(entry.start_sector & 0x3F);
ushort startCylinder = (ushort)(((entry.start_sector & 0xC0) << 2) | entry.start_cylinder); var startCylinder = (ushort)((entry.start_sector & 0xC0) << 2 | entry.start_cylinder);
byte endSector = (byte)(entry.end_sector & 0x3F); var endSector = (byte)(entry.end_sector & 0x3F);
ushort endCylinder = (ushort)(((entry.end_sector & 0xC0) << 2) | entry.end_cylinder); var endCylinder = (ushort)((entry.end_sector & 0xC0) << 2 | entry.end_cylinder);
ulong lbaStart = entry.lba_start; ulong lbaStart = entry.lba_start;
ulong lbaSectors = entry.lba_sectors; ulong lbaSectors = entry.lba_sectors;
// Let's start the fun... // Let's start the fun...
bool valid = true; var valid = true;
bool extended = false; var extended = false;
bool minix = false; var minix = false;
if(entry.status != 0x00 && if(entry.status != 0x00 &&
entry.status != 0x80) entry.status != 0x80)
@@ -449,27 +453,29 @@ public sealed class MBR : IPartition
if(lbaStart + lbaSectors > imagePlugin.Info.Sectors) if(lbaStart + lbaSectors > imagePlugin.Info.Sectors)
lbaSectors = imagePlugin.Info.Sectors - lbaStart; lbaSectors = imagePlugin.Info.Sectors - lbaStart;
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.status {0}", entry.status); AaruConsole.DebugWriteLine(MODULE_NAME, "entry.status {0}", entry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.type {0}", entry.type); 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_start {0}", entry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_sectors {0}", entry.lba_sectors); 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_cylinder {0}", startCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_head {0}", entry.start_head); 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.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_cylinder {0}", endCylinder); 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_head {0}", entry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_sector {0}", endSector); AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_sector {0}", endSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.minix = {0}", minix); 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); AaruConsole.DebugWriteLine(MODULE_NAME, "lba_sectors {0}", lbaSectors);
if(valid && minix) // Let's mix the fun if(valid && minix) // Let's mix the fun
{
if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize, out List<Partition> mnxParts)) if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize, out List<Partition> mnxParts))
partitions.AddRange(mnxParts); partitions.AddRange(mnxParts);
else else
minix = false; minix = false;
}
if(valid && !minix) if(valid && !minix)
{ {
@@ -505,7 +511,7 @@ public sealed class MBR : IPartition
if(!extended) if(!extended)
continue; continue;
bool processingExtended = true; var processingExtended = true;
ulong chainStart = lbaStart; ulong chainStart = lbaStart;
while(processingExtended) while(processingExtended)
@@ -526,25 +532,25 @@ public sealed class MBR : IPartition
foreach(PartitionEntry ebrEntry in ebr.entries) foreach(PartitionEntry ebrEntry in ebr.entries)
{ {
bool extValid = true; var extValid = true;
startSector = (byte)(ebrEntry.start_sector & 0x3F); 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); 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 extStart = ebrEntry.lba_start;
ulong extSectors = ebrEntry.lba_sectors; 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.status {0}", ebrEntry.status);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.type {0}", ebrEntry.type); 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_start {0}", ebrEntry.lba_start);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_sectors {0}", ebrEntry.lba_sectors); 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_cylinder {0}", startCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_head {0}", ebrEntry.start_head); 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.start_sector {0}", startSector);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_cylinder {0}", endCylinder); 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_head {0}", ebrEntry.end_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_sector {0}", endSector); AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_sector {0}", endSector);
// Let's start the fun... // Let's start the fun...
extValid &= ebrEntry.status is 0x00 or 0x80; extValid &= ebrEntry.status is 0x00 or 0x80;
@@ -569,7 +575,7 @@ public sealed class MBR : IPartition
extStart /= divider; extStart /= divider;
extSectors /= 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); 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) 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; extSectors = imagePlugin.Info.Sectors - extStart;
if(extValid && extMinix) // Let's mix the fun if(extValid && extMinix) // Let's mix the fun
{
if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize, if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize,
out List<Partition> mnxParts)) out List<Partition> mnxParts))
partitions.AddRange(mnxParts); partitions.AddRange(mnxParts);
else else
extMinix = false; extMinix = false;
}
if(!extValid || extMinix) if(!extValid || extMinix)
continue; continue;
@@ -632,6 +640,8 @@ public sealed class MBR : IPartition
return partitions.Count != 0; return partitions.Count != 0;
} }
#endregion
static bool GetMinix(IMediaImage imagePlugin, ulong start, ulong divider, ulong sectorOffset, uint sectorSize, static bool GetMinix(IMediaImage imagePlugin, ulong start, ulong divider, ulong sectorOffset, uint sectorSize,
out List<Partition> partitions) out List<Partition> partitions)
{ {
@@ -649,28 +659,28 @@ public sealed class MBR : IPartition
if(mnx.magic != MBR_MAGIC) if(mnx.magic != MBR_MAGIC)
return false; return false;
bool anyMnx = false; var anyMnx = false;
foreach(PartitionEntry mnxEntry in mnx.entries) foreach(PartitionEntry mnxEntry in mnx.entries)
{ {
bool mnxValid = true; var mnxValid = true;
byte startSector = (byte)(mnxEntry.start_sector & 0x3F); var startSector = (byte)(mnxEntry.start_sector & 0x3F);
ushort startCylinder = (ushort)(((mnxEntry.start_sector & 0xC0) << 2) | mnxEntry.start_cylinder); var startCylinder = (ushort)((mnxEntry.start_sector & 0xC0) << 2 | mnxEntry.start_cylinder);
byte endSector = (byte)(mnxEntry.end_sector & 0x3F); var endSector = (byte)(mnxEntry.end_sector & 0x3F);
ushort endCylinder = (ushort)(((mnxEntry.end_sector & 0xC0) << 2) | mnxEntry.end_cylinder); var endCylinder = (ushort)((mnxEntry.end_sector & 0xC0) << 2 | mnxEntry.end_cylinder);
ulong mnxStart = mnxEntry.lba_start; ulong mnxStart = mnxEntry.lba_start;
ulong mnxSectors = mnxEntry.lba_sectors; ulong mnxSectors = mnxEntry.lba_sectors;
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.status {0}", mnxEntry.status); 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.type {0}", mnxEntry.type);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_start {0}", mnxEntry.lba_start); 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.lba_sectors {0}", mnxEntry.lba_sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_cylinder {0}", startCylinder); 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_head {0}", mnxEntry.start_head);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_sector {0}", startSector); 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_cylinder {0}", endCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_head {0}", mnxEntry.end_head); 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.end_sector {0}", endSector);
mnxValid &= mnxEntry.status is 0x00 or 0x80; mnxValid &= mnxEntry.status is 0x00 or 0x80;
mnxValid &= mnxEntry.type is 0x81 or 0x80; mnxValid &= mnxEntry.type is 0x81 or 0x80;
@@ -692,7 +702,7 @@ public sealed class MBR : IPartition
mnxStart /= divider; mnxStart /= divider;
mnxSectors /= 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); AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_sectors {0}", mnxSectors);
if(!mnxValid) if(!mnxValid)
@@ -728,14 +738,20 @@ public sealed class MBR : IPartition
static string DecodeMbrType(byte type) => _mbrTypes[type]; static string DecodeMbrType(byte type) => _mbrTypes[type];
#region Nested type: DiskManagerMasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct MasterBootRecord readonly struct DiskManagerMasterBootRecord
{ {
/// <summary>Boot code</summary> /// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 446)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 252)]
public readonly byte[] boot_code; public readonly byte[] boot_code;
/// <summary>
/// <see cref="MBR.DM_MAGIC" />
/// </summary>
public readonly ushort dm_magic;
/// <summary>Partitions</summary> /// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly PartitionEntry[] entries; public readonly PartitionEntry[] entries;
/// <summary> /// <summary>
/// <see cref="MBR.MBR_MAGIC" /> /// <see cref="MBR.MBR_MAGIC" />
@@ -743,6 +759,10 @@ public sealed class MBR : IPartition
public readonly ushort magic; public readonly ushort magic;
} }
#endregion
#region Nested type: ExtendedBootRecord
// TODO: IBM Boot Manager // TODO: IBM Boot Manager
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct ExtendedBootRecord readonly struct ExtendedBootRecord
@@ -759,25 +779,16 @@ public sealed class MBR : IPartition
public readonly ushort magic; public readonly ushort magic;
} }
#endregion
#region Nested type: MasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct TimedMasterBootRecord readonly struct MasterBootRecord
{ {
/// <summary>Boot code</summary> /// <summary>Boot code</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 218)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 446)]
public readonly byte[] boot_code; 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> /// <summary>Partitions</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly PartitionEntry[] entries; public readonly PartitionEntry[] entries;
@@ -787,24 +798,9 @@ public sealed class MBR : IPartition
public readonly ushort magic; public readonly ushort magic;
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #endregion
readonly struct SerializedMasterBootRecord
{ #region Nested type: ModernMasterBootRecord
/// <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;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct ModernMasterBootRecord readonly struct ModernMasterBootRecord
@@ -838,6 +834,10 @@ public sealed class MBR : IPartition
public readonly ushort magic; public readonly ushort magic;
} }
#endregion
#region Nested type: NecMasterBootRecord
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct NecMasterBootRecord readonly struct NecMasterBootRecord
{ {
@@ -857,24 +857,9 @@ public sealed class MBR : IPartition
public readonly ushort magic; public readonly ushort magic;
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #endregion
readonly struct DiskManagerMasterBootRecord
{ #region Nested type: PartitionEntry
/// <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;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct PartitionEntry readonly struct PartitionEntry
@@ -900,4 +885,61 @@ public sealed class MBR : IPartition
/// <summary>Total sectors</summary> /// <summary>Total sectors</summary>
public readonly uint lba_sectors; 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 /> /// <inheritdoc />
/// <summary>Implements decoding of NeXT disklabels</summary> /// <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 public sealed class NeXTDisklabel : IPartition
{ {
/// <summary>"NeXT"</summary> /// <summary>"NeXT"</summary>
@@ -64,17 +65,21 @@ public sealed class NeXTDisklabel : IPartition
const ushort DISKTAB_ENTRY_SIZE = 0x2C; const ushort DISKTAB_ENTRY_SIZE = 0x2C;
const string MODULE_NAME = "NeXT disklabel plugin"; const string MODULE_NAME = "NeXT disklabel plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.NeXTDisklabel_Name; public string Name => Localization.NeXTDisklabel_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9"); public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
/// <inheritdoc /> /// <inheritdoc />
public bool GetInformation(IMediaImage imagePlugin, out List<Partition> partitions, ulong sectorOffset) public bool GetInformation(IMediaImage imagePlugin, out List<Partition> partitions, ulong sectorOffset)
{ {
bool magicFound = false; var magicFound = false;
byte[] labelSector; byte[] labelSector;
uint sectorSize = imagePlugin.Info.SectorSize is 2352 or 2448 ? 2048 : imagePlugin.Info.SectorSize; 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; ulong labelPosition = 0;
ErrorNumber errno; ErrorNumber errno;
foreach(ulong i in new ulong[] foreach(ulong i in new ulong[] { 0, 4, 15, 16 }.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
{
0, 4, 15, 16
}.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
{ {
errno = imagePlugin.ReadSector(i + sectorOffset, out labelSector); errno = imagePlugin.ReadSector(i + sectorOffset, out labelSector);
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
continue; continue;
uint magic = BigEndianBitConverter.ToUInt32(labelSector, 0x00); var magic = BigEndianBitConverter.ToUInt32(labelSector, 0x00);
if(magic != NEXT_MAGIC1 && if(magic != NEXT_MAGIC1 &&
magic != NEXT_MAGIC2 && magic != NEXT_MAGIC2 &&
@@ -120,19 +122,19 @@ public sealed class NeXTDisklabel : IPartition
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
return false; return false;
Label label = Marshal.ByteArrayToStructureBigEndian<Label>(labelSector); Label label = Marshal.ByteArrayToStructureBigEndian<Label>(labelSector);
byte[] disktabB = new byte[498]; var disktabB = new byte[498];
Array.Copy(labelSector, 44, disktabB, 0, 498); Array.Copy(labelSector, 44, disktabB, 0, 498);
label.dl_dt = Marshal.ByteArrayToStructureBigEndian<DiskTab>(disktabB); label.dl_dt = Marshal.ByteArrayToStructureBigEndian<DiskTab>(disktabB);
label.dl_dt.d_partitions = new Entry[8]; 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_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_label_blkno = {0}", label.dl_label_blkno);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_size = {0}", label.dl_size); 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_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_tag = 0x{0:X8}", label.dl_tag);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_name = \"{0}\"", 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}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_type = \"{0}\"",
StringHandlers.CToString(label.dl_dt.d_type)); 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_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_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_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_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_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_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_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_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_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_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_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]); 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)); 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_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]; var partB = new byte[44];
Array.Copy(labelSector, 44 + 146 + (44 * i), partB, 0, 44); Array.Copy(labelSector, 44 + 146 + 44 * i, partB, 0, 44);
label.dl_dt.d_partitions[i] = Marshal.ByteArrayToStructureBigEndian<Entry>(partB); label.dl_dt.d_partitions[i] = Marshal.ByteArrayToStructureBigEndian<Entry>(partB);
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_partitions[{0}].p_base = {1}", i, 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); 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(); 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') 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.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_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). sb.AppendFormat(Localization._0_of_space_must_be_free_at_minimum, label.dl_dt.d_partitions[i].p_minfree).
AppendLine(); AppendLine();
@@ -267,54 +269,9 @@ public sealed class NeXTDisklabel : IPartition
return true; return true;
} }
/// <summary>NeXT v3 disklabel, 544 bytes</summary> #endregion
[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;
}
/// <summary>NeXT v1 and v2 disklabel, 7224 bytes</summary> #region Nested type: DiskTab
[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;
}
/// <summary>NeXT disktab and partitions, 498 bytes</summary> /// <summary>NeXT disktab and partitions, 498 bytes</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -366,6 +323,10 @@ public sealed class NeXTDisklabel : IPartition
public Entry[] d_partitions; public Entry[] d_partitions;
} }
#endregion
#region Nested type: Entry
/// <summary>Partition entries, 44 bytes each</summary> /// <summary>Partition entries, 44 bytes each</summary>
[StructLayout(LayoutKind.Sequential, Pack = 2)] [StructLayout(LayoutKind.Sequential, Pack = 2)]
struct Entry struct Entry
@@ -397,4 +358,63 @@ public sealed class NeXTDisklabel : IPartition
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly byte[] p_type; 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 public sealed class PC98 : IPartition
{ {
const string MODULE_NAME = "PC-98 partitions plugin"; const string MODULE_NAME = "PC-98 partitions plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.PC98_Name; public string Name => Localization.PC98_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("27333401-C7C2-447D-961C-22AD0641A09A"); public Guid Id => new("27333401-C7C2-447D-961C-22AD0641A09A");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -84,19 +89,19 @@ public sealed class PC98 : IPartition
foreach(Partition entry in table.entries) foreach(Partition entry in table.entries)
{ {
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_mid = {0}", entry.dp_mid); 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_sid = {0}", entry.dp_sid);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum1 = {0}", entry.dp_dum1); 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_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_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_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_ipl_cyl = {0}", entry.dp_ipl_cyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ssect = {0}", entry.dp_ssect); 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_shd = {0}", entry.dp_shd);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_scyl = {0}", entry.dp_scyl); 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_esect = {0}", entry.dp_esect);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ehd = {0}", entry.dp_ehd); 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_ecyl = {0}", entry.dp_ecyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_name = \"{0}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_name = \"{0}\"",
StringHandlers.CToString(entry.dp_name, Encoding.GetEncoding(932))); StringHandlers.CToString(entry.dp_name, Encoding.GetEncoding(932)));
@@ -128,16 +133,16 @@ public sealed class PC98 : IPartition
part.Size = part.Length * imagePlugin.Info.SectorSize; part.Size = part.Length * imagePlugin.Info.SectorSize;
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Start = {0}", part.Start); AaruConsole.DebugWriteLine(MODULE_NAME, "part.Start = {0}", part.Start);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Type = {0}", part.Type); AaruConsole.DebugWriteLine(MODULE_NAME, "part.Type = {0}", part.Type);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Name = {0}", part.Name); AaruConsole.DebugWriteLine(MODULE_NAME, "part.Name = {0}", part.Name);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Sequence = {0}", part.Sequence); AaruConsole.DebugWriteLine(MODULE_NAME, "part.Sequence = {0}", part.Sequence);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Offset = {0}", part.Offset); AaruConsole.DebugWriteLine(MODULE_NAME, "part.Offset = {0}", part.Offset);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Length = {0}", part.Length); AaruConsole.DebugWriteLine(MODULE_NAME, "part.Length = {0}", part.Length);
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Size = {0}", part.Size); AaruConsole.DebugWriteLine(MODULE_NAME, "part.Size = {0}", part.Size);
if(((entry.dp_mid & 0x20) != 0x20 && (entry.dp_mid & 0x44) != 0x44) || if((entry.dp_mid & 0x20) != 0x20 && (entry.dp_mid & 0x44) != 0x44 ||
part.Start >= imagePlugin.Info.Sectors || part.Start >= imagePlugin.Info.Sectors ||
part.End > imagePlugin.Info.Sectors) part.End > imagePlugin.Info.Sectors)
continue; continue;
@@ -148,33 +153,39 @@ public sealed class PC98 : IPartition
return partitions.Count > 0; return partitions.Count > 0;
} }
#endregion
static string DecodePC98Sid(byte sid) static string DecodePC98Sid(byte sid)
{ {
switch(sid & 0x7F) switch(sid & 0x7F)
{ {
case 0x01: return Localization.FAT12; case 0x01:
case 0x04: return Localization.PC_UX; return Localization.FAT12;
case 0x06: return Localization.N88_BASIC_86; case 0x04:
return Localization.PC_UX;
case 0x06:
return Localization.N88_BASIC_86;
// Supposedly for FAT16 < 32 MiB, seen in bigger partitions // Supposedly for FAT16 < 32 MiB, seen in bigger partitions
case 0x11: case 0x11:
case 0x21: return Localization.FAT16; case 0x21:
return Localization.FAT16;
case 0x28: case 0x28:
case 0x41: case 0x41:
case 0x48: return Localization.Windows_Volume_Set; case 0x48:
case 0x44: return Localization.FreeBSD; return Localization.Windows_Volume_Set;
case 0x61: return Localization.FAT32; case 0x44:
case 0x62: return Localization.Linux; return Localization.FreeBSD;
default: return Localization.Unknown_partition_type; case 0x61:
return Localization.FAT32;
case 0x62:
return Localization.Linux;
default:
return Localization.Unknown_partition_type;
} }
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #region Nested type: Partition
readonly struct Table
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public readonly Partition[] entries;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partition readonly struct Partition
@@ -197,4 +208,17 @@ public sealed class PC98 : IPartition
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public readonly byte[] dp_name; 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> /// <summary>Implements decoding of Plan-9 partitions</summary>
public sealed class Plan9 : IPartition public sealed class Plan9 : IPartition
{ {
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.Plan9_Name; public string Name => Localization.Plan9_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("F0BF4FFC-056E-4E7C-8B65-4EAEE250ADD9"); public Guid Id => new("F0BF4FFC-056E-4E7C-8B65-4EAEE250ADD9");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -95,4 +99,6 @@ public sealed class Plan9 : IPartition
return partitions.Count > 0; return partitions.Count > 0;
} }
#endregion
} }

View File

@@ -178,10 +178,14 @@ public sealed class AmigaRigidDiskBlock : IPartition
const uint FLAGS_NO_AUTOMOUNT = 0x00000002; const uint FLAGS_NO_AUTOMOUNT = 0x00000002;
const string MODULE_NAME = "Amiga Rigid Disk Block (RDB) plugin"; const string MODULE_NAME = "Amiga Rigid Disk Block (RDB) plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.AmigaRigidDiskBlock_Name; public string Name => Localization.AmigaRigidDiskBlock_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("8D72ED97-1854-4170-9CE4-6E8446FD9863"); public Guid Id => new("8D72ED97-1854-4170-9CE4-6E8446FD9863");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -190,7 +194,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
{ {
partitions = new List<Partition>(); partitions = new List<Partition>();
ulong rdbBlock = 0; ulong rdbBlock = 0;
bool foundRdb = false; var foundRdb = false;
ErrorNumber errno; ErrorNumber errno;
while(rdbBlock < 16) while(rdbBlock < 16)
@@ -210,7 +214,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
continue; 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, AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Possible_magic_at_block_0_is_1_X8, rdbBlock,
magic); magic);
@@ -280,7 +284,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
rdb.HighCylinder = BigEndianBitConverter.ToUInt32(sector, 0x98); rdb.HighCylinder = BigEndianBitConverter.ToUInt32(sector, 0x98);
rdb.Reserved15 = BigEndianBitConverter.ToUInt32(sector, 0x9C); rdb.Reserved15 = BigEndianBitConverter.ToUInt32(sector, 0x9C);
byte[] tmpString = new byte[8]; var tmpString = new byte[8];
Array.Copy(sector, 0xA0, tmpString, 0, 8); Array.Copy(sector, 0xA0, tmpString, 0, 8);
rdb.DiskVendor = StringHandlers.SpacePaddedToString(tmpString); rdb.DiskVendor = StringHandlers.SpacePaddedToString(tmpString);
tmpString = new byte[16]; tmpString = new byte[16];
@@ -311,61 +315,61 @@ public sealed class AmigaRigidDiskBlock : IPartition
rdb.Reserved24 = BigEndianBitConverter.ToUInt32(sector, 0xF8); rdb.Reserved24 = BigEndianBitConverter.ToUInt32(sector, 0xF8);
rdb.Reserved25 = BigEndianBitConverter.ToUInt32(sector, 0xFC); rdb.Reserved25 = BigEndianBitConverter.ToUInt32(sector, 0xFC);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.magic = 0x{0:X8}", rdb.Magic); 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.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.checksum = 0x{0:X8}", rdb.Checksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.targetID = {0}", rdb.TargetId); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.targetID = {0}", rdb.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.block_size = {0}", rdb.BlockSize); 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.badblock_ptr = {0}", rdb.BadblockPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.partition_ptr = {0}", rdb.PartitionPtr); 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.fsheader_ptr = {0}", rdb.FsheaderPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.driveinitcode = {0}", rdb.Driveinitcode); 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.reserved1 = 0x{0:X8}", rdb.Reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved2 = 0x{0:X8}", rdb.Reserved2); 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.reserved3 = 0x{0:X8}", rdb.Reserved3);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved4 = 0x{0:X8}", rdb.Reserved4); 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.reserved5 = 0x{0:X8}", rdb.Reserved5);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved6 = 0x{0:X8}", rdb.Reserved6); 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.cylinders = {0}", rdb.Cylinders);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.spt = {0}", rdb.Spt); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.spt = {0}", rdb.Spt);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.heads = {0}", rdb.Heads); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.heads = {0}", rdb.Heads);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.interleave = {0}", rdb.Interleave); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.interleave = {0}", rdb.Interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.parking = {0}", rdb.Parking); 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.reserved7 = 0x{0:X8}", rdb.Reserved7);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved8 = 0x{0:X8}", rdb.Reserved8); 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.reserved9 = 0x{0:X8}", rdb.Reserved9);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.writeprecomp = {0}", rdb.Writeprecomp); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.writeprecomp = {0}", rdb.Writeprecomp);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reducedwrite = {0}", rdb.Reducedwrite); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reducedwrite = {0}", rdb.Reducedwrite);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.steprate = {0}", rdb.Steprate); 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.reserved10 = 0x{0:X8}", rdb.Reserved10);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved11 = 0x{0:X8}", rdb.Reserved11); 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.reserved12 = 0x{0:X8}", rdb.Reserved12);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved13 = 0x{0:X8}", rdb.Reserved13); 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.reserved14 = 0x{0:X8}", rdb.Reserved14);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockLow = {0}", rdb.RdbBlockLow); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockLow = {0}", rdb.RdbBlockLow);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockHigh = {0}", rdb.RdbBlockHigh); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockHigh = {0}", rdb.RdbBlockHigh);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.LowCylinder = {0}", rdb.LowCylinder); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.LowCylinder = {0}", rdb.LowCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.CylBlocks = {0}", rdb.CylBlocks); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.CylBlocks = {0}", rdb.CylBlocks);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.AutoParkSeconds = {0}", rdb.AutoParkSeconds); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.AutoParkSeconds = {0}", rdb.AutoParkSeconds);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder); 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.reserved15 = 0x{0:X8}", rdb.Reserved15);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskVendor = \"{0}\"", rdb.DiskVendor); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskVendor = \"{0}\"", rdb.DiskVendor);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskProduct = \"{0}\"", rdb.DiskProduct); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskProduct = \"{0}\"", rdb.DiskProduct);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskRevision = \"{0}\"", rdb.DiskRevision); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskRevision = \"{0}\"", rdb.DiskRevision);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerVendor = \"{0}\"", rdb.ControllerVendor); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerVendor = \"{0}\"", rdb.ControllerVendor);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerProduct = \"{0}\"", rdb.ControllerProduct); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerProduct = \"{0}\"", rdb.ControllerProduct);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerRevision = \"{0}\"", rdb.ControllerRevision); 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.reserved16 = 0x{0:X8}", rdb.Reserved16);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved17 = 0x{0:X8}", rdb.Reserved17); 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.reserved18 = 0x{0:X8}", rdb.Reserved18);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved19 = 0x{0:X8}", rdb.Reserved19); 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.reserved20 = 0x{0:X8}", rdb.Reserved20);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved21 = 0x{0:X8}", rdb.Reserved21); 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.reserved22 = 0x{0:X8}", rdb.Reserved22);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved23 = 0x{0:X8}", rdb.Reserved23); 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.reserved24 = 0x{0:X8}", rdb.Reserved24);
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved25 = 0x{0:X8}", rdb.Reserved25); AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved25 = 0x{0:X8}", rdb.Reserved25);
// Reading BadBlock list // Reading BadBlock list
List<BadBlockList> badBlockChain = new(); List<BadBlockList> badBlockChain = new();
@@ -381,7 +385,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
break; break;
uint magic = BigEndianBitConverter.ToUInt32(sector, 0); var magic = BigEndianBitConverter.ToUInt32(sector, 0);
if(magic != BAD_BLOCK_LIST_MAGIC) if(magic != BAD_BLOCK_LIST_MAGIC)
break; break;
@@ -407,15 +411,15 @@ public sealed class AmigaRigidDiskBlock : IPartition
chainEntry.Size * 4); chainEntry.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.checksum = 0x{0:X8}", chainEntry.Checksum); 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.targetID = {0}", chainEntry.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.next_ptr = {0}", chainEntry.NextPtr); AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.next_ptr = {0}", chainEntry.NextPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.reserved = 0x{0:X8}", chainEntry.Reserved); AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.reserved = 0x{0:X8}", chainEntry.Reserved);
for(ulong i = 0; i < entries; i++) 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, AaruConsole.DebugWriteLine(MODULE_NAME,
Localization.Bad_block_at_0_replaced_with_good_block_at_1, Localization.Bad_block_at_0_replaced_with_good_block_at_1,
@@ -441,7 +445,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
break; break;
uint magic = BigEndianBitConverter.ToUInt32(sector, 0); var magic = BigEndianBitConverter.ToUInt32(sector, 0);
if(magic != PARTITION_BLOCK_MAGIC) if(magic != PARTITION_BLOCK_MAGIC)
break; 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); Array.Copy(sector, 0x24, driveName, 0, 32);
partEntry.DriveName = StringHandlers.PascalToString(driveName, Encoding.GetEncoding("iso-8859-1")); 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, AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.size = {0} longs, {1} bytes", partEntry.Size,
partEntry.Size * 4); partEntry.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.checksum = 0x{0:X8}", partEntry.Checksum); 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.targetID = {0}", partEntry.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.next_ptr = {0}", partEntry.NextPtr); 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.flags = 0x{0:X8}", partEntry.Flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved1 = 0x{0:X8}", partEntry.Reserved1); 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.reserved2 = 0x{0:X8}", partEntry.Reserved2);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.devFlags = 0x{0:X8}", partEntry.DevFlags); 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.driveNameLen = {0}", partEntry.DriveNameLen);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveName = \"{0}\"", partEntry.DriveName); 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.reserved3 = 0x{0:X8}", partEntry.Reserved3);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved4 = 0x{0:X8}", partEntry.Reserved4); 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.reserved5 = 0x{0:X8}", partEntry.Reserved5);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved6 = 0x{0:X8}", partEntry.Reserved6); 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.reserved7 = 0x{0:X8}", partEntry.Reserved7);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved8 = 0x{0:X8}", partEntry.Reserved8); 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.reserved9 = 0x{0:X8}", partEntry.Reserved9);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved10 = 0x{0:X8}", partEntry.Reserved10); 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.reserved11 = 0x{0:X8}", partEntry.Reserved11);
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved12 = 0x{0:X8}", partEntry.Reserved12); AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved12 = 0x{0:X8}", partEntry.Reserved12);
@@ -610,7 +614,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
break; break;
uint magic = BigEndianBitConverter.ToUInt32(sector, 0); var magic = BigEndianBitConverter.ToUInt32(sector, 0);
if(magic != FILESYSTEM_HEADER_MAGIC) if(magic != FILESYSTEM_HEADER_MAGIC)
break; break;
@@ -649,10 +653,10 @@ public sealed class AmigaRigidDiskBlock : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.size = {0} longs, {1} bytes", fshd.Size, AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.size = {0} longs, {1} bytes", fshd.Size,
fshd.Size * 4); fshd.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.checksum = 0x{0:X8}", fshd.Checksum); 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.targetID = {0}", fshd.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.next_ptr = {0}", fshd.NextPtr); 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.flags = 0x{0:X8}", fshd.Flags);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.reserved1 = 0x{0:X8}", fshd.Reserved1); AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.reserved1 = 0x{0:X8}", fshd.Reserved1);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.reserved2 = 0x{0:X8}", fshd.Reserved2); 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.patchFlags = 0x{0:X8}", fshd.PatchFlags);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.type = {0}", fshd.Dnode.Type); 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.task = {0}", fshd.Dnode.Task);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.locked = {0}", fshd.Dnode.Locked); 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.handler = {0}", fshd.Dnode.Handler);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.stackSize = {0}", fshd.Dnode.StackSize); 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.priority = {0}", fshd.Dnode.Priority);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.startup = {0}", fshd.Dnode.Startup); 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.seglist_ptr = {0}", fshd.Dnode.SeglistPtr);
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.global_vec = 0x{0:X8}", fshd.Dnode.GlobalVec); AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.global_vec = 0x{0:X8}", fshd.Dnode.GlobalVec);
nextBlock = fshd.Dnode.SeglistPtr; nextBlock = fshd.Dnode.SeglistPtr;
bool thereAreLoadSegments = false; var thereAreLoadSegments = false;
var sha1Ctx = new Sha1Context(); var sha1Ctx = new Sha1Context();
while(nextBlock != 0xFFFFFFFF) while(nextBlock != 0xFFFFFFFF)
{ {
@@ -688,7 +692,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
break; break;
uint magicSeg = BigEndianBitConverter.ToUInt32(sector, 0); var magicSeg = BigEndianBitConverter.ToUInt32(sector, 0);
if(magicSeg != LOAD_SEG_MAGIC) if(magicSeg != LOAD_SEG_MAGIC)
break; break;
@@ -715,8 +719,8 @@ public sealed class AmigaRigidDiskBlock : IPartition
loadSeg.Size * 4); loadSeg.Size * 4);
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.checksum = 0x{0:X8}", loadSeg.Checksum); 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.targetID = {0}", loadSeg.TargetId);
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.next_ptr = {0}", loadSeg.NextPtr); AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.next_ptr = {0}", loadSeg.NextPtr);
segmentEntries.Add(loadSeg); segmentEntries.Add(loadSeg);
nextBlock = loadSeg.NextPtr; nextBlock = loadSeg.NextPtr;
@@ -743,11 +747,11 @@ public sealed class AmigaRigidDiskBlock : IPartition
Sequence = sequence, Sequence = sequence,
Length = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) * Length = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) *
rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt, 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, sectorOffset,
Type = AmigaDosTypeToString(rdbEntry.DosEnvVec.DosType), Type = AmigaDosTypeToString(rdbEntry.DosEnvVec.DosType),
Scheme = Name, 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, sectorOffset) * rdb.BlockSize,
Size = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) * Size = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) *
rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt * rdb.BlockSize rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt * rdb.BlockSize
@@ -760,34 +764,57 @@ public sealed class AmigaRigidDiskBlock : IPartition
return true; return true;
} }
#endregion
static string AmigaDosTypeToDescriptionString(uint amigaDosType) static string AmigaDosTypeToDescriptionString(uint amigaDosType)
{ {
switch(amigaDosType) switch(amigaDosType)
{ {
case TYPEID_OFS: return Localization.Amiga_Original_File_System; case TYPEID_OFS:
case TYPEID_FFS: return Localization.Amiga_Fast_File_System; return Localization.Amiga_Original_File_System;
case TYPEID_OFS_INTL: return Localization.Amiga_Original_File_System_with_international_characters; case TYPEID_FFS:
case TYPEID_FFS_INTL: return Localization.Amiga_Fast_File_System_with_international_characters; return Localization.Amiga_Fast_File_System;
case TYPEID_OFS_CACHE: return Localization.Amiga_Original_File_System_with_directory_cache; case TYPEID_OFS_INTL:
case TYPEID_FFS_CACHE: return Localization.Amiga_Fast_File_System_with_directory_cache; return Localization.Amiga_Original_File_System_with_international_characters;
case TYPEID_OFS2: return Localization.Amiga_Original_File_System_with_long_filenames; case TYPEID_FFS_INTL:
case TYPEID_FFS2: return Localization.Amiga_Fast_File_System_with_long_filenames; return Localization.Amiga_Fast_File_System_with_international_characters;
case TYPEID_AMIX_SYSV: return Localization.Amiga_UNIX_System_V_filesystem; case TYPEID_OFS_CACHE:
case TYPEID_AMIX_BOOT: return Localization.Amiga_UNIX_boot_filesystem; return Localization.Amiga_Original_File_System_with_directory_cache;
case TYPEID_AMIX_FFS: return Localization.Amiga_UNIX_BSD_filesystem; case TYPEID_FFS_CACHE:
case TYPEID_AMIX_RESERVED: return Localization.Amiga_UNIX_Reserved_partition__swap_; 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_PFS:
case TYPEID_PFS2: case TYPEID_PFS2:
case TYPEID_PFS_MUSER: case TYPEID_PFS_MUSER:
case TYPEID_AFS: return Localization.ProfessionalFileSystem; case TYPEID_AFS:
case TYPEID_SFS: return Localization.SmartFileSystem_v1; return Localization.ProfessionalFileSystem;
case TYPEID_SFS2: return Localization.SmartFileSystem_v2; case TYPEID_SFS:
case TYPEID_JXFS: return Localization.JXFS; return Localization.SmartFileSystem_v1;
case TYPEID_CROSS_DOS: return Localization.FAT_as_set_by_CrossDOS; case TYPEID_SFS2:
case TYPEID_CROSS_MAC: return Localization.HFS_as_set_by_CrossMac; return Localization.SmartFileSystem_v2;
case TYPEID_BFFS: return Localization._4_2_UFS_for_BFFS; case TYPEID_JXFS:
case TYPEID_OFS_MUSER: return Localization.Amiga_Original_File_System_with_multi_user_patches; return Localization.JXFS;
case TYPEID_FFS_MUSER: return Localization.Amiga_Fast_File_System_with_multi_user_patches; 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: case TYPEID_OFS_INTL_MUSER:
return Localization.Amiga_Original_File_System_with_international_characters_and_multi_user_patches; return Localization.Amiga_Original_File_System_with_international_characters_and_multi_user_patches;
case TYPEID_FFS_INTL_MUSER: 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; return Localization.Amiga_Original_File_System_with_directory_cache_and_multi_user_patches;
case TYPEID_FFS_CACHE_MUSER: case TYPEID_FFS_CACHE_MUSER:
return Localization.Amiga_Fast_File_System_with_directory_cache_and_multi_user_patches; 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_UNUSED:
case TYPEID_OLD_BSD_SWAP: return Localization.BSD_swap; return Localization.BSD_unused;
case TYPEID_OLD_BSD42_FFS: return Localization.BSD_4_2_FFS; case TYPEID_OLD_BSD_SWAP:
case TYPEID_OLD_BSD44_LFS: return Localization.BSD_4_4_LFS; return Localization.BSD_swap;
case TYPEID_NETBSD_ROOT_UNUSED: return Localization.NetBSD_unused_root_partition; case TYPEID_OLD_BSD42_FFS:
case TYPEID_NETBSD_ROOT_42FFS: return Localization.NetBSD_4_2_FFS_root_partition; return Localization.BSD_4_2_FFS;
case TYPEID_NETBSD_ROOT_44LFS: return Localization.NetBSD_4_4_LFS_root_partition; case TYPEID_OLD_BSD44_LFS:
case TYPEID_NETBSD_USER_UNUSED: return Localization.NetBSD_unused_user_partition; return Localization.BSD_4_4_LFS;
case TYPEID_NETBSD_USER_42FFS: return Localization.NetBSD_4_2_FFS_user_partition; case TYPEID_NETBSD_ROOT_UNUSED:
case TYPEID_NETBSD_USER_44LFS: return Localization.NetBSD_4_4_LFS_user_partition; return Localization.NetBSD_unused_root_partition;
case TYPEID_NETBSD_SWAP: return Localization.NetBSD_swap_partition; case TYPEID_NETBSD_ROOT_42FFS:
case TYPEID_LINUX: return Localization.Linux_filesystem_partition; return Localization.NetBSD_4_2_FFS_root_partition;
case TYPEID_LINUX_SWAP: return Localization.Linux_swap_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_FRAME:
case TYPEID_RAID_FRAME0: return Localization.RaidFrame_partition; case TYPEID_RAID_FRAME0:
return Localization.RaidFrame_partition;
default: default:
{ {
if((amigaDosType & TYPEID_OFS) == TYPEID_OFS) if((amigaDosType & TYPEID_OFS) == TYPEID_OFS)
{
return string.Format(Localization.Unknown_Amiga_DOS_filesystem_type_0, return string.Format(Localization.Unknown_Amiga_DOS_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_AMIX_SYSV) == TYPEID_AMIX_SYSV) if((amigaDosType & TYPEID_AMIX_SYSV) == TYPEID_AMIX_SYSV)
{
return string.Format(Localization.Unknown_Amiga_UNIX_filesystem_type_0, return string.Format(Localization.Unknown_Amiga_UNIX_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & 0x50465300) == 0x50465300 || if((amigaDosType & 0x50465300) == 0x50465300 ||
(amigaDosType & 0x41465300) == 0x41465300) (amigaDosType & 0x41465300) == 0x41465300)
{
return string.Format(Localization.Unknown_ProfessionalFileSystem_type_0, return string.Format(Localization.Unknown_ProfessionalFileSystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_SFS) == TYPEID_SFS) if((amigaDosType & TYPEID_SFS) == TYPEID_SFS)
{
return string.Format(Localization.Unknown_SmartFileSystem_type_0, return string.Format(Localization.Unknown_SmartFileSystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_OFS_MUSER) == TYPEID_OFS_MUSER) if((amigaDosType & TYPEID_OFS_MUSER) == TYPEID_OFS_MUSER)
{
return string.Format(Localization.Unknown_Amiga_DOS_multi_user_filesystem_type_0, return string.Format(Localization.Unknown_Amiga_DOS_multi_user_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_OLD_BSD_UNUSED) == TYPEID_OLD_BSD_UNUSED) if((amigaDosType & TYPEID_OLD_BSD_UNUSED) == TYPEID_OLD_BSD_UNUSED)
{
return string.Format(Localization.Unknown_BSD_filesystem_type_0, return string.Format(Localization.Unknown_BSD_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_NETBSD_ROOT_UNUSED) == TYPEID_NETBSD_ROOT_UNUSED) if((amigaDosType & TYPEID_NETBSD_ROOT_UNUSED) == TYPEID_NETBSD_ROOT_UNUSED)
{
return string.Format(Localization.Unknown_NetBSD_root_filesystem_type_0, return string.Format(Localization.Unknown_NetBSD_root_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_NETBSD_USER_UNUSED) == TYPEID_NETBSD_USER_UNUSED) if((amigaDosType & TYPEID_NETBSD_USER_UNUSED) == TYPEID_NETBSD_USER_UNUSED)
{
return string.Format(Localization.Unknown_NetBSD_user_filesystem_type_0, return string.Format(Localization.Unknown_NetBSD_user_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_NETBSD_SWAP) == TYPEID_NETBSD_SWAP) if((amigaDosType & TYPEID_NETBSD_SWAP) == TYPEID_NETBSD_SWAP)
{
return string.Format(Localization.Unknown_NetBSD_swap_filesystem_type_0, return string.Format(Localization.Unknown_NetBSD_swap_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
if((amigaDosType & TYPEID_LINUX) == TYPEID_LINUX || if((amigaDosType & TYPEID_LINUX) == TYPEID_LINUX ||
(amigaDosType & TYPEID_LINUX_SWAP) == TYPEID_LINUX_SWAP) (amigaDosType & TYPEID_LINUX_SWAP) == TYPEID_LINUX_SWAP)
{
return string.Format(Localization.Unknown_Linux_filesystem_type_0, return string.Format(Localization.Unknown_Linux_filesystem_type_0,
AmigaDosTypeToString(amigaDosType)); AmigaDosTypeToString(amigaDosType));
}
return string.Format(Localization.Unknown_partition_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) 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[0] = (byte)((amigaDosType & 0xFF000000) >> 24);
textPart[1] = (byte)((amigaDosType & 0x00FF0000) >> 16); textPart[1] = (byte)((amigaDosType & 0x00FF0000) >> 16);
@@ -874,6 +935,236 @@ public sealed class AmigaRigidDiskBlock : IPartition
return quoted ? $"\"{textPartString}\\{amigaDosType & 0xFF}\"" : $"{textPartString}\\{amigaDosType & 0xFF}"; 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> /// <summary>Amiga Rigid Disk Block, header for partitioning scheme Can be in any sector from 0 to 15, inclusive</summary>
struct RigidDiskBlock struct RigidDiskBlock
{ {
@@ -991,203 +1282,5 @@ public sealed class AmigaRigidDiskBlock : IPartition
public uint Reserved25; public uint Reserved25;
} }
/// <summary>Pair for spare blocks</summary> #endregion
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;
}
} }

View File

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

View File

@@ -53,10 +53,14 @@ public sealed class SGI : IPartition
const int SGI_MAGIC = 0x0BE5A941; const int SGI_MAGIC = 0x0BE5A941;
const string MODULE_NAME = "SGI Volume Header plugin"; const string MODULE_NAME = "SGI Volume Header plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.SGI_Name; public string Name => Localization.SGI_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("AEF5AB45-4880-4CE8-8735-F0A402E2E5F2"); public Guid Id => new("AEF5AB45-4880-4CE8-8735-F0A402E2E5F2");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -73,10 +77,10 @@ public sealed class SGI : IPartition
Label dvh = Marshal.ByteArrayToStructureBigEndian<Label>(sector); 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]); 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]); 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, 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}", AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_spares_cyl = {0}",
dvh.device_params.dp_spares_cyl); 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_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_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_trks0 = {0}", dvh.device_params.dp_trks0);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_ctq_depth = {0}", 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}", AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_nretries = {0}",
dvh.device_params.dp_nretries); 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_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_xsync = {0}", dvh.device_params.dp_xsync);
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_xrdly = {0}", dvh.device_params.dp_xrdly); 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; 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, AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.partitions[{0}].num_blocks = {1}", i,
dvh.partitions[i].num_blocks); dvh.partitions[i].num_blocks);
@@ -166,86 +170,31 @@ public sealed class SGI : IPartition
return true; return true;
} }
#endregion
static string TypeToString(SGIType typ) => typ switch static string TypeToString(SGIType typ) => typ switch
{ {
SGIType.Header => Localization.Volume_header, SGIType.Header => Localization.Volume_header,
SGIType.TrkRepl => Localization.Track_replacements, SGIType.TrkRepl => Localization.Track_replacements,
SGIType.SecRepl => Localization.Sector_replacements, SGIType.SecRepl => Localization.Sector_replacements,
SGIType.Swap => Localization.Raw_data_swap, SGIType.Swap => Localization.Raw_data_swap,
SGIType.Bsd => Localization._4_2_BSD_Fast_File_System, SGIType.Bsd => Localization._4_2_BSD_Fast_File_System,
SGIType.SystemV => Localization.UNIX_System_V, SGIType.SystemV => Localization.UNIX_System_V,
SGIType.Volume => Localization.Whole_device, SGIType.Volume => Localization.Whole_device,
SGIType.EFS => Localization.EFS, SGIType.EFS => Localization.EFS,
SGIType.Lvol => Localization.Logical_volume, SGIType.Lvol => Localization.Logical_volume,
SGIType.Rlvol => Localization.Raw_logical_volume, SGIType.Rlvol => Localization.Raw_logical_volume,
SGIType.XFS => Localization.XFS, SGIType.XFS => Localization.XFS,
SGIType.Xlvol => Localization.XFS_log_device, SGIType.Xlvol => Localization.XFS_log_device,
SGIType.Rxlvol => Localization.XLV_volume, SGIType.Rxlvol => Localization.XLV_volume,
SGIType.Xvm => Localization.SGI_XVM, SGIType.Xvm => Localization.SGI_XVM,
SGIType.LinuxSwap => Localization.Linux_swap, SGIType.LinuxSwap => Localization.Linux_swap,
SGIType.Linux => Localization.Linux, SGIType.Linux => Localization.Linux,
SGIType.LinuxRAID => Localization.Linux_RAID, SGIType.LinuxRAID => Localization.Linux_RAID,
_ => Localization.Unknown_partition_type _ => Localization.Unknown_partition_type
}; };
[StructLayout(LayoutKind.Sequential, Pack = 1)] #region Nested type: DeviceParameters
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;
}
struct DeviceParameters struct DeviceParameters
{ {
@@ -273,4 +222,92 @@ public sealed class SGI : IPartition
public ushort dp_xrgate; public ushort dp_xrgate;
public ushort dp_xwcont; 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> /// <summary>Length of v_volume</summary>
const int LEN_DKL_VVOL = 8; const int LEN_DKL_VVOL = 8;
/// <summary>Size of padding in SunOS disk label</summary> /// <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> /// <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) const int LEN_DKL_PAD8 = DK_LABEL_SIZE - (LEN_DKL_ASCII + 136 + // sizeof(dk_vtoc8)
(NDKMAP * 8) + (14 * 2) + (2 * 2)); NDKMAP * 8 + 14 * 2 + 2 * 2);
const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16) const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16)
(4 * 4) + (12 * 2) + (2 * 2)); 4 * 4 + 12 * 2 + 2 * 2);
const string MODULE_NAME = "Sun partitions plugin"; const string MODULE_NAME = "Sun partitions plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.SunDisklabel_Name; public string Name => Localization.SunDisklabel_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("50F35CC4-8375-4445-8DCB-1BA550C931A3"); public Guid Id => new("50F35CC4-8375-4445-8DCB-1BA550C931A3");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -105,17 +109,19 @@ public sealed class SunDisklabel : IPartition
dk_label8 dkl8 = Marshal.ByteArrayToStructureLittleEndian<dk_label8>(sunSector); dk_label8 dkl8 = Marshal.ByteArrayToStructureLittleEndian<dk_label8>(sunSector);
dk_label16 dkl16 = Marshal.ByteArrayToStructureLittleEndian<dk_label16>(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, "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, "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); 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(dkl.dkl_magic is DKL_MAGIC or DKL_CIGAM)
{
if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS) if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl16 = true; useDkl16 = true;
else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS) else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl8 = true; useDkl8 = true;
else else
useDkl = true; useDkl = true;
}
if(!useDkl && if(!useDkl &&
!useDkl8 && !useDkl8 &&
@@ -130,12 +136,14 @@ public sealed class SunDisklabel : IPartition
dkl16 = Marshal.ByteArrayToStructureLittleEndian<dk_label16>(sunSector); dkl16 = Marshal.ByteArrayToStructureLittleEndian<dk_label16>(sunSector);
if(dkl.dkl_magic is DKL_MAGIC or DKL_CIGAM) if(dkl.dkl_magic is DKL_MAGIC or DKL_CIGAM)
{
if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS) if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl16 = true; useDkl16 = true;
else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS) else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
useDkl8 = true; useDkl8 = true;
else else
useDkl = true; useDkl = true;
}
} }
} }
@@ -153,25 +161,25 @@ public sealed class SunDisklabel : IPartition
if(useDkl) 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}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_asciilabel = \"{0}\"",
StringHandlers.CToString(dkl.dkl_asciilabel)); StringHandlers.CToString(dkl.dkl_asciilabel));
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_rpm = {0}", dkl.dkl_rpm); 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_pcyl = {0}", dkl.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_apc = {0}", dkl.dkl_apc); 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_gap1 = {0}", dkl.dkl_gap1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap2 = {0}", dkl.dkl_gap2); 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_intrlv = {0}", dkl.dkl_intrlv);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ncyl = {0}", dkl.dkl_ncyl); 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_acyl = {0}", dkl.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nhead = {0}", dkl.dkl_nhead); 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_nsect = {0}", dkl.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_bhead = {0}", dkl.dkl_bhead); 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_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, AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_map[{0}].dkl_cylno = {1}", i,
dkl.dkl_map[i].dkl_cylno); 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, "dkl.dkl_cksum = 0x{0:X4}", dkl.dkl_cksum);
AaruConsole.DebugWriteLine(MODULE_NAME, "sectorsPerCylinder = {0}", sectorsPerCylinder); 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 && if(dkl.dkl_map[i].dkl_cylno > 0 &&
dkl.dkl_map[i].dkl_nblk > 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), Length = (ulong)(dkl.dkl_map[i].dkl_nblk * DK_LABEL_SIZE / imagePlugin.Info.SectorSize),
Sequence = (ulong)i, Sequence = (ulong)i,
Offset = Offset =
(((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) * DK_LABEL_SIZE, ((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) * DK_LABEL_SIZE,
Start = (((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) * Start = ((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) *
DK_LABEL_SIZE / imagePlugin.Info.SectorSize, DK_LABEL_SIZE / imagePlugin.Info.SectorSize,
Type = Localization.SunOS_partition, Type = Localization.SunOS_partition,
Scheme = Name Scheme = Name
@@ -204,10 +213,11 @@ public sealed class SunDisklabel : IPartition
part.End <= imagePlugin.Info.Sectors) part.End <= imagePlugin.Info.Sectors)
partitions.Add(part); partitions.Add(part);
} }
}
} }
else if(useDkl8) 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}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_asciilabel = \"{0}\"",
StringHandlers.CToString(dkl8.dkl_asciilabel)); StringHandlers.CToString(dkl8.dkl_asciilabel));
@@ -217,24 +227,24 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_volume = \"{0}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_volume = \"{0}\"",
StringHandlers.CToString(dkl8.dkl_vtoc.v_volume)); 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_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_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_read_reinstruct = {0}", dkl8.dkl_read_reinstruct);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_rpm = {0}", dkl8.dkl_rpm); 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_pcyl = {0}", dkl8.dkl_pcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_apc = {0}", dkl8.dkl_apc); 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_obs1 = {0}", dkl8.dkl_obs1);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs2 = {0}", dkl8.dkl_obs2); 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_intrlv = {0}", dkl8.dkl_intrlv);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_ncyl = {0}", dkl8.dkl_ncyl); 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_acyl = {0}", dkl8.dkl_acyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nhead = {0}", dkl8.dkl_nhead); 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_nsect = {0}", dkl8.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs3 = {0}", dkl8.dkl_obs3); 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_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, AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_map[{0}].dkl_cylno = {1}", i,
dkl8.dkl_map[i].dkl_cylno); 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_magic = 0x{0:X4}", dkl8.dkl_magic);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_cksum = 0x{0:X4}", dkl8.dkl_cksum); 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) if(dkl8.dkl_vtoc.v_nparts > NDKMAP)
return false; 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 && 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.SunEmpty &&
dkl8.dkl_vtoc.v_part[i].p_tag != SunTag.SunWholeDisk) 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, 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), Length = (ulong)(dkl8.dkl_map[i].dkl_nblk * DK_LABEL_SIZE / imagePlugin.Info.SectorSize),
Sequence = (ulong)i, 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, 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, DK_LABEL_SIZE / imagePlugin.Info.SectorSize,
Type = SunIdToString(dkl8.dkl_vtoc.v_part[i].p_tag), Type = SunIdToString(dkl8.dkl_vtoc.v_part[i].p_tag),
Scheme = Name Scheme = Name
}; };
if(dkl8.dkl_vtoc.v_timestamp[i] != 0) if(dkl8.dkl_vtoc.v_timestamp[i] != 0)
{
part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0, part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0,
DateHandlers. DateHandlers.
UnixToDateTime(dkl8.dkl_vtoc.v_timestamp[i])); UnixToDateTime(dkl8.dkl_vtoc.v_timestamp[i]));
}
if(part.Start < imagePlugin.Info.Sectors && if(part.Start < imagePlugin.Info.Sectors &&
part.End <= imagePlugin.Info.Sectors) part.End <= imagePlugin.Info.Sectors)
partitions.Add(part); partitions.Add(part);
} }
}
} }
else 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_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}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_volume = \"{0}\"",
StringHandlers.CToString(dkl16.dkl_vtoc.v_volume)); 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_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}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_asciilabel = \"{0}\"",
StringHandlers.CToString(dkl16.dkl_vtoc.v_asciilabel)); StringHandlers.CToString(dkl16.dkl_vtoc.v_asciilabel));
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_pcyl = {0}", dkl16.dkl_pcyl); 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_ncyl = {0}", dkl16.dkl_ncyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_acyl = {0}", dkl16.dkl_acyl); 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_bcyl = {0}", dkl16.dkl_bcyl);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nhead = {0}", dkl16.dkl_nhead); 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_nsect = {0}", dkl16.dkl_nsect);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_intrlv = {0}", dkl16.dkl_intrlv); 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_skew = {0}", dkl16.dkl_skew);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_apc = {0}", dkl16.dkl_apc); 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_rpm = {0}", dkl16.dkl_rpm);
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_write_reinstruct = {0}", dkl16.dkl_write_reinstruct); 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); 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, AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_part[{0}].p_start = {1}", i,
dkl16.dkl_vtoc.v_part[i].p_start); dkl16.dkl_vtoc.v_part[i].p_start);
@@ -341,7 +355,8 @@ public sealed class SunDisklabel : IPartition
if(dkl16.dkl_vtoc.v_nparts > NDKMAP16) if(dkl16.dkl_vtoc.v_nparts > NDKMAP16)
return false; 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 && 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.SunEmpty &&
dkl16.dkl_vtoc.v_part[i].p_tag != SunTag.SunWholeDisk) 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) if(dkl16.dkl_vtoc.v_timestamp[i] != 0)
{
part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0, part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0,
DateHandlers. DateHandlers.
UnixToDateTime(dkl16.dkl_vtoc.v_timestamp[i])); UnixToDateTime(dkl16.dkl_vtoc.v_timestamp[i]));
}
if(part.Start < imagePlugin.Info.Sectors && if(part.Start < imagePlugin.Info.Sectors &&
part.End <= imagePlugin.Info.Sectors) part.End <= imagePlugin.Info.Sectors)
partitions.Add(part); partitions.Add(part);
} }
}
} }
return partitions.Count > 0; return partitions.Count > 0;
} }
#endregion
static dk_label SwapDiskLabel(dk_label label) static dk_label SwapDiskLabel(dk_label label)
{ {
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label); AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label);
label = (dk_label)Marshal.SwapStructureMembersEndian(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]); label.dkl_map[i] = (dk_map)Marshal.SwapStructureMembersEndian(label.dkl_map[i]);
return label; return label;
@@ -390,22 +410,22 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label8); AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label8);
label = (dk_label8)Marshal.SwapStructureMembersEndian(label); 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]); 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]); 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_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); 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]); 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]); label.dkl_vtoc.v_reserved[i] = Swapping.Swap(label.dkl_vtoc.v_reserved[i]);
return label; return label;
@@ -416,10 +436,10 @@ public sealed class SunDisklabel : IPartition
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label16); AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label16);
label = (dk_label16)Marshal.SwapStructureMembersEndian(label); 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]); 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_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); 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); 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]); 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]); label.dkl_vtoc.v_reserved[i] = Swapping.Swap(label.dkl_vtoc.v_reserved[i]);
return label; return label;
@@ -450,61 +470,35 @@ public sealed class SunDisklabel : IPartition
} }
static string SunIdToString(SunTag id) => id switch static string SunIdToString(SunTag id) => id switch
{ {
SunTag.Linux => Localization.Linux, SunTag.Linux => Localization.Linux,
SunTag.LinuxRaid => Localization.Linux_RAID, SunTag.LinuxRaid => Localization.Linux_RAID,
SunTag.LinuxSwap => Localization.Linux_swap, SunTag.LinuxSwap => Localization.Linux_swap,
SunTag.LVM => Localization.LVM, SunTag.LVM => Localization.LVM,
SunTag.SunBoot => Localization.Sun_boot, SunTag.SunBoot => Localization.Sun_boot,
SunTag.SunEmpty => Localization.Empty, SunTag.SunEmpty => Localization.Empty,
SunTag.SunHome => Localization.Sun_home, SunTag.SunHome => Localization.Sun_home,
SunTag.SunRoot => Localization.Sun_root, SunTag.SunRoot => Localization.Sun_root,
SunTag.SunStand => Localization.Sun_stand, SunTag.SunStand => Localization.Sun_stand,
SunTag.SunSwap => Localization.Sun_swap, SunTag.SunSwap => Localization.Sun_swap,
SunTag.SunUsr => Localization.Sun_usr, SunTag.SunUsr => Localization.Sun_usr,
SunTag.SunVar => Localization.Sun_var, SunTag.SunVar => Localization.Sun_var,
SunTag.SunWholeDisk => Localization.Whole_disk, SunTag.SunWholeDisk => Localization.Whole_disk,
SunTag.SunAlt => Localization.Replacement_sectors, SunTag.SunAlt => Localization.Replacement_sectors,
SunTag.SunCache => Localization.Sun_cachefs, SunTag.SunCache => Localization.Sun_cachefs,
SunTag.SunReserved => Localization.Reserved_for_SMI, SunTag.SunReserved => Localization.Reserved_for_SMI,
SunTag.VxVmPublic => Localization.Veritas_public, SunTag.VxVmPublic => Localization.Veritas_public,
SunTag.VxVmPrivate => Localization.Veritas_private, SunTag.VxVmPrivate => Localization.Veritas_private,
SunTag.NetBSD => Localization.NetBSD, SunTag.NetBSD => Localization.NetBSD,
SunTag.FreeBSD_Swap => Localization.FreeBSD_swap, SunTag.FreeBSD_Swap => Localization.FreeBSD_swap,
SunTag.FreeBSD_UFS => Localization.FreeBSD, SunTag.FreeBSD_UFS => Localization.FreeBSD,
SunTag.FreeBSD_Vinum => Localization.Vinum, SunTag.FreeBSD_Vinum => Localization.Vinum,
SunTag.FreeBSD_ZFS => Localization.FreeBSD_ZFS, SunTag.FreeBSD_ZFS => Localization.FreeBSD_ZFS,
SunTag.FreeBSD_NANDFS => Localization.FreeBSD_nandfs, SunTag.FreeBSD_NANDFS => Localization.FreeBSD_nandfs,
_ => Localization.Unknown_partition_type _ => Localization.Unknown_partition_type
}; };
enum SunTag : ushort #region Nested type: dk_label
{
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;
}
/// <summary>SunOS disk label</summary> /// <summary>SunOS disk label</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -549,88 +543,54 @@ public sealed class SunDisklabel : IPartition
public readonly ushort dkl_cksum; public readonly ushort dkl_cksum;
} }
/// <summary>Solaris logical partition for small disk label</summary> #endregion
[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;
}
/// <summary>Solaris logical partition</summary> #region Nested type: dk_label16
[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;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_vtoc8 struct dk_label16
{ {
/// <summary> layout version</summary> /// <summary>vtoc inclusions from AT&amp;T SVr4</summary>
public readonly uint v_version; public readonly dk_vtoc16 dkl_vtoc;
/// <summary> volume name</summary> /// <summary># of physical cylinders</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)] public readonly uint dkl_pcyl;
public readonly byte[] v_volume; /// <summary># of data cylinders</summary>
/// <summary> number of partitions </summary> public readonly uint dkl_ncyl;
public readonly ushort v_nparts; /// <summary># of alternate cylinders</summary>
/// <summary> partition hdrs, sec 2</summary> public readonly ushort dkl_acyl;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)] /// <summary>cyl offset (for fixed head area)</summary>
public readonly dk_map2[] v_part; public readonly ushort dkl_bcyl;
/// <summary>Alignment</summary> /// <summary># of heads</summary>
public readonly ushort padding; public readonly uint dkl_nhead;
/// <summary> info needed by mboot</summary> /// <summary># of data sectors per track</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public readonly uint dkl_nsect;
public readonly uint[] v_bootinfo; /// <summary>interleave factor</summary>
/// <summary> to verify vtoc sanity</summary> public readonly ushort dkl_intrlv;
public readonly uint v_sanity; /// <summary>skew factor</summary>
/// <summary> free space</summary> public readonly ushort dkl_skew;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] /// <summary>alternates per cyl (SCSI only) </summary>
public readonly uint[] v_reserved; public readonly ushort dkl_apc;
/// <summary> partition timestamp</summary> /// <summary>revolutions per minute</summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)] public readonly ushort dkl_rpm;
public readonly int[] v_timestamp; /// <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)] #endregion
struct dk_vtoc16
{ #region Nested type: dk_label8
/// <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;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_label8 struct dk_label8
@@ -680,44 +640,161 @@ public sealed class SunDisklabel : IPartition
public readonly ushort dkl_cksum; public readonly ushort dkl_cksum;
} }
#endregion
#region Nested type: dk_map
/// <summary>SunOS logical partitions</summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct dk_label16 struct dk_map
{ {
/// <summary>vtoc inclusions from AT&amp;T SVr4</summary> /// <summary>starting cylinder</summary>
public readonly dk_vtoc16 dkl_vtoc; public readonly int dkl_cylno;
/// <summary># of physical cylinders</summary> /// <summary>number of blocks</summary>
public readonly uint dkl_pcyl; public readonly int dkl_nblk;
/// <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;
} }
#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 /> /// <inheritdoc />
public string Name => Localization.UNIX_Name; public string Name => Localization.UNIX_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("9ED7E30B-53BF-4619-87A0-5D2002155617"); public Guid Id => new("9ED7E30B-53BF-4619-87A0-5D2002155617");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -1465,14 +1469,17 @@ public sealed class UNIX : IPartition
parts = RP06; parts = RP06;
break; 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 = ""; parts[i].Scheme = "";
partitions = parts.ToList(); partitions = parts.ToList();
return partitions.Count > 0; 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 uint XPDVERS = 3; /* 1st version of extended pdinfo */
const string MODULE_NAME = "UNIX VTOC plugin"; const string MODULE_NAME = "UNIX VTOC plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.VTOC_Name; public string Name => Localization.VTOC_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("6D35A66F-8D77-426F-A562-D88F6A1F1702"); public Guid Id => new("6D35A66F-8D77-426F-A562-D88F6A1F1702");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -72,14 +76,11 @@ public sealed class VTOC : IPartition
uint magic = 0; uint magic = 0;
ulong pdloc = 0; ulong pdloc = 0;
byte[] pdsector = null; byte[] pdsector = null;
bool magicFound = false; var magicFound = false;
bool absolute = false; var absolute = false;
ErrorNumber errno; ErrorNumber errno;
foreach(ulong i in new ulong[] foreach(ulong i in new ulong[] { 0, 1, 8, 29 }.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
{
0, 1, 8, 29
}.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
{ {
errno = imagePlugin.ReadSector(i + sectorOffset, out pdsector); 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.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.serial = \"{0}\"", StringHandlers.CToString(pd.serial));
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.cyls = {0}", pd.cyls); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.cyls = {0}", pd.cyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.tracks = {0}", pd.tracks); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.tracks = {0}", pd.tracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sectors = {0}", pd.sectors); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sectors = {0}", pd.sectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.bytes = {0}", pd.bytes); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.bytes = {0}", pd.bytes);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.logicalst = {0}", pd.logicalst); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.logicalst = {0}", pd.logicalst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogst = {0}", pd.errlogst); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogst = {0}", pd.errlogst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogsz = {0}", pd.errlogsz); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogsz = {0}", pd.errlogsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgst = {0}", pd.mfgst); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgst = {0}", pd.mfgst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgsz = {0}", pd.mfgsz); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgsz = {0}", pd.mfgsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectst = {0}", pd.defectst); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectst = {0}", pd.defectst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectsz = {0}", pd.defectsz); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectsz = {0}", pd.defectsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relno = {0}", pd.relno); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relno = {0}", pd.relno);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relst = {0}", pd.relst); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relst = {0}", pd.relst);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relsz = {0}", pd.relsz); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relsz = {0}", pd.relsz);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relnext = {0}", pd.relnext); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relnext = {0}", pd.relnext);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcstrt = {0}", pdold.allcstrt); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcstrt = {0}", pdold.allcstrt);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcend = {0}", pdold.allcend); 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_ptr = {0}", pd.vtoc_ptr);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_len = {0}", pd.vtoc_len); 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.vtoc_pad = {0}", pd.vtoc_pad);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_ptr = {0}", pd.alt_ptr); 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.alt_len = {0}", pd.alt_len);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pcyls = {0}", pd.pcyls); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pcyls = {0}", pd.pcyls);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.ptracks = {0}", pd.ptracks); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.ptracks = {0}", pd.ptracks);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.psectors = {0}", pd.psectors); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.psectors = {0}", pd.psectors);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pbytes = {0}", pd.pbytes); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pbytes = {0}", pd.pbytes);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.secovhd = {0}", pd.secovhd); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.secovhd = {0}", pd.secovhd);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.interleave = {0}", pd.interleave); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.interleave = {0}", pd.interleave);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.skew = {0}", pd.skew); 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[0] = {0}", pd.pad[0]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[1] = {0}", pd.pad[1]); 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[2] = {0}", pd.pad[2]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[3] = {0}", pd.pad[3]); 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[4] = {0}", pd.pad[4]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[5] = {0}", pd.pad[5]); 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[6] = {0}", pd.pad[6]);
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[7] = {0}", pd.pad[7]); AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[7] = {0}", pd.pad[7]);
magicFound = false; magicFound = false;
bool useOld = false; var useOld = false;
errno = imagePlugin.ReadSector(pdloc + sectorOffset + 1, out byte[] vtocsector); errno = imagePlugin.ReadSector(pdloc + sectorOffset + 1, out byte[] vtocsector);
if(errno != ErrorNumber.NoError) if(errno != ErrorNumber.NoError)
@@ -184,7 +185,7 @@ public sealed class VTOC : IPartition
{ {
vtoc = Marshal.ByteArrayToStructureBigEndian<vtoc>(vtocsector); 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_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); 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); 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_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); 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); 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_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); 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)); StringHandlers.CToString(vtocOld.v_volume));
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_sectorsz = {0}", vtocOld.v_sectorsz); 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, 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); 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}\"", AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_volume = \"{0}\"",
StringHandlers.CToString(vtoc.v_volume)); 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); 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, 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); (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. // 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 // 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 && if(parts[i].p_tag == pTag.V_BACKUP &&
(ulong)parts[i].p_start == sectorOffset) (ulong)parts[i].p_start == sectorOffset)
{ {
@@ -372,8 +374,10 @@ public sealed class VTOC : IPartition
break; 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) if(parts[i].p_tag != pTag.V_UNUSED)
{ {
var part = new Partition var part = new Partition
@@ -387,7 +391,7 @@ public sealed class VTOC : IPartition
Scheme = Name Scheme = Name
}; };
string info = ""; var info = "";
// Apparently old ones are absolute :? // Apparently old ones are absolute :?
if(!useOld && if(!useOld &&
@@ -420,30 +424,59 @@ public sealed class VTOC : IPartition
if(part.End < imagePlugin.Info.Sectors) if(part.End < imagePlugin.Info.Sectors)
partitions.Add(part); partitions.Add(part);
} }
}
return partitions.Count > 0; return partitions.Count > 0;
} }
#endregion
static string DecodeUnixtag(pTag type, bool isNew) => type switch 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, public pTag p_tag; /*ID tag of partition*/
pTag.V_BOOT => Localization.Boot, public pFlag p_flag; /*permision flags*/
pTag.V_ROOT => "/", public int p_start; /*start sector no of partition*/
pTag.V_SWAP => Localization.swap, public int p_size; /*# of blocks in partition*/
pTag.V_USER => "/usr", }
pTag.V_BACKUP => Localization.Whole_disk,
pTag.V_STAND_OLD => isNew ? "Stand" : Localization.Alternate_sector_space, #endregion
pTag.V_VAR_OLD => isNew ? "/var" : Localization.non_UNIX,
pTag.V_HOME_OLD => isNew ? "/home" : Localization.Alternate_track_space, #region Nested type: PDInfo
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)
};
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -489,6 +522,10 @@ public sealed class VTOC : IPartition
public readonly uint[] pad; /*space for more stuff*/ public readonly uint[] pad; /*space for more stuff*/
} }
#endregion
#region Nested type: PDInfoOld
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
@@ -518,56 +555,26 @@ public sealed class VTOC : IPartition
public readonly uint allcend; /*end of allocatable disk*/ public readonly uint allcend; /*end of allocatable disk*/
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #endregion
// ReSharper disable once InconsistentNaming #region Nested type: pFlag
struct vtocold
[Flags]
[SuppressMessage("ReSharper", "InconsistentNaming")]
enum pFlag : ushort
{ {
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] /* Partition permission flags */
public readonly uint[] v_bootinfo; /*info needed by mboot*/ V_UNMNT = 0x01, /* Unmountable partition */
public readonly uint v_sanity; /*to verify vtoc sanity*/ V_RONLY = 0x10, /* Read only */
public readonly uint v_version; /*layout version*/ V_REMAP = 0x20, /* do alternate sector mapping */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] V_OPEN = 0x100, /* Partition open (for driver use) */
public readonly byte[] v_volume; /*volume name*/ V_VALID = 0x200, /* Partition is valid to use */
public readonly ushort v_sectorsz; /*sector size in bytes*/ V_VOMASK = 0x300 /* mask for open and valid */
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 */
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] #endregion
// ReSharper disable once InconsistentNaming #region Nested type: pTag
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*/
}
[SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "InconsistentNaming")]
enum pTag : ushort enum pTag : ushort
@@ -618,11 +625,53 @@ public sealed class VTOC : IPartition
V_VMPRIVATE = 0x000F V_VMPRIVATE = 0x000F
} }
[Flags, SuppressMessage("ReSharper", "InconsistentNaming")] #endregion
enum pFlag : ushort
#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 */ public readonly uint v_sanity; /*to verify vtoc sanity*/
V_REMAP = 0x20, /* do alternate sector mapping */ V_OPEN = 0x100, /* Partition open (for driver use) */ public readonly uint v_version; /*layout version*/
V_VALID = 0x200, /* Partition is valid to use */ V_VOMASK = 0x300 /* mask for open and valid */ [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 uint XENIX_OFFSET = 977;
const string MODULE_NAME = "XENIX partitions plugin"; const string MODULE_NAME = "XENIX partitions plugin";
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.XENIX_Name; public string Name => Localization.XENIX_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("53BE01DE-E68B-469F-A17F-EC2E4BD61CD9"); public Guid Id => new("53BE01DE-E68B-469F-A17F-EC2E4BD61CD9");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -81,9 +85,9 @@ public sealed class XENIX : IPartition
if(xnxtbl.p_magic != PAMAGIC) if(xnxtbl.p_magic != PAMAGIC)
return false; 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); AaruConsole.DebugWriteLine(MODULE_NAME, "xnxtbl.p[{0}].p_size = {1}", i, xnxtbl.p[i].p_size);
if(xnxtbl.p[i].p_size <= 0) if(xnxtbl.p[i].p_size <= 0)
@@ -91,11 +95,11 @@ public sealed class XENIX : IPartition
var part = new CommonTypes.Partition 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, sectorOffset,
Length = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE) / imagePlugin.Info.SectorSize, Length = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE) / imagePlugin.Info.SectorSize,
Offset = (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) + 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), Size = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE),
Sequence = (ulong)i, Sequence = (ulong)i,
Type = "XENIX", Type = "XENIX",
@@ -109,6 +113,10 @@ public sealed class XENIX : IPartition
return partitions.Count > 0; return partitions.Count > 0;
} }
#endregion
#region Nested type: Partable
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partable readonly struct Partable
{ {
@@ -117,10 +125,16 @@ public sealed class XENIX : IPartition
public readonly Partition[] p; /*partition headers*/ public readonly Partition[] p; /*partition headers*/
} }
#endregion
#region Nested type: Partition
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
readonly struct Partition readonly struct Partition
{ {
public readonly int p_off; /*start 1K block no of partition*/ public readonly int p_off; /*start 1K block no of partition*/
public readonly int p_size; /*# of 1K blocks in 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 long XBOX360_COMPAT_LEN = 0x10000000;
const uint XBOX360_DEVKIT_MAGIC = 0x00020000; const uint XBOX360_DEVKIT_MAGIC = 0x00020000;
#region IPartition Members
/// <inheritdoc /> /// <inheritdoc />
public string Name => Localization.Xbox_Name; public string Name => Localization.Xbox_Name;
/// <inheritdoc /> /// <inheritdoc />
public Guid Id => new("E3F6FB91-D358-4F22-A550-81E92D50EB78"); public Guid Id => new("E3F6FB91-D358-4F22-A550-81E92D50EB78");
/// <inheritdoc /> /// <inheritdoc />
public string Author => Authors.NataliaPortillo; public string Author => Authors.NataliaPortillo;
@@ -146,8 +150,8 @@ public sealed class Xbox : IPartition
var dataPart = new Partition var dataPart = new Partition
{ {
Description = Localization.Data_volume, Description = Localization.Data_volume,
Size = (imagePlugin.Info.Sectors * imagePlugin.Info.SectorSize) - MEMORY_UNIT_DATA_OFF, Size = imagePlugin.Info.Sectors * imagePlugin.Info.SectorSize - MEMORY_UNIT_DATA_OFF,
Length = imagePlugin.Info.Sectors - sysCachePart.Length, Length = imagePlugin.Info.Sectors - sysCachePart.Length,
Sequence = 2, Sequence = 2,
Offset = MEMORY_UNIT_DATA_OFF, Offset = MEMORY_UNIT_DATA_OFF,
Start = sysCachePart.Length, Start = sysCachePart.Length,
@@ -266,6 +270,10 @@ public sealed class Xbox : IPartition
} }
} }
#endregion
#region Nested type: Xbox360DevKitPartitionTable
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Xbox360DevKitPartitionTable struct Xbox360DevKitPartitionTable
{ {
@@ -276,4 +284,6 @@ public sealed class Xbox : IPartition
public readonly uint dashboardOff; public readonly uint dashboardOff;
public readonly uint dashboardLen; public readonly uint dashboardLen;
} }
#endregion
} }