mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 11:14:25 +00:00
[Aaru.Partitions] Reformat and cleanup.
This commit is contained in:
@@ -60,7 +60,7 @@
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Spectre.Console" Version="0.47.0" />
|
||||
<PackageReference Include="Spectre.Console" Version="0.47.0"/>
|
||||
<PackageReference Include="Unclassified.NetRevisionTask" Version="0.4.3" PrivateAssets="all"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib"
|
||||
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:s="clr-namespace:System;assembly=mscorlib"
|
||||
xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xml:space="preserve">
|
||||
<s:Boolean
|
||||
x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=localization/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=localization/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
@@ -57,10 +57,14 @@ public sealed class Acorn : IPartition
|
||||
const uint TYPE_MASK = 15;
|
||||
readonly byte[] _linuxIcsMagic = "LinuxPart"u8.ToArray();
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.Acorn_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("A7C8FEBE-8D00-4933-B9F3-42184C8BA808");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -77,8 +81,10 @@ public sealed class Acorn : IPartition
|
||||
return partitions.Count != 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static void GetFileCorePartitions(IMediaImage imagePlugin, List<Partition> partitions, ulong sectorOffset,
|
||||
ref ulong counter)
|
||||
ref ulong counter)
|
||||
{
|
||||
// RISC OS always checks for the partition on 0. Afaik no emulator chains it.
|
||||
if(sectorOffset != 0)
|
||||
@@ -99,12 +105,12 @@ public sealed class Acorn : IPartition
|
||||
|
||||
AcornBootBlock bootBlock = Marshal.ByteArrayToStructureLittleEndian<AcornBootBlock>(sector);
|
||||
|
||||
int checksum = 0;
|
||||
var checksum = 0;
|
||||
|
||||
for(int i = 0; i < 0x1FF; i++)
|
||||
for(var i = 0; i < 0x1FF; i++)
|
||||
checksum = (checksum & 0xFF) + (checksum >> 8) + sector[i];
|
||||
|
||||
int heads = bootBlock.discRecord.heads + ((bootBlock.discRecord.lowsector >> 6) & 1);
|
||||
int heads = bootBlock.discRecord.heads + (bootBlock.discRecord.lowsector >> 6 & 1);
|
||||
int secCyl = bootBlock.discRecord.spt * heads;
|
||||
int mapSector = bootBlock.startCylinder * secCyl;
|
||||
|
||||
@@ -120,8 +126,8 @@ public sealed class Acorn : IPartition
|
||||
{
|
||||
var part = new Partition
|
||||
{
|
||||
Size = ((ulong)bootBlock.discRecord.disc_size_high * 0x100000000) + bootBlock.discRecord.disc_size,
|
||||
Length = (((ulong)bootBlock.discRecord.disc_size_high * 0x100000000) + bootBlock.discRecord.disc_size) /
|
||||
Size = (ulong)bootBlock.discRecord.disc_size_high * 0x100000000 + bootBlock.discRecord.disc_size,
|
||||
Length = ((ulong)bootBlock.discRecord.disc_size_high * 0x100000000 + bootBlock.discRecord.disc_size) /
|
||||
imagePlugin.Info.SectorSize,
|
||||
Type = Localization.Filecore,
|
||||
Name = StringHandlers.CToString(bootBlock.discRecord.disc_name, Encoding.GetEncoding("iso-8859-1"))
|
||||
@@ -150,11 +156,11 @@ public sealed class Acorn : IPartition
|
||||
Sequence = counter,
|
||||
Scheme = "Filecore/Linux",
|
||||
Type = entry.magic switch
|
||||
{
|
||||
LINUX_MAGIC => Localization.Linux,
|
||||
SWAP_MAGIC => Localization.Linux_swap,
|
||||
_ => Localization.Unknown_partition_type
|
||||
}
|
||||
{
|
||||
LINUX_MAGIC => Localization.Linux,
|
||||
SWAP_MAGIC => Localization.Linux_swap,
|
||||
_ => Localization.Unknown_partition_type
|
||||
}
|
||||
};
|
||||
|
||||
part.Offset = part.Start * (ulong)sector.Length;
|
||||
@@ -175,6 +181,7 @@ public sealed class Acorn : IPartition
|
||||
RiscIxTable table = Marshal.ByteArrayToStructureLittleEndian<RiscIxTable>(map);
|
||||
|
||||
if(table.magic == RISCIX_MAGIC)
|
||||
{
|
||||
foreach(RiscIxEntry entry in table.partitions)
|
||||
{
|
||||
var part = new Partition
|
||||
@@ -196,6 +203,7 @@ public sealed class Acorn : IPartition
|
||||
partitions.Add(part);
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -216,10 +224,10 @@ public sealed class Acorn : IPartition
|
||||
|
||||
uint icsSum = 0x50617274;
|
||||
|
||||
for(int i = 0; i < 508; i++)
|
||||
for(var i = 0; i < 508; i++)
|
||||
icsSum += sector[i];
|
||||
|
||||
uint discCheck = BitConverter.ToUInt32(sector, 508);
|
||||
var discCheck = BitConverter.ToUInt32(sector, 508);
|
||||
|
||||
if(icsSum != discCheck)
|
||||
return;
|
||||
@@ -281,6 +289,23 @@ public sealed class Acorn : IPartition
|
||||
}
|
||||
}
|
||||
|
||||
#region Nested type: AcornBootBlock
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AcornBootBlock
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x1C0)]
|
||||
public readonly byte[] spare;
|
||||
public readonly DiscRecord discRecord;
|
||||
public readonly byte flags;
|
||||
public readonly ushort startCylinder;
|
||||
public readonly byte checksum;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DiscRecord
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
struct DiscRecord
|
||||
{
|
||||
@@ -310,17 +335,44 @@ public sealed class Acorn : IPartition
|
||||
public readonly byte[] reserved;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: IcsEntry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AcornBootBlock
|
||||
struct IcsEntry
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x1C0)]
|
||||
public readonly byte[] spare;
|
||||
public readonly DiscRecord discRecord;
|
||||
public readonly byte flags;
|
||||
public readonly ushort startCylinder;
|
||||
public readonly byte checksum;
|
||||
public readonly uint start;
|
||||
public readonly int size;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: IcsTable
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct IcsTable
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly IcsEntry[] entries;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: LinuxEntry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct LinuxEntry
|
||||
{
|
||||
public readonly uint magic;
|
||||
public readonly uint start;
|
||||
public readonly uint size;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: LinuxTable
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct LinuxTable
|
||||
{
|
||||
@@ -330,22 +382,9 @@ public sealed class Acorn : IPartition
|
||||
public readonly byte[] padding;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct LinuxEntry
|
||||
{
|
||||
public readonly uint magic;
|
||||
public readonly uint start;
|
||||
public readonly uint size;
|
||||
}
|
||||
#endregion
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct RiscIxTable
|
||||
{
|
||||
public readonly uint magic;
|
||||
public readonly uint date;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly RiscIxEntry[] partitions;
|
||||
}
|
||||
#region Nested type: RiscIxEntry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct RiscIxEntry
|
||||
@@ -357,17 +396,18 @@ public sealed class Acorn : IPartition
|
||||
public readonly byte[] name;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct IcsTable
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly IcsEntry[] entries;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Nested type: RiscIxTable
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct IcsEntry
|
||||
struct RiscIxTable
|
||||
{
|
||||
public readonly uint start;
|
||||
public readonly int size;
|
||||
public readonly uint magic;
|
||||
public readonly uint date;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly RiscIxEntry[] partitions;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -61,10 +61,14 @@ public sealed class AppleMap : IPartition
|
||||
const uint HFS_MAGIC_OLD = 0x54465331;
|
||||
const string MODULE_NAME = "Apple Partition Map (APM) Plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.AppleMap_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("36405F8D-4F1A-07F5-209C-223D735D6D22");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -89,37 +93,39 @@ public sealed class AppleMap : IPartition
|
||||
{
|
||||
case 256:
|
||||
{
|
||||
byte[] tmp = new byte[512];
|
||||
var tmp = new byte[512];
|
||||
Array.Copy(ddmSector, 0, tmp, 0, 256);
|
||||
ddmSector = tmp;
|
||||
maxDrivers = 29;
|
||||
|
||||
break;
|
||||
}
|
||||
case < 256: return false;
|
||||
case < 256:
|
||||
return false;
|
||||
}
|
||||
|
||||
AppleDriverDescriptorMap ddm = Marshal.ByteArrayToStructureBigEndian<AppleDriverDescriptorMap>(ddmSector);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbSig = 0x{0:X4}", ddm.sbSig);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbSig = 0x{0:X4}", ddm.sbSig);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlockSize = {0}", ddm.sbBlockSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlocks = {0}", ddm.sbBlocks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevType = {0}", ddm.sbDevType);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevId = {0}", ddm.sbDevId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbBlocks = {0}", ddm.sbBlocks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevType = {0}", ddm.sbDevType);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDevId = {0}", ddm.sbDevId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbData = 0x{0:X8}", ddm.sbData);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbDrvrCount = {0}", ddm.sbDrvrCount);
|
||||
|
||||
uint sequence = 0;
|
||||
|
||||
if(ddm.sbSig == DDM_MAGIC)
|
||||
{
|
||||
if(ddm.sbDrvrCount < maxDrivers)
|
||||
{
|
||||
ddm.sbMap = new AppleDriverEntry[ddm.sbDrvrCount];
|
||||
|
||||
for(int i = 0; i < ddm.sbDrvrCount; i++)
|
||||
for(var i = 0; i < ddm.sbDrvrCount; i++)
|
||||
{
|
||||
byte[] tmp = new byte[8];
|
||||
Array.Copy(ddmSector, 18 + (i * 8), tmp, 0, 8);
|
||||
var tmp = new byte[8];
|
||||
Array.Copy(ddmSector, 18 + i * 8, tmp, 0, 8);
|
||||
ddm.sbMap[i] = Marshal.ByteArrayToStructureBigEndian<AppleDriverEntry>(tmp);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ddm.sbMap[{1}].ddBlock = {0}", ddm.sbMap[i].ddBlock,
|
||||
@@ -152,6 +158,7 @@ public sealed class AppleMap : IPartition
|
||||
sequence++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
errno = imagePlugin.ReadSector(1 + sectorOffset, out byte[] partSector);
|
||||
|
||||
@@ -164,9 +171,9 @@ public sealed class AppleMap : IPartition
|
||||
// This is the easy one, no sector size mixing
|
||||
if(oldMap.pdSig == APM_MAGIC_OLD)
|
||||
{
|
||||
for(int i = 2; i < partSector.Length; i += 12)
|
||||
for(var i = 2; i < partSector.Length; i += 12)
|
||||
{
|
||||
byte[] tmp = new byte[12];
|
||||
var tmp = new byte[12];
|
||||
Array.Copy(partSector, i, tmp, 0, 12);
|
||||
|
||||
AppleMapOldPartitionEntry oldEntry =
|
||||
@@ -217,7 +224,7 @@ public sealed class AppleMap : IPartition
|
||||
// If sector is bigger than 512
|
||||
if(ddmSector.Length > 512)
|
||||
{
|
||||
byte[] tmp = new byte[512];
|
||||
var tmp = new byte[512];
|
||||
Array.Copy(ddmSector, 512, tmp, 0, 512);
|
||||
entry = Marshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp);
|
||||
|
||||
@@ -228,7 +235,7 @@ public sealed class AppleMap : IPartition
|
||||
entrySize = 512;
|
||||
entryCount = entry.entries;
|
||||
skipDdm = 512;
|
||||
sectorsToRead = ((entryCount + 1) * 512 / sectorSize) + 1;
|
||||
sectorsToRead = (entryCount + 1) * 512 / sectorSize + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -267,18 +274,18 @@ public sealed class AppleMap : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return false;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_size = {0}", entrySize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_count = {0}", entryCount);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "skip_ddm = {0}", skipDdm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_size = {0}", entrySize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry_count = {0}", entryCount);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "skip_ddm = {0}", skipDdm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "sectors_to_read = {0}", sectorsToRead);
|
||||
|
||||
byte[] copy = new byte[entries.Length - skipDdm];
|
||||
var copy = new byte[entries.Length - skipDdm];
|
||||
Array.Copy(entries, skipDdm, copy, 0, copy.Length);
|
||||
entries = copy;
|
||||
|
||||
for(int i = 0; i < entryCount; i++)
|
||||
for(var i = 0; i < entryCount; i++)
|
||||
{
|
||||
byte[] tmp = new byte[entrySize];
|
||||
var tmp = new byte[entrySize];
|
||||
Array.Copy(entries, i * entrySize, tmp, 0, entrySize);
|
||||
entry = Marshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp);
|
||||
|
||||
@@ -287,9 +294,9 @@ public sealed class AppleMap : IPartition
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].signature = 0x{1:X4}", i, entry.signature);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].reserved1 = 0x{1:X4}", i, entry.reserved1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].entries = {1}", i, entry.entries);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].start = {1}", i, entry.start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].sectors = {1}", i, entry.sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].entries = {1}", i, entry.entries);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].start = {1}", i, entry.start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].sectors = {1}", i, entry.sectors);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].name = \"{1}\"", i,
|
||||
StringHandlers.CToString(entry.name));
|
||||
@@ -301,7 +308,7 @@ public sealed class AppleMap : IPartition
|
||||
entry.first_data_block);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].data_sectors = {1}", i, entry.data_sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].flags = {1}", i, (AppleMapFlags)entry.flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].flags = {1}", i, (AppleMapFlags)entry.flags);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dpme[{0}].first_boot_block = {1}", i,
|
||||
entry.first_boot_block);
|
||||
@@ -338,8 +345,8 @@ public sealed class AppleMap : IPartition
|
||||
Name = StringHandlers.CToString(entry.name),
|
||||
Offset = entry.start * entrySize,
|
||||
Size = entry.sectors * entrySize,
|
||||
Start = (entry.start * entrySize / sectorSize) + sectorOffset,
|
||||
Length = entry.sectors * entrySize / sectorSize,
|
||||
Start = entry.start * entrySize / sectorSize + sectorOffset,
|
||||
Length = entry.sectors * entrySize / sectorSize,
|
||||
Scheme = Name
|
||||
};
|
||||
|
||||
@@ -398,14 +405,20 @@ public sealed class AppleMap : IPartition
|
||||
sequence++;
|
||||
}
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME,
|
||||
Localization.Not_adding_partition_because_start_0_is_outside_media_size_1,
|
||||
partition.Start, imagePlugin.Info.Sectors - 1);
|
||||
}
|
||||
}
|
||||
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: AppleDriverDescriptorMap
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AppleDriverDescriptorMap
|
||||
{
|
||||
@@ -428,6 +441,10 @@ public sealed class AppleMap : IPartition
|
||||
public AppleDriverEntry[] sbMap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: AppleDriverEntry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AppleDriverEntry
|
||||
{
|
||||
@@ -439,26 +456,9 @@ public sealed class AppleMap : IPartition
|
||||
public readonly ushort ddType;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AppleOldDevicePartitionMap
|
||||
{
|
||||
/// <summary>Signature <see cref="APM_MAGIC_OLD" /></summary>
|
||||
public readonly ushort pdSig;
|
||||
/// <summary>Entries of the driver descriptor</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 42)]
|
||||
public readonly AppleMapOldPartitionEntry[] pdMap;
|
||||
}
|
||||
#endregion
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AppleMapOldPartitionEntry
|
||||
{
|
||||
/// <summary>First sector of the partition</summary>
|
||||
public readonly uint pdStart;
|
||||
/// <summary>Number of sectors of the partition</summary>
|
||||
public readonly uint pdSize;
|
||||
/// <summary>Partition type</summary>
|
||||
public readonly uint pdFSID;
|
||||
}
|
||||
#region Nested type: AppleMapFlags
|
||||
|
||||
[Flags]
|
||||
enum AppleMapFlags : uint
|
||||
@@ -489,6 +489,25 @@ public sealed class AppleMap : IPartition
|
||||
Reserved = 0xBFFFFC00
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: AppleMapOldPartitionEntry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AppleMapOldPartitionEntry
|
||||
{
|
||||
/// <summary>First sector of the partition</summary>
|
||||
public readonly uint pdStart;
|
||||
/// <summary>Number of sectors of the partition</summary>
|
||||
public readonly uint pdSize;
|
||||
/// <summary>Partition type</summary>
|
||||
public readonly uint pdFSID;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: AppleMapPartitionEntry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AppleMapPartitionEntry
|
||||
{
|
||||
@@ -535,4 +554,20 @@ public sealed class AppleMap : IPartition
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public readonly uint[] boot_arguments;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: AppleOldDevicePartitionMap
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct AppleOldDevicePartitionMap
|
||||
{
|
||||
/// <summary>Signature <see cref="APM_MAGIC_OLD" /></summary>
|
||||
public readonly ushort pdSig;
|
||||
/// <summary>Entries of the driver descriptor</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 42)]
|
||||
public readonly AppleMapOldPartitionEntry[] pdMap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -46,11 +46,8 @@ namespace Aaru.Partitions;
|
||||
/// <summary>Implements decoding of Apricot partitions</summary>
|
||||
public sealed class Apricot : IPartition
|
||||
{
|
||||
const string MODULE_NAME = "Apricot partitions plugin";
|
||||
readonly int[] _baudRates =
|
||||
{
|
||||
50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200
|
||||
};
|
||||
const string MODULE_NAME = "Apricot partitions plugin";
|
||||
readonly int[] _baudRates = { 50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200 };
|
||||
readonly string[] _bootTypeCodes =
|
||||
{
|
||||
Localization.Non_bootable, Localization.Apricot_XI_RAM_BIOS, Localization.Generic_ROM_BIOS,
|
||||
@@ -60,14 +57,8 @@ public sealed class Apricot : IPartition
|
||||
{
|
||||
Localization.MF1DD_70_track, "MF1DD", "MF2DD", "Winchester 5M", "Winchester 10M", "Winchester 20M"
|
||||
};
|
||||
readonly int[] _lineModes =
|
||||
{
|
||||
256, 200
|
||||
};
|
||||
readonly int[] _lineWidths =
|
||||
{
|
||||
80, 40
|
||||
};
|
||||
readonly int[] _lineModes = { 256, 200 };
|
||||
readonly int[] _lineWidths = { 80, 40 };
|
||||
readonly string[] _operatingSystemCodes =
|
||||
{
|
||||
Localization.Invalid_operating_system, "MS-DOS", "UCSD Pascal", Localization.CPM, "Concurrent CP/M"
|
||||
@@ -77,19 +68,17 @@ public sealed class Apricot : IPartition
|
||||
Localization.None_parity, Localization.Odd_parity, Localization.Even_parity, Localization.Mark_parity,
|
||||
Localization.Space_parity
|
||||
};
|
||||
readonly string[] _printDevices =
|
||||
{
|
||||
Localization.Parallel_print_device, Localization.Serial_print_device
|
||||
};
|
||||
readonly double[] _stopBits =
|
||||
{
|
||||
1, 1.5, 2
|
||||
};
|
||||
readonly string[] _printDevices = { Localization.Parallel_print_device, Localization.Serial_print_device };
|
||||
readonly double[] _stopBits = { 1, 1.5, 2 };
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.Apricot_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("8CBF5864-7B5A-47A0-8CEB-199C74FA22DE");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -130,31 +119,32 @@ public sealed class Apricot : IPartition
|
||||
: Localization.Unknown_operating_system);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.writeProtected = {0}", label.writeProtected);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyProtected = {0}", label.copyProtected);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyProtected = {0}", label.copyProtected);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootType = {0} ({1})", label.bootType,
|
||||
label.bootType < _bootTypeCodes.Length ? _bootTypeCodes[label.bootType]
|
||||
label.bootType < _bootTypeCodes.Length
|
||||
? _bootTypeCodes[label.bootType]
|
||||
: Localization.Unknown_boot_type);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitionCount = {0}", label.partitionCount);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.winchester = {0}", label.winchester);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.sectorSize = {0}", label.sectorSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spt = {0}", label.spt);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.cylinders = {0}", label.cylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.heads = {0}", label.heads);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.interleave = {0}", label.interleave);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.skew = {0}", label.skew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootLocation = {0}", label.bootLocation);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootSize = {0}", label.bootSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitionCount = {0}", label.partitionCount);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.winchester = {0}", label.winchester);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.sectorSize = {0}", label.sectorSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spt = {0}", label.spt);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.cylinders = {0}", label.cylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.heads = {0}", label.heads);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.interleave = {0}", label.interleave);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.skew = {0}", label.skew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootLocation = {0}", label.bootLocation);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootSize = {0}", label.bootSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootAddress = 0x{0:X8}", label.bootAddress);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bootOffset:label.bootSegment = {0:X4}:{1:X4}",
|
||||
label.bootOffset, label.bootSegment);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.firstDataBlock = {0}", label.firstDataBlock);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.generation = {0}", label.generation);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyCount = {0}", label.copyCount);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.maxCopies = {0}", label.maxCopies);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.generation = {0}", label.generation);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyCount = {0}", label.copyCount);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.maxCopies = {0}", label.maxCopies);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.serialNumber = \"{0}\"",
|
||||
StringHandlers.CToString(label.serialNumber));
|
||||
@@ -165,18 +155,19 @@ public sealed class Apricot : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.copyright = \"{0}\"",
|
||||
StringHandlers.CToString(label.copyright));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.bps = {0}", label.mainBPB.bps);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spc = {0}", label.mainBPB.spc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.bps = {0}", label.mainBPB.bps);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spc = {0}", label.mainBPB.spc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.rsectors = {0}", label.mainBPB.rsectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.fats_no = {0}", label.mainBPB.fats_no);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.fats_no = {0}", label.mainBPB.fats_no);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.root_ent = {0}", label.mainBPB.root_ent);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.sectors = {0}", label.mainBPB.sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.media = {0}", label.mainBPB.media);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spfat = {0}", label.mainBPB.spfat);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.sectors = {0}", label.mainBPB.sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.media = {0}", label.mainBPB.media);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.spfat = {0}", label.mainBPB.spfat);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.diskType = {0} ({1})", label.mainBPB.diskType,
|
||||
label.mainBPB.diskType < _diskTypeCodes.Length
|
||||
? _diskTypeCodes[label.mainBPB.diskType] : Localization.Unknown_disk_type);
|
||||
? _diskTypeCodes[label.mainBPB.diskType]
|
||||
: Localization.Unknown_disk_type);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.mainBPB.startSector = {0}", label.mainBPB.startSector);
|
||||
|
||||
@@ -188,23 +179,24 @@ public sealed class Apricot : IPartition
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosMajorVersion = {0}", label.biosMajorVersion);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosMinorVersion = {0}", label.biosMinorVersion);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.diagnosticsFlag = {0}", label.diagnosticsFlag);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.diagnosticsFlag = {0}", label.diagnosticsFlag);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.prnDevice = {0} ({1})", label.prnDevice,
|
||||
label.prnDevice < _printDevices.Length ? _printDevices[label.prnDevice]
|
||||
label.prnDevice < _printDevices.Length
|
||||
? _printDevices[label.prnDevice]
|
||||
: Localization.Unknown_print_device);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bellVolume = {0}", label.bellVolume);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableCache = {0}", label.enableCache);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableGraphics = {0}", label.enableGraphics);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosLength = {0}", label.dosLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontLength = {0}", label.fontLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardLength = {0}", label.keyboardLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosStart = {0}", label.dosStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontStart = {0}", label.fontStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardStart = {0}", label.keyboardStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardVolume = {0}", label.keyboardVolume);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeat = {0}", label.autorepeat);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.bellVolume = {0}", label.bellVolume);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableCache = {0}", label.enableCache);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.enableGraphics = {0}", label.enableGraphics);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosLength = {0}", label.dosLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontLength = {0}", label.fontLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardLength = {0}", label.keyboardLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dosStart = {0}", label.dosStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.fontStart = {0}", label.fontStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardStart = {0}", label.keyboardStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.keyboardVolume = {0}", label.keyboardVolume);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeat = {0}", label.autorepeat);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeatLeadIn = {0}", label.autorepeatLeadIn);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.autorepeatInterval = {0}", label.autorepeatInterval);
|
||||
@@ -240,18 +232,19 @@ public sealed class Apricot : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parityCheck = {0}", label.parityCheck);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parityType = {0} ({1})", label.parityType,
|
||||
label.parityType < _parityTypes.Length ? _parityTypes[label.parityType]
|
||||
label.parityType < _parityTypes.Length
|
||||
? _parityTypes[label.parityType]
|
||||
: Localization.Unknown_parity_type);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.txXonXoff = {0}", label.txXonXoff);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoff = {0}", label.rxXonXoff);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xonCharacter = {0}", label.xonCharacter);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xoffCharacter = {0}", label.xoffCharacter);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.txXonXoff = {0}", label.txXonXoff);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoff = {0}", label.rxXonXoff);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xonCharacter = {0}", label.xonCharacter);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.xoffCharacter = {0}", label.xoffCharacter);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.rxXonXoffBuffer = {0}", label.rxXonXoffBuffer);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dtrDsr = {0}", label.dtrDsr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.ctsRts = {0}", label.ctsRts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterCr = {0}", label.nullsAfterCr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterFF = {0}", label.nullsAfterFF);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dtrDsr = {0}", label.dtrDsr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.ctsRts = {0}", label.ctsRts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterCr = {0}", label.nullsAfterCr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.nullsAfterFF = {0}", label.nullsAfterFF);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCRSerial = {0}", label.lfAfterCRSerial);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportSerial = {0}",
|
||||
@@ -261,9 +254,9 @@ public sealed class Apricot : IPartition
|
||||
ArrayHelpers.ArrayIsNullOrEmpty(label.spareSerial));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.lfAfterCrParallel = {0}", label.lfAfterCrParallel);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.selectLine = {0}", label.selectLine);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.paperEmpty = {0}", label.paperEmpty);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.faultLine = {0}", label.faultLine);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.selectLine = {0}", label.selectLine);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.paperEmpty = {0}", label.paperEmpty);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.faultLine = {0}", label.faultLine);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.biosErrorReportParallel = {0}",
|
||||
label.biosErrorReportParallel);
|
||||
@@ -274,16 +267,16 @@ public sealed class Apricot : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareWinchester is null? = {0}",
|
||||
ArrayHelpers.ArrayIsNullOrEmpty(label.spareWinchester));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parkingEnabled = {0}", label.parkingEnabled);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.parkingEnabled = {0}", label.parkingEnabled);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.formatProtection = {0}", label.formatProtection);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.spareRamDisk is null? = {0}",
|
||||
ArrayHelpers.ArrayIsNullOrEmpty(label.spareRamDisk));
|
||||
|
||||
for(int i = 0; i < 32; i++)
|
||||
for(var i = 0; i < 32; i++)
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.badBlocks[{1}] = {0}", label.badBlocks[i], i);
|
||||
|
||||
for(int i = 0; i < 8; i++)
|
||||
for(var i = 0; i < 8; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.partitions[{1}].bps = {0}", label.partitions[i].bps,
|
||||
i);
|
||||
@@ -349,6 +342,10 @@ public sealed class Apricot : IPartition
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Label
|
||||
|
||||
/// <summary>Apricot Label.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Label
|
||||
@@ -560,6 +557,10 @@ public sealed class Apricot : IPartition
|
||||
public readonly bool cpmDoubleSided;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: ParameterBlock
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct ParameterBlock
|
||||
{
|
||||
@@ -584,4 +585,6 @@ public sealed class Apricot : IPartition
|
||||
/// <summary>Volume starting sector</summary>
|
||||
public readonly ushort startSector;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -61,10 +61,14 @@ public sealed class AtariPartitions : IPartition
|
||||
const uint TYPE_MINIX2 = 0x004D4E58;
|
||||
const string MODULE_NAME = "Atari partitions plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.AtariPartitions_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("d1dd0f24-ec39-4c4d-9072-be31919a3b5e");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -89,22 +93,22 @@ public sealed class AtariPartitions : IPartition
|
||||
|
||||
Array.Copy(sector, 0, table.Boot, 0, 342);
|
||||
|
||||
for(int i = 0; i < 8; i++)
|
||||
for(var i = 0; i < 8; i++)
|
||||
{
|
||||
table.IcdEntries[i].Type = BigEndianBitConverter.ToUInt32(sector, 342 + (i * 12) + 0);
|
||||
table.IcdEntries[i].Start = BigEndianBitConverter.ToUInt32(sector, 342 + (i * 12) + 4);
|
||||
table.IcdEntries[i].Length = BigEndianBitConverter.ToUInt32(sector, 342 + (i * 12) + 8);
|
||||
table.IcdEntries[i].Type = BigEndianBitConverter.ToUInt32(sector, 342 + i * 12 + 0);
|
||||
table.IcdEntries[i].Start = BigEndianBitConverter.ToUInt32(sector, 342 + i * 12 + 4);
|
||||
table.IcdEntries[i].Length = BigEndianBitConverter.ToUInt32(sector, 342 + i * 12 + 8);
|
||||
}
|
||||
|
||||
Array.Copy(sector, 438, table.Unused, 0, 12);
|
||||
|
||||
table.Size = BigEndianBitConverter.ToUInt32(sector, 450);
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
for(var i = 0; i < 4; i++)
|
||||
{
|
||||
table.Entries[i].Type = BigEndianBitConverter.ToUInt32(sector, 454 + (i * 12) + 0);
|
||||
table.Entries[i].Start = BigEndianBitConverter.ToUInt32(sector, 454 + (i * 12) + 4);
|
||||
table.Entries[i].Length = BigEndianBitConverter.ToUInt32(sector, 454 + (i * 12) + 8);
|
||||
table.Entries[i].Type = BigEndianBitConverter.ToUInt32(sector, 454 + i * 12 + 0);
|
||||
table.Entries[i].Start = BigEndianBitConverter.ToUInt32(sector, 454 + i * 12 + 4);
|
||||
table.Entries[i].Length = BigEndianBitConverter.ToUInt32(sector, 454 + i * 12 + 8);
|
||||
}
|
||||
|
||||
table.BadStart = BigEndianBitConverter.ToUInt32(sector, 502);
|
||||
@@ -115,7 +119,7 @@ public sealed class AtariPartitions : IPartition
|
||||
sha1Ctx.Update(table.Boot);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Boot_code_SHA1_0, sha1Ctx.End());
|
||||
|
||||
for(int i = 0; i < 8; i++)
|
||||
for(var i = 0; i < 8; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Markup.Escape("table.icdEntries[{0}].flag = 0x{1:X2}"),
|
||||
i, (table.IcdEntries[i].Type & 0xFF000000) >> 24);
|
||||
@@ -132,7 +136,7 @@ public sealed class AtariPartitions : IPartition
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size = {0}", table.Size);
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
for(var i = 0; i < 4; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Markup.Escape("table.entries[{0}].flag = 0x{1:X2}"), i,
|
||||
(table.Entries[i].Type & 0xFF000000) >> 24);
|
||||
@@ -147,14 +151,14 @@ public sealed class AtariPartitions : IPartition
|
||||
table.Entries[i].Length);
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badStart = {0}", table.BadStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badLength = {0}", table.BadLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badStart = {0}", table.BadStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.badLength = {0}", table.BadLength);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.checksum = 0x{0:X4}", table.Checksum);
|
||||
|
||||
bool validTable = false;
|
||||
var validTable = false;
|
||||
ulong partitionSequence = 0;
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
for(var i = 0; i < 4; i++)
|
||||
{
|
||||
uint type = table.Entries[i].Type & 0x00FFFFFF;
|
||||
|
||||
@@ -176,15 +180,17 @@ public sealed class AtariPartitions : IPartition
|
||||
if(table.Entries[i].Start <= imagePlugin.Info.Sectors)
|
||||
{
|
||||
if(table.Entries[i].Start + table.Entries[i].Length > imagePlugin.Info.Sectors)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME,
|
||||
Localization.WARNING_End_of_partition_goes_beyond_device_size);
|
||||
}
|
||||
|
||||
ulong sectorSize = imagePlugin.Info.SectorSize;
|
||||
|
||||
if(sectorSize is 2448 or 2352)
|
||||
sectorSize = 2048;
|
||||
|
||||
byte[] partType = new byte[3];
|
||||
var partType = new byte[3];
|
||||
partType[0] = (byte)((type & 0xFF0000) >> 16);
|
||||
partType[1] = (byte)((type & 0x00FF00) >> 8);
|
||||
partType[2] = (byte)(type & 0x0000FF);
|
||||
@@ -266,19 +272,19 @@ public sealed class AtariPartitions : IPartition
|
||||
Entries = new AtariEntry[4]
|
||||
};
|
||||
|
||||
for(int j = 0; j < 4; j++)
|
||||
for(var j = 0; j < 4; j++)
|
||||
{
|
||||
extendedTable.Entries[j].Type =
|
||||
BigEndianBitConverter.ToUInt32(extendedSector, 454 + (j * 12) + 0);
|
||||
BigEndianBitConverter.ToUInt32(extendedSector, 454 + j * 12 + 0);
|
||||
|
||||
extendedTable.Entries[j].Start =
|
||||
BigEndianBitConverter.ToUInt32(extendedSector, 454 + (j * 12) + 4);
|
||||
BigEndianBitConverter.ToUInt32(extendedSector, 454 + j * 12 + 4);
|
||||
|
||||
extendedTable.Entries[j].Length =
|
||||
BigEndianBitConverter.ToUInt32(extendedSector, 454 + (j * 12) + 8);
|
||||
BigEndianBitConverter.ToUInt32(extendedSector, 454 + j * 12 + 8);
|
||||
}
|
||||
|
||||
for(int j = 0; j < 4; j++)
|
||||
for(var j = 0; j < 4; j++)
|
||||
{
|
||||
uint extendedType = extendedTable.Entries[j].Type & 0x00FFFFFF;
|
||||
|
||||
@@ -301,15 +307,17 @@ public sealed class AtariPartitions : IPartition
|
||||
continue;
|
||||
|
||||
if(extendedTable.Entries[j].Start + extendedTable.Entries[j].Length > imagePlugin.Info.Sectors)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME,
|
||||
Localization.WARNING_End_of_partition_goes_beyond_device_size);
|
||||
}
|
||||
|
||||
ulong sectorSize = imagePlugin.Info.SectorSize;
|
||||
|
||||
if(sectorSize is 2448 or 2352)
|
||||
sectorSize = 2048;
|
||||
|
||||
byte[] partType = new byte[3];
|
||||
var partType = new byte[3];
|
||||
partType[0] = (byte)((extendedType & 0xFF0000) >> 16);
|
||||
partType[1] = (byte)((extendedType & 0x00FF00) >> 8);
|
||||
partType[2] = (byte)(extendedType & 0x0000FF);
|
||||
@@ -386,7 +394,7 @@ public sealed class AtariPartitions : IPartition
|
||||
if(!validTable)
|
||||
return partitions.Count > 0;
|
||||
|
||||
for(int i = 0; i < 8; i++)
|
||||
for(var i = 0; i < 8; i++)
|
||||
{
|
||||
uint type = table.IcdEntries[i].Type & 0x00FFFFFF;
|
||||
|
||||
@@ -407,15 +415,17 @@ public sealed class AtariPartitions : IPartition
|
||||
continue;
|
||||
|
||||
if(table.IcdEntries[i].Start + table.IcdEntries[i].Length > imagePlugin.Info.Sectors)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME,
|
||||
Localization.WARNING_End_of_partition_goes_beyond_device_size);
|
||||
}
|
||||
|
||||
ulong sectorSize = imagePlugin.Info.SectorSize;
|
||||
|
||||
if(sectorSize is 2448 or 2352)
|
||||
sectorSize = 2048;
|
||||
|
||||
byte[] partType = new byte[3];
|
||||
var partType = new byte[3];
|
||||
partType[0] = (byte)((type & 0xFF0000) >> 16);
|
||||
partType[1] = (byte)((type & 0x00FF00) >> 8);
|
||||
partType[2] = (byte)(type & 0x0000FF);
|
||||
@@ -488,6 +498,10 @@ public sealed class AtariPartitions : IPartition
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: AtariEntry
|
||||
|
||||
/// <summary>Atari partition entry</summary>
|
||||
struct AtariEntry
|
||||
{
|
||||
@@ -499,6 +513,10 @@ public sealed class AtariPartitions : IPartition
|
||||
public uint Length;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: AtariTable
|
||||
|
||||
struct AtariTable
|
||||
{
|
||||
/// <summary>Boot code for 342 bytes</summary>
|
||||
@@ -518,4 +536,6 @@ public sealed class AtariPartitions : IPartition
|
||||
/// <summary>Checksum for bootable disks</summary>
|
||||
public ushort Checksum;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -55,20 +55,18 @@ public sealed class BSD : IPartition
|
||||
const uint MAX_LABEL_SIZE = 500;
|
||||
const string MODULE_NAME = "BSD disklabel plugin";
|
||||
/// <summary>Known sector locations for BSD disklabel</summary>
|
||||
readonly ulong[] _labelLocations =
|
||||
{
|
||||
0, 1, 2, 9
|
||||
};
|
||||
readonly ulong[] _labelLocations = { 0, 1, 2, 9 };
|
||||
/// <summary>Known byte offsets for BSD disklabel</summary>
|
||||
readonly uint[] _labelOffsets =
|
||||
{
|
||||
0, 9, 64, 128, 516
|
||||
};
|
||||
readonly uint[] _labelOffsets = { 0, 9, 64, 128, 516 };
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.BSD_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -81,8 +79,8 @@ public sealed class BSD : IPartition
|
||||
if((MAX_LABEL_SIZE + _labelOffsets.Last()) % imagePlugin.Info.SectorSize > 0)
|
||||
run++;
|
||||
|
||||
var dl = new DiskLabel();
|
||||
bool found = false;
|
||||
var dl = new DiskLabel();
|
||||
var found = false;
|
||||
|
||||
foreach(ulong location in _labelLocations)
|
||||
{
|
||||
@@ -96,7 +94,7 @@ public sealed class BSD : IPartition
|
||||
|
||||
foreach(uint offset in _labelOffsets)
|
||||
{
|
||||
byte[] sector = new byte[MAX_LABEL_SIZE];
|
||||
var sector = new byte[MAX_LABEL_SIZE];
|
||||
|
||||
if(offset + MAX_LABEL_SIZE > tmp.Length)
|
||||
break;
|
||||
@@ -128,46 +126,46 @@ public sealed class BSD : IPartition
|
||||
if(dl is { d_magic: DISK_CIGAM, d_magic2: DISK_CIGAM })
|
||||
dl = SwapDiskLabel(dl);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_type = {0}", dl.d_type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_subtype = {0}", dl.d_subtype);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_typename = {0}", StringHandlers.CToString(dl.d_typename));
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_packname = {0}", StringHandlers.CToString(dl.d_packname));
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secsize = {0}", dl.d_secsize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_nsectors = {0}", dl.d_nsectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ntracks = {0}", dl.d_ntracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ncylinders = {0}", dl.d_ncylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secpercyl = {0}", dl.d_secpercyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secperunit = {0}", dl.d_secperunit);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_type = {0}", dl.d_type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_subtype = {0}", dl.d_subtype);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_typename = {0}", StringHandlers.CToString(dl.d_typename));
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_packname = {0}", StringHandlers.CToString(dl.d_packname));
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secsize = {0}", dl.d_secsize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_nsectors = {0}", dl.d_nsectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ntracks = {0}", dl.d_ntracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_ncylinders = {0}", dl.d_ncylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secpercyl = {0}", dl.d_secpercyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_secperunit = {0}", dl.d_secperunit);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sparespertrack = {0}", dl.d_sparespertrack);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sparespercyl = {0}", dl.d_sparespercyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_acylinders = {0}", dl.d_acylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_rpm = {0}", dl.d_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_interleave = {0}", dl.d_interleave);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trackskew = {0}", dl.d_trackskew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_cylskeew = {0}", dl.d_cylskeew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_headswitch = {0}", dl.d_headswitch);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trkseek = {0}", dl.d_trkseek);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_flags = {0}", dl.d_flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[0] = {0}", dl.d_drivedata[0]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[1] = {0}", dl.d_drivedata[1]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[2] = {0}", dl.d_drivedata[2]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[3] = {0}", dl.d_drivedata[3]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[4] = {0}", dl.d_drivedata[4]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[0] = {0}", dl.d_spare[0]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[1] = {0}", dl.d_spare[1]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[2] = {0}", dl.d_spare[2]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[3] = {0}", dl.d_spare[3]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[4] = {0}", dl.d_spare[4]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_magic2 = 0x{0:X8}", dl.d_magic2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_checksum = 0x{0:X8}", dl.d_checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_npartitions = {0}", dl.d_npartitions);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_bbsize = {0}", dl.d_bbsize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sbsize = {0}", dl.d_sbsize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sparespercyl = {0}", dl.d_sparespercyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_acylinders = {0}", dl.d_acylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_rpm = {0}", dl.d_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_interleave = {0}", dl.d_interleave);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trackskew = {0}", dl.d_trackskew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_cylskeew = {0}", dl.d_cylskeew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_headswitch = {0}", dl.d_headswitch);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_trkseek = {0}", dl.d_trkseek);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_flags = {0}", dl.d_flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[0] = {0}", dl.d_drivedata[0]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[1] = {0}", dl.d_drivedata[1]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[2] = {0}", dl.d_drivedata[2]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[3] = {0}", dl.d_drivedata[3]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_drivedata[4] = {0}", dl.d_drivedata[4]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[0] = {0}", dl.d_spare[0]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[1] = {0}", dl.d_spare[1]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[2] = {0}", dl.d_spare[2]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[3] = {0}", dl.d_spare[3]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_spare[4] = {0}", dl.d_spare[4]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_magic2 = 0x{0:X8}", dl.d_magic2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_checksum = 0x{0:X8}", dl.d_checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_npartitions = {0}", dl.d_npartitions);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_bbsize = {0}", dl.d_bbsize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_sbsize = {0}", dl.d_sbsize);
|
||||
|
||||
ulong counter = 0;
|
||||
bool addSectorOffset = false;
|
||||
var addSectorOffset = false;
|
||||
|
||||
for(int i = 0; i < dl.d_npartitions && i < 22; i++)
|
||||
for(var i = 0; i < dl.d_npartitions && i < 22; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dl.d_partitions[i].p_offset = {0}", dl.d_partitions[i].p_offset);
|
||||
|
||||
@@ -210,40 +208,71 @@ public sealed class BSD : IPartition
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
internal static string FSTypeToString(fsType typ)
|
||||
{
|
||||
switch(typ)
|
||||
{
|
||||
case fsType.Unused: return Localization.Unused_entry;
|
||||
case fsType.Swap: return Localization.Swap_partition;
|
||||
case fsType.V6: return Localization.UNIX_6th_Edition;
|
||||
case fsType.V7: return Localization.UNIX_7th_Edition;
|
||||
case fsType.SystemV: return Localization.UNIX_System_V;
|
||||
case fsType.V7_1K: return Localization.UNIX_7th_Edition_with_1K_blocks;
|
||||
case fsType.V8: return Localization.UNIX_8th_Edition_with_4K_blocks;
|
||||
case fsType.BSDFFS: return Localization._4_2_BSD_Fast_File_System;
|
||||
case fsType.BSDLFS: return Localization._4_4_LFS;
|
||||
case fsType.HPFS: return Localization.HPFS;
|
||||
case fsType.ISO9660: return Localization.ISO9660;
|
||||
case fsType.Unused:
|
||||
return Localization.Unused_entry;
|
||||
case fsType.Swap:
|
||||
return Localization.Swap_partition;
|
||||
case fsType.V6:
|
||||
return Localization.UNIX_6th_Edition;
|
||||
case fsType.V7:
|
||||
return Localization.UNIX_7th_Edition;
|
||||
case fsType.SystemV:
|
||||
return Localization.UNIX_System_V;
|
||||
case fsType.V7_1K:
|
||||
return Localization.UNIX_7th_Edition_with_1K_blocks;
|
||||
case fsType.V8:
|
||||
return Localization.UNIX_8th_Edition_with_4K_blocks;
|
||||
case fsType.BSDFFS:
|
||||
return Localization._4_2_BSD_Fast_File_System;
|
||||
case fsType.BSDLFS:
|
||||
return Localization._4_4_LFS;
|
||||
case fsType.HPFS:
|
||||
return Localization.HPFS;
|
||||
case fsType.ISO9660:
|
||||
return Localization.ISO9660;
|
||||
case fsType.Boot:
|
||||
case fsType.SysVBoot: return Localization.Boot;
|
||||
case fsType.AFFS: return Localization.Amiga_FFS;
|
||||
case fsType.HFS: return Localization.Apple_HFS;
|
||||
case fsType.ADVfs: return Localization.Digital_Advanced_File_System;
|
||||
case fsType.LSMpublic: return Localization.Digital_LSM_Public_Region;
|
||||
case fsType.LSMprivate: return Localization.Digital_LSM_Private_Region;
|
||||
case fsType.LSMsimple: return Localization.Digital_LSM_Simple_Disk;
|
||||
case fsType.CCD: return Localization.Concatenated_disk;
|
||||
case fsType.JFS2: return Localization.IBM_JFS2;
|
||||
case fsType.HAMMER: return Localization.Hammer;
|
||||
case fsType.HAMMER2: return Localization.Hammer2;
|
||||
case fsType.UDF: return Localization.UDF;
|
||||
case fsType.EFS: return Localization.EFS;
|
||||
case fsType.ZFS: return Localization.ZFS;
|
||||
case fsType.NANDFS: return Localization.FreeBSD_nandfs;
|
||||
case fsType.MSDOS: return Localization.FAT;
|
||||
case fsType.Other: return Localization.Other_or_unknown;
|
||||
default: return Localization.Unknown_partition_type;
|
||||
case fsType.SysVBoot:
|
||||
return Localization.Boot;
|
||||
case fsType.AFFS:
|
||||
return Localization.Amiga_FFS;
|
||||
case fsType.HFS:
|
||||
return Localization.Apple_HFS;
|
||||
case fsType.ADVfs:
|
||||
return Localization.Digital_Advanced_File_System;
|
||||
case fsType.LSMpublic:
|
||||
return Localization.Digital_LSM_Public_Region;
|
||||
case fsType.LSMprivate:
|
||||
return Localization.Digital_LSM_Private_Region;
|
||||
case fsType.LSMsimple:
|
||||
return Localization.Digital_LSM_Simple_Disk;
|
||||
case fsType.CCD:
|
||||
return Localization.Concatenated_disk;
|
||||
case fsType.JFS2:
|
||||
return Localization.IBM_JFS2;
|
||||
case fsType.HAMMER:
|
||||
return Localization.Hammer;
|
||||
case fsType.HAMMER2:
|
||||
return Localization.Hammer2;
|
||||
case fsType.UDF:
|
||||
return Localization.UDF;
|
||||
case fsType.EFS:
|
||||
return Localization.EFS;
|
||||
case fsType.ZFS:
|
||||
return Localization.ZFS;
|
||||
case fsType.NANDFS:
|
||||
return Localization.FreeBSD_nandfs;
|
||||
case fsType.MSDOS:
|
||||
return Localization.FAT;
|
||||
case fsType.Other:
|
||||
return Localization.Other_or_unknown;
|
||||
default:
|
||||
return Localization.Unknown_partition_type;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,18 +280,142 @@ public sealed class BSD : IPartition
|
||||
{
|
||||
dl = (DiskLabel)Marshal.SwapStructureMembersEndian(dl);
|
||||
|
||||
for(int i = 0; i < dl.d_drivedata.Length; i++)
|
||||
for(var i = 0; i < dl.d_drivedata.Length; i++)
|
||||
dl.d_drivedata[i] = Swapping.Swap(dl.d_drivedata[i]);
|
||||
|
||||
for(int i = 0; i < dl.d_spare.Length; i++)
|
||||
for(var i = 0; i < dl.d_spare.Length; i++)
|
||||
dl.d_spare[i] = Swapping.Swap(dl.d_spare[i]);
|
||||
|
||||
for(int i = 0; i < dl.d_partitions.Length; i++)
|
||||
for(var i = 0; i < dl.d_partitions.Length; i++)
|
||||
dl.d_partitions[i] = (BSDPartition)Marshal.SwapStructureMembersEndian(dl.d_partitions[i]);
|
||||
|
||||
return dl;
|
||||
}
|
||||
|
||||
#region Nested type: BSDPartition
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct BSDPartition
|
||||
{
|
||||
/// <summary>Sectors in partition</summary>
|
||||
public readonly uint p_size;
|
||||
/// <summary>Starting sector</summary>
|
||||
public readonly uint p_offset;
|
||||
/// <summary>Fragment size</summary>
|
||||
public readonly uint p_fsize;
|
||||
/// <summary>Filesystem type, <see cref="fsType" /></summary>
|
||||
public readonly fsType p_fstype;
|
||||
/// <summary>Fragment size</summary>
|
||||
public readonly byte p_frag;
|
||||
/// <summary>Cylinder per group</summary>
|
||||
public readonly ushort p_cpg;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: dFlags
|
||||
|
||||
/// <summary>Drive flags</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[Flags]
|
||||
enum dFlags : uint
|
||||
{
|
||||
/// <summary>Removable media</summary>
|
||||
Removable = 0x01,
|
||||
/// <summary>Drive supports ECC</summary>
|
||||
ECC = 0x02,
|
||||
/// <summary>Drive supports bad sector forwarding</summary>
|
||||
BadSectorForward = 0x04,
|
||||
/// <summary>Disk emulator</summary>
|
||||
RAMDisk = 0x08,
|
||||
/// <summary>Can do back to back transfer</summary>
|
||||
Chain = 0x10,
|
||||
/// <summary>Dynamic geometry device</summary>
|
||||
DynamicGeometry = 0x20
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DiskLabel
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct DiskLabel
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="BSD.DISK_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly uint d_magic;
|
||||
/// <summary>
|
||||
/// <see cref="dType" />
|
||||
/// </summary>
|
||||
public readonly dType d_type;
|
||||
/// <summary>Disk subtype</summary>
|
||||
public readonly ushort d_subtype;
|
||||
/// <summary>Type name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly byte[] d_typename;
|
||||
/// <summary>Pack identifier</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly byte[] d_packname;
|
||||
/// <summary>Bytes per sector</summary>
|
||||
public readonly uint d_secsize;
|
||||
/// <summary>Sectors per track</summary>
|
||||
public readonly uint d_nsectors;
|
||||
/// <summary>Tracks per cylinder</summary>
|
||||
public readonly uint d_ntracks;
|
||||
/// <summary>Cylinders per unit</summary>
|
||||
public readonly uint d_ncylinders;
|
||||
/// <summary>Sectors per cylinder</summary>
|
||||
public readonly uint d_secpercyl;
|
||||
/// <summary>Sectors per unit</summary>
|
||||
public readonly uint d_secperunit;
|
||||
/// <summary>Spare sectors per track</summary>
|
||||
public readonly ushort d_sparespertrack;
|
||||
/// <summary>Spare sectors per cylinder</summary>
|
||||
public readonly ushort d_sparespercyl;
|
||||
/// <summary>Alternate cylinders</summary>
|
||||
public readonly uint d_acylinders;
|
||||
/// <summary>Rotational speed</summary>
|
||||
public readonly ushort d_rpm;
|
||||
/// <summary>Hardware sector interleave</summary>
|
||||
public readonly ushort d_interleave;
|
||||
/// <summary>Sector 0 skew per track</summary>
|
||||
public readonly ushort d_trackskew;
|
||||
/// <summary>Sector 0 sker per cylinder</summary>
|
||||
public readonly ushort d_cylskeew;
|
||||
/// <summary>Head switch time in microseconds</summary>
|
||||
public readonly uint d_headswitch;
|
||||
/// <summary>Track to track seek in microseconds</summary>
|
||||
public readonly uint d_trkseek;
|
||||
/// <summary>
|
||||
/// <see cref="dFlags" />
|
||||
/// </summary>
|
||||
public readonly dFlags d_flags;
|
||||
/// <summary>Drive-specific information</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
|
||||
public readonly uint[] d_drivedata;
|
||||
/// <summary>Reserved</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
|
||||
public readonly uint[] d_spare;
|
||||
/// <summary><see cref="BSD.DISK_MAGIC" /> again</summary>
|
||||
public readonly uint d_magic2;
|
||||
/// <summary>XOR of data</summary>
|
||||
public readonly ushort d_checksum;
|
||||
/// <summary>How many partitions</summary>
|
||||
public readonly ushort d_npartitions;
|
||||
/// <summary>Size of boot area in bytes</summary>
|
||||
public readonly uint d_bbsize;
|
||||
/// <summary>Maximum size of superblock in bytes</summary>
|
||||
public readonly uint d_sbsize;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
|
||||
public readonly BSDPartition[] d_partitions;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: dType
|
||||
|
||||
/// <summary>Drive type</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
enum dType : ushort
|
||||
@@ -313,6 +466,10 @@ public sealed class BSD : IPartition
|
||||
MD = 22
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: fsType
|
||||
|
||||
/// <summary>Filesystem type</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
internal enum fsType : byte
|
||||
@@ -393,112 +550,5 @@ public sealed class BSD : IPartition
|
||||
NANDFS = 30
|
||||
}
|
||||
|
||||
/// <summary>Drive flags</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), Flags]
|
||||
enum dFlags : uint
|
||||
{
|
||||
/// <summary>Removable media</summary>
|
||||
Removable = 0x01,
|
||||
/// <summary>Drive supports ECC</summary>
|
||||
ECC = 0x02,
|
||||
/// <summary>Drive supports bad sector forwarding</summary>
|
||||
BadSectorForward = 0x04,
|
||||
/// <summary>Disk emulator</summary>
|
||||
RAMDisk = 0x08,
|
||||
/// <summary>Can do back to back transfer</summary>
|
||||
Chain = 0x10,
|
||||
/// <summary>Dynamic geometry device</summary>
|
||||
DynamicGeometry = 0x20
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct DiskLabel
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="BSD.DISK_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly uint d_magic;
|
||||
/// <summary>
|
||||
/// <see cref="dType" />
|
||||
/// </summary>
|
||||
public readonly dType d_type;
|
||||
/// <summary>Disk subtype</summary>
|
||||
public readonly ushort d_subtype;
|
||||
/// <summary>Type name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly byte[] d_typename;
|
||||
/// <summary>Pack identifier</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly byte[] d_packname;
|
||||
/// <summary>Bytes per sector</summary>
|
||||
public readonly uint d_secsize;
|
||||
/// <summary>Sectors per track</summary>
|
||||
public readonly uint d_nsectors;
|
||||
/// <summary>Tracks per cylinder</summary>
|
||||
public readonly uint d_ntracks;
|
||||
/// <summary>Cylinders per unit</summary>
|
||||
public readonly uint d_ncylinders;
|
||||
/// <summary>Sectors per cylinder</summary>
|
||||
public readonly uint d_secpercyl;
|
||||
/// <summary>Sectors per unit</summary>
|
||||
public readonly uint d_secperunit;
|
||||
/// <summary>Spare sectors per track</summary>
|
||||
public readonly ushort d_sparespertrack;
|
||||
/// <summary>Spare sectors per cylinder</summary>
|
||||
public readonly ushort d_sparespercyl;
|
||||
/// <summary>Alternate cylinders</summary>
|
||||
public readonly uint d_acylinders;
|
||||
/// <summary>Rotational speed</summary>
|
||||
public readonly ushort d_rpm;
|
||||
/// <summary>Hardware sector interleave</summary>
|
||||
public readonly ushort d_interleave;
|
||||
/// <summary>Sector 0 skew per track</summary>
|
||||
public readonly ushort d_trackskew;
|
||||
/// <summary>Sector 0 sker per cylinder</summary>
|
||||
public readonly ushort d_cylskeew;
|
||||
/// <summary>Head switch time in microseconds</summary>
|
||||
public readonly uint d_headswitch;
|
||||
/// <summary>Track to track seek in microseconds</summary>
|
||||
public readonly uint d_trkseek;
|
||||
/// <summary>
|
||||
/// <see cref="dFlags" />
|
||||
/// </summary>
|
||||
public readonly dFlags d_flags;
|
||||
/// <summary>Drive-specific information</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
|
||||
public readonly uint[] d_drivedata;
|
||||
/// <summary>Reserved</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
|
||||
public readonly uint[] d_spare;
|
||||
/// <summary><see cref="BSD.DISK_MAGIC" /> again</summary>
|
||||
public readonly uint d_magic2;
|
||||
/// <summary>XOR of data</summary>
|
||||
public readonly ushort d_checksum;
|
||||
/// <summary>How many partitions</summary>
|
||||
public readonly ushort d_npartitions;
|
||||
/// <summary>Size of boot area in bytes</summary>
|
||||
public readonly uint d_bbsize;
|
||||
/// <summary>Maximum size of superblock in bytes</summary>
|
||||
public readonly uint d_sbsize;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
|
||||
public readonly BSDPartition[] d_partitions;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct BSDPartition
|
||||
{
|
||||
/// <summary>Sectors in partition</summary>
|
||||
public readonly uint p_size;
|
||||
/// <summary>Starting sector</summary>
|
||||
public readonly uint p_offset;
|
||||
/// <summary>Fragment size</summary>
|
||||
public readonly uint p_fsize;
|
||||
/// <summary>Filesystem type, <see cref="fsType" /></summary>
|
||||
public readonly fsType p_fstype;
|
||||
/// <summary>Fragment size</summary>
|
||||
public readonly byte p_frag;
|
||||
/// <summary>Cylinder per group</summary>
|
||||
public readonly ushort p_cpg;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
@@ -47,10 +47,14 @@ public sealed class DEC : IPartition
|
||||
const int PT_MAGIC = 0x032957;
|
||||
const int PT_VALID = 1;
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.DEC_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("58CEC3B7-3B93-4D47-86EE-D6DADE9D444F");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -93,6 +97,10 @@ public sealed class DEC : IPartition
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Label
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Label
|
||||
{
|
||||
@@ -104,10 +112,16 @@ public sealed class DEC : IPartition
|
||||
public readonly Partition[] pt_part;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Partition
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Partition
|
||||
{
|
||||
public readonly int pi_nblocks;
|
||||
public readonly uint pi_blkoff;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -48,10 +48,14 @@ public sealed class DragonFlyBSD : IPartition
|
||||
{
|
||||
const uint DISK_MAGIC64 = 0xC4464C59;
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.DragonFlyBSD_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("D49E41A6-D952-4760-9D94-03DAE2450C5F");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -84,14 +88,15 @@ public sealed class DragonFlyBSD : IPartition
|
||||
{
|
||||
var part = new Partition
|
||||
{
|
||||
Start = (entry.p_boffset / imagePlugin.Info.SectorSize) + sectorOffset,
|
||||
Offset = entry.p_boffset + (sectorOffset * imagePlugin.Info.SectorSize),
|
||||
Start = entry.p_boffset / imagePlugin.Info.SectorSize + sectorOffset,
|
||||
Offset = entry.p_boffset + sectorOffset * imagePlugin.Info.SectorSize,
|
||||
Size = entry.p_bsize,
|
||||
Length = entry.p_bsize / imagePlugin.Info.SectorSize,
|
||||
Name = entry.p_stor_uuid.ToString(),
|
||||
Sequence = counter,
|
||||
Scheme = Name,
|
||||
Type = (BSD.fsType)entry.p_fstype == BSD.fsType.Other ? entry.p_type_uuid.ToString()
|
||||
Type = (BSD.fsType)entry.p_fstype == BSD.fsType.Other
|
||||
? entry.p_type_uuid.ToString()
|
||||
: BSD.FSTypeToString((BSD.fsType)entry.p_fstype)
|
||||
};
|
||||
|
||||
@@ -109,6 +114,10 @@ public sealed class DragonFlyBSD : IPartition
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Disklabel64
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Disklabel64
|
||||
{
|
||||
@@ -132,6 +141,10 @@ public sealed class DragonFlyBSD : IPartition
|
||||
public readonly Partition64[] d_partitions;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Partition64
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Partition64
|
||||
{
|
||||
@@ -147,4 +160,6 @@ public sealed class DragonFlyBSD : IPartition
|
||||
public readonly Guid p_type_uuid;
|
||||
public readonly Guid p_stor_uuid;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -52,10 +52,14 @@ public sealed class GuidPartitionTable : IPartition
|
||||
const uint GPT_REVISION1 = 0x00010000;
|
||||
const string MODULE_NAME = "GUID Partition Table (GPT) Plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.GuidPartitionTable_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("CBC9D281-C1D0-44E8-9038-4D66FD2678AB");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -74,12 +78,13 @@ public sealed class GuidPartitionTable : IPartition
|
||||
|
||||
Header hdr;
|
||||
|
||||
ulong signature = BitConverter.ToUInt64(hdrBytes, 0);
|
||||
bool misaligned = false;
|
||||
var signature = BitConverter.ToUInt64(hdrBytes, 0);
|
||||
var misaligned = false;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.signature = 0x{0:X16}", signature);
|
||||
|
||||
if(signature != GPT_MAGIC)
|
||||
{
|
||||
if(imagePlugin.Info.MetadataMediaType == MetadataMediaType.OpticalDisc)
|
||||
{
|
||||
errno = imagePlugin.ReadSector(sectorOffset, out hdrBytes);
|
||||
@@ -93,7 +98,7 @@ public sealed class GuidPartitionTable : IPartition
|
||||
if(signature == GPT_MAGIC)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_unaligned_signature, signature);
|
||||
byte[] real = new byte[512];
|
||||
var real = new byte[512];
|
||||
Array.Copy(hdrBytes, 512, real, 0, 512);
|
||||
hdrBytes = real;
|
||||
misaligned = true;
|
||||
@@ -103,6 +108,7 @@ public sealed class GuidPartitionTable : IPartition
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -113,18 +119,18 @@ public sealed class GuidPartitionTable : IPartition
|
||||
return false;
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.revision = 0x{0:X8}", hdr.revision);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerSize = {0}", hdr.headerSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerCrc = 0x{0:X8}", hdr.headerCrc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.reserved = 0x{0:X8}", hdr.reserved);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.myLBA = {0}", hdr.myLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.alternateLBA = {0}", hdr.alternateLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.firstUsableLBA = {0}", hdr.firstUsableLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.lastUsableLBA = {0}", hdr.lastUsableLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.diskGuid = {0}", hdr.diskGuid);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entryLBA = {0}", hdr.entryLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entries = {0}", hdr.entries);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entriesSize = {0}", hdr.entriesSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.revision = 0x{0:X8}", hdr.revision);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerSize = {0}", hdr.headerSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.headerCrc = 0x{0:X8}", hdr.headerCrc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.reserved = 0x{0:X8}", hdr.reserved);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.myLBA = {0}", hdr.myLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.alternateLBA = {0}", hdr.alternateLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.firstUsableLBA = {0}", hdr.firstUsableLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.lastUsableLBA = {0}", hdr.lastUsableLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.diskGuid = {0}", hdr.diskGuid);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entryLBA = {0}", hdr.entryLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entries = {0}", hdr.entries);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entriesSize = {0}", hdr.entriesSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "hdr.entriesCrc = 0x{0:X8}", hdr.entriesCrc);
|
||||
|
||||
if(hdr.signature != GPT_MAGIC)
|
||||
@@ -158,24 +164,24 @@ public sealed class GuidPartitionTable : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return false;
|
||||
|
||||
byte[] entriesBytes = new byte[temp.Length - (modulo * 512)];
|
||||
var entriesBytes = new byte[temp.Length - modulo * 512];
|
||||
Array.Copy(temp, modulo * 512, entriesBytes, 0, entriesBytes.Length);
|
||||
List<Entry> entries = new();
|
||||
|
||||
for(int i = 0; i < hdr.entries; i++)
|
||||
for(var i = 0; i < hdr.entries; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] entryBytes = new byte[hdr.entriesSize];
|
||||
var entryBytes = new byte[hdr.entriesSize];
|
||||
Array.Copy(entriesBytes, hdr.entriesSize * i, entryBytes, 0, hdr.entriesSize);
|
||||
entries.Add(Marshal.ByteArrayToStructureLittleEndian<Entry>(entryBytes));
|
||||
}
|
||||
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
|
||||
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
|
||||
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
|
||||
}
|
||||
|
||||
if(entries.Count == 0)
|
||||
@@ -186,12 +192,12 @@ public sealed class GuidPartitionTable : IPartition
|
||||
foreach(Entry entry in entries.Where(entry => entry.partitionType != Guid.Empty &&
|
||||
entry.partitionId != Guid.Empty))
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionType = {0}", entry.partitionType);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionId = {0}", entry.partitionId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.startLBA = {0}", entry.startLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.endLBA = {0}", entry.endLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionType = {0}", entry.partitionType);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.partitionId = {0}", entry.partitionId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.startLBA = {0}", entry.startLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.endLBA = {0}", entry.endLBA);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.attributes = 0x{0:X16}", entry.attributes);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.name = {0}", entry.name);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.name = {0}", entry.name);
|
||||
|
||||
if(entry.startLBA / divisor > imagePlugin.Info.Sectors ||
|
||||
entry.endLBA / divisor > imagePlugin.Info.Sectors)
|
||||
@@ -217,115 +223,231 @@ public sealed class GuidPartitionTable : IPartition
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static string GetGuidTypeName(Guid type)
|
||||
{
|
||||
string strType = type.ToString().ToUpperInvariant();
|
||||
|
||||
switch(strType)
|
||||
{
|
||||
case "024DEE41-33E7-11D3-9D69-0008C781F39F": return Localization.MBR_scheme;
|
||||
case "C12A7328-F81F-11D2-BA4B-00A0C93EC93B": return Localization.EFI_System;
|
||||
case "21686148-6449-6E6F-744E-656564454649": return Localization.BIOS_Boot;
|
||||
case "D3BFE2DE-3DAF-11DF-BA40-E3A556D89593": return Localization.Intel_Fast_Flash_iFFS;
|
||||
case "F4019732-066E-4E12-8273-346C5641494F": return Localization.Sony_boot;
|
||||
case "BFBFAFE7-A34F-448A-9A5B-6213EB736C22": return Localization.Lenovo_boot;
|
||||
case "E3C9E316-0B5C-4DB8-817D-F92DF00215AE": return Localization.Microsoft_Reserved_MSR;
|
||||
case "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7": return Localization.Microsoft_Basic_data;
|
||||
case "5808C8AA-7E8F-42E0-85D2-E1E90434CFB3": return Localization.Logical_Disk_Manager_LDM_metadata;
|
||||
case "AF9B60A0-1431-4F62-BC68-3311714A69AD": return Localization.Logical_Disk_Manager_data;
|
||||
case "DE94BBA4-06D1-4D40-A16A-BFD50179D6AC": return Localization.Windows_Recovery_Environment;
|
||||
case "37AFFC90-EF7D-4E96-91C3-2D7AE055B174": return Localization.IBM_General_Parallel_File_System_GPFS;
|
||||
case "E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D": return Localization.Windows_Storage_Spaces;
|
||||
case "75894C1E-3AEB-11D3-B7C1-7B03A0000000": return Localization.HP_UX_Data;
|
||||
case "E2A1E728-32E3-11D6-A682-7B03A0000000": return Localization.HP_UX_Service;
|
||||
case "0FC63DAF-8483-4772-8E79-3D69D8477DE4": return Localization.Linux_filesystem;
|
||||
case "A19D880F-05FC-4D3B-A006-743F0F84911E": return Localization.Linux_RAID;
|
||||
case "44479540-F297-41B2-9AF7-D131D5F0458A": return Localization.Linux_Root_x86;
|
||||
case "4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709": return Localization.Linux_Root_x86_64;
|
||||
case "69DAD710-2CE4-4E3C-B16C-21A1D49ABED3": return Localization.Linux_Root_32_bit_ARM;
|
||||
case "B921B045-1DF0-41C3-AF44-4C6F280D3FAE": return Localization.Linux_Root_AArch64;
|
||||
case "0657FD6D-A4AB-43C4-84E5-0933C84B4F4F": return Localization.Linux_swap;
|
||||
case "E6D6D379-F507-44C2-A23C-238F2A3DF928": return Localization.Logical_Volume_Manager_LVM;
|
||||
case "933AC7E1-2EB4-4F13-B844-0E14E2AEF915": return Localization.Linux_home;
|
||||
case "3B8F8425-20E0-4F3B-907F-1A25A76F98E8": return Localization.Linux_srv;
|
||||
case "7FFEC5C9-2D00-49B7-8941-3EA10A5586B7": return Localization.Plain_dm_crypt;
|
||||
case "CA7D7CCB-63ED-4C53-861C-1742536059CC": return Localization.LUKS;
|
||||
case "8DA63339-0007-60C0-C436-083AC8230908": return Localization.Linux_Reserved;
|
||||
case "83BD6B9D-7F41-11DC-BE0B-001560B84F0F": return Localization.FreeBSD_Boot;
|
||||
case "516E7CB4-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_Data;
|
||||
case "516E7CB5-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_swap;
|
||||
case "516E7CB6-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_UFS;
|
||||
case "516E7CB7-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_UFS2;
|
||||
case "516E7CB8-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_Vinum;
|
||||
case "516E7CBA-6ECF-11D6-8FF8-00022D09712B": return Localization.FreeBSD_ZFS;
|
||||
case "74BA7DD9-A689-11E1-BD04-00E081286ACF": return Localization.FreeBSD_nandfs;
|
||||
case "48465300-0000-11AA-AA11-00306543ECAC": return Localization.Apple_HFS;
|
||||
case "55465300-0000-11AA-AA11-00306543ECAC": return Localization.Apple_UFS;
|
||||
case "52414944-0000-11AA-AA11-00306543ECAC": return Localization.Apple_RAID;
|
||||
case "52414944-5F4F-11AA-AA11-00306543ECAC": return Localization.Apple_RAID_offline;
|
||||
case "426F6F74-0000-11AA-AA11-00306543ECAC": return Localization.Apple_Boot;
|
||||
case "4C616265-6C00-11AA-AA11-00306543ECAC": return Localization.Apple_Label;
|
||||
case "5265636F-7665-11AA-AA11-00306543ECAC": return Localization.Apple_TV_Recovery;
|
||||
case "53746F72-6167-11AA-AA11-00306543ECAC": return Localization.Apple_Core_Storage;
|
||||
case "6A82CB45-1DD2-11B2-99A6-080020736631": return Localization.Solaris_boot;
|
||||
case "6A85CF4D-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Root;
|
||||
case "6A87C46F-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Swap;
|
||||
case "6A8B642B-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Backup;
|
||||
case "6A898CC3-1DD2-11B2-99A6-080020736631": return Localization.Solaris_usr_or_Apple_ZFS;
|
||||
case "6A8EF2E9-1DD2-11B2-99A6-080020736631": return Localization.Solaris_var;
|
||||
case "6A90BA39-1DD2-11B2-99A6-080020736631": return Localization.Solaris_home;
|
||||
case "6A9283A5-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Alternate_sector;
|
||||
case "024DEE41-33E7-11D3-9D69-0008C781F39F":
|
||||
return Localization.MBR_scheme;
|
||||
case "C12A7328-F81F-11D2-BA4B-00A0C93EC93B":
|
||||
return Localization.EFI_System;
|
||||
case "21686148-6449-6E6F-744E-656564454649":
|
||||
return Localization.BIOS_Boot;
|
||||
case "D3BFE2DE-3DAF-11DF-BA40-E3A556D89593":
|
||||
return Localization.Intel_Fast_Flash_iFFS;
|
||||
case "F4019732-066E-4E12-8273-346C5641494F":
|
||||
return Localization.Sony_boot;
|
||||
case "BFBFAFE7-A34F-448A-9A5B-6213EB736C22":
|
||||
return Localization.Lenovo_boot;
|
||||
case "E3C9E316-0B5C-4DB8-817D-F92DF00215AE":
|
||||
return Localization.Microsoft_Reserved_MSR;
|
||||
case "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7":
|
||||
return Localization.Microsoft_Basic_data;
|
||||
case "5808C8AA-7E8F-42E0-85D2-E1E90434CFB3":
|
||||
return Localization.Logical_Disk_Manager_LDM_metadata;
|
||||
case "AF9B60A0-1431-4F62-BC68-3311714A69AD":
|
||||
return Localization.Logical_Disk_Manager_data;
|
||||
case "DE94BBA4-06D1-4D40-A16A-BFD50179D6AC":
|
||||
return Localization.Windows_Recovery_Environment;
|
||||
case "37AFFC90-EF7D-4E96-91C3-2D7AE055B174":
|
||||
return Localization.IBM_General_Parallel_File_System_GPFS;
|
||||
case "E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D":
|
||||
return Localization.Windows_Storage_Spaces;
|
||||
case "75894C1E-3AEB-11D3-B7C1-7B03A0000000":
|
||||
return Localization.HP_UX_Data;
|
||||
case "E2A1E728-32E3-11D6-A682-7B03A0000000":
|
||||
return Localization.HP_UX_Service;
|
||||
case "0FC63DAF-8483-4772-8E79-3D69D8477DE4":
|
||||
return Localization.Linux_filesystem;
|
||||
case "A19D880F-05FC-4D3B-A006-743F0F84911E":
|
||||
return Localization.Linux_RAID;
|
||||
case "44479540-F297-41B2-9AF7-D131D5F0458A":
|
||||
return Localization.Linux_Root_x86;
|
||||
case "4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709":
|
||||
return Localization.Linux_Root_x86_64;
|
||||
case "69DAD710-2CE4-4E3C-B16C-21A1D49ABED3":
|
||||
return Localization.Linux_Root_32_bit_ARM;
|
||||
case "B921B045-1DF0-41C3-AF44-4C6F280D3FAE":
|
||||
return Localization.Linux_Root_AArch64;
|
||||
case "0657FD6D-A4AB-43C4-84E5-0933C84B4F4F":
|
||||
return Localization.Linux_swap;
|
||||
case "E6D6D379-F507-44C2-A23C-238F2A3DF928":
|
||||
return Localization.Logical_Volume_Manager_LVM;
|
||||
case "933AC7E1-2EB4-4F13-B844-0E14E2AEF915":
|
||||
return Localization.Linux_home;
|
||||
case "3B8F8425-20E0-4F3B-907F-1A25A76F98E8":
|
||||
return Localization.Linux_srv;
|
||||
case "7FFEC5C9-2D00-49B7-8941-3EA10A5586B7":
|
||||
return Localization.Plain_dm_crypt;
|
||||
case "CA7D7CCB-63ED-4C53-861C-1742536059CC":
|
||||
return Localization.LUKS;
|
||||
case "8DA63339-0007-60C0-C436-083AC8230908":
|
||||
return Localization.Linux_Reserved;
|
||||
case "83BD6B9D-7F41-11DC-BE0B-001560B84F0F":
|
||||
return Localization.FreeBSD_Boot;
|
||||
case "516E7CB4-6ECF-11D6-8FF8-00022D09712B":
|
||||
return Localization.FreeBSD_Data;
|
||||
case "516E7CB5-6ECF-11D6-8FF8-00022D09712B":
|
||||
return Localization.FreeBSD_swap;
|
||||
case "516E7CB6-6ECF-11D6-8FF8-00022D09712B":
|
||||
return Localization.FreeBSD_UFS;
|
||||
case "516E7CB7-6ECF-11D6-8FF8-00022D09712B":
|
||||
return Localization.FreeBSD_UFS2;
|
||||
case "516E7CB8-6ECF-11D6-8FF8-00022D09712B":
|
||||
return Localization.FreeBSD_Vinum;
|
||||
case "516E7CBA-6ECF-11D6-8FF8-00022D09712B":
|
||||
return Localization.FreeBSD_ZFS;
|
||||
case "74BA7DD9-A689-11E1-BD04-00E081286ACF":
|
||||
return Localization.FreeBSD_nandfs;
|
||||
case "48465300-0000-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_HFS;
|
||||
case "55465300-0000-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_UFS;
|
||||
case "52414944-0000-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_RAID;
|
||||
case "52414944-5F4F-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_RAID_offline;
|
||||
case "426F6F74-0000-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_Boot;
|
||||
case "4C616265-6C00-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_Label;
|
||||
case "5265636F-7665-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_TV_Recovery;
|
||||
case "53746F72-6167-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_Core_Storage;
|
||||
case "6A82CB45-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_boot;
|
||||
case "6A85CF4D-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_Root;
|
||||
case "6A87C46F-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_Swap;
|
||||
case "6A8B642B-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_Backup;
|
||||
case "6A898CC3-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_usr_or_Apple_ZFS;
|
||||
case "6A8EF2E9-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_var;
|
||||
case "6A90BA39-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_home;
|
||||
case "6A9283A5-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_Alternate_sector;
|
||||
case "6A945A3B-1DD2-11B2-99A6-080020736631":
|
||||
case "6A9630D1-1DD2-11B2-99A6-080020736631":
|
||||
case "6A980767-1DD2-11B2-99A6-080020736631":
|
||||
case "6A96237F-1DD2-11B2-99A6-080020736631":
|
||||
case "6A8D2AC7-1DD2-11B2-99A6-080020736631": return Localization.Solaris_Reserved;
|
||||
case "49F48D32-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_Swap;
|
||||
case "49F48D5A-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_FFS;
|
||||
case "49F48D82-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_LFS;
|
||||
case "49F48DAA-B10E-11DC-B99B-0019D1879648": return Localization.NetBSD_RAID;
|
||||
case "2DB519C4-B10F-11DC-B99B-0019D1879648": return Localization.NetBSD_Concatenated;
|
||||
case "2DB519EC-B10F-11DC-B99B-0019D1879648": return Localization.NetBSD_Encrypted;
|
||||
case "FE3A2A5D-4F32-41A7-B725-ACCC3285A309": return Localization.ChromeOS_kernel;
|
||||
case "3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC": return Localization.ChromeOS_rootfs;
|
||||
case "2E0A753D-9E48-43B0-8337-B15192CB1B5E": return Localization.ChromeOS_future_use;
|
||||
case "42465331-3BA3-10F1-802A-4861696B7521": return Localization.Haiku_BFS;
|
||||
case "85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Boot;
|
||||
case "85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Data;
|
||||
case "85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Swap;
|
||||
case "0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_UFS;
|
||||
case "85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_Vinum;
|
||||
case "85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7": return Localization.MidnightBSD_ZFS;
|
||||
case "45B0969E-9B03-4F30-B4C6-B4B80CEFF106": return Localization.Ceph_Journal;
|
||||
case "45B0969E-9B03-4F30-B4C6-5EC00CEFF106": return Localization.Ceph_dm_crypt_Encrypted_Journal;
|
||||
case "4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D": return Localization.Ceph_OSD;
|
||||
case "4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D": return Localization.Ceph_dm_crypt_OSD;
|
||||
case "89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE": return Localization.Ceph_disk_in_creation;
|
||||
case "89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE": return Localization.Ceph_dm_crypt_disk_in_creation;
|
||||
case "824CC7A0-36A8-11E3-890A-952519AD3F61": return Localization.OpenBSD_Data;
|
||||
case "CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1": return Localization.QNX_Power_safe_QNX6;
|
||||
case "C91818F9-8025-47AF-89D2-F030D7000C2C": return Localization.Plan_9;
|
||||
case "9D275380-40AD-11DB-BF97-000C2911D1B8": return Localization.VMware_vmkcore_coredump;
|
||||
case "AA31E02A-400F-11DB-9590-000C2911D1B8": return Localization.VMware_VMFS;
|
||||
case "9198EFFC-31C0-11DB-8F78-000C2911D1B8": return Localization.VMware_Reserved;
|
||||
case "7412F7D5-A156-4B13-81DC-867174929325": return Localization.ONIE_boot;
|
||||
case "D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149": return Localization.ONIE_config;
|
||||
case "9E1A2D38-C612-4316-AA26-8B49521E5A8B": return Localization.PowerPC_PReP_boot;
|
||||
case "0311FC50-01CA-4725-AD77-9ADBB20ACE98": return Localization.Acronis_Secure_Zone;
|
||||
case "7C3457EF-0000-11AA-AA11-00306543ECAC": return Localization.Apple_File_System;
|
||||
case "9D087404-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Label;
|
||||
case "9D58FDBD-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Swap;
|
||||
case "9D94CE7C-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_UFS;
|
||||
case "9DD4478F-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Vinum;
|
||||
case "DBD5211B-1CA5-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_CCD;
|
||||
case "3D48CE54-1D16-11DC-8817-01301BB8A9F5": return Localization.DragonflyBSD_Label;
|
||||
case "BD215AB2-1D16-11DC-8696-01301BB8A9F5": return Localization.DragonflyBSD_Legacy;
|
||||
case "61DC63AC-6E38-11DC-8513-01301BB8A9F5": return Localization.DragonflyBSD_Hammer;
|
||||
case "5CBB9AD1-862D-11DC-A94D-01301BB8A9F5": return Localization.DragonflyBSD_Hammer2;
|
||||
default: return "";
|
||||
case "6A8D2AC7-1DD2-11B2-99A6-080020736631":
|
||||
return Localization.Solaris_Reserved;
|
||||
case "49F48D32-B10E-11DC-B99B-0019D1879648":
|
||||
return Localization.NetBSD_Swap;
|
||||
case "49F48D5A-B10E-11DC-B99B-0019D1879648":
|
||||
return Localization.NetBSD_FFS;
|
||||
case "49F48D82-B10E-11DC-B99B-0019D1879648":
|
||||
return Localization.NetBSD_LFS;
|
||||
case "49F48DAA-B10E-11DC-B99B-0019D1879648":
|
||||
return Localization.NetBSD_RAID;
|
||||
case "2DB519C4-B10F-11DC-B99B-0019D1879648":
|
||||
return Localization.NetBSD_Concatenated;
|
||||
case "2DB519EC-B10F-11DC-B99B-0019D1879648":
|
||||
return Localization.NetBSD_Encrypted;
|
||||
case "FE3A2A5D-4F32-41A7-B725-ACCC3285A309":
|
||||
return Localization.ChromeOS_kernel;
|
||||
case "3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC":
|
||||
return Localization.ChromeOS_rootfs;
|
||||
case "2E0A753D-9E48-43B0-8337-B15192CB1B5E":
|
||||
return Localization.ChromeOS_future_use;
|
||||
case "42465331-3BA3-10F1-802A-4861696B7521":
|
||||
return Localization.Haiku_BFS;
|
||||
case "85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7":
|
||||
return Localization.MidnightBSD_Boot;
|
||||
case "85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7":
|
||||
return Localization.MidnightBSD_Data;
|
||||
case "85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7":
|
||||
return Localization.MidnightBSD_Swap;
|
||||
case "0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7":
|
||||
return Localization.MidnightBSD_UFS;
|
||||
case "85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7":
|
||||
return Localization.MidnightBSD_Vinum;
|
||||
case "85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7":
|
||||
return Localization.MidnightBSD_ZFS;
|
||||
case "45B0969E-9B03-4F30-B4C6-B4B80CEFF106":
|
||||
return Localization.Ceph_Journal;
|
||||
case "45B0969E-9B03-4F30-B4C6-5EC00CEFF106":
|
||||
return Localization.Ceph_dm_crypt_Encrypted_Journal;
|
||||
case "4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D":
|
||||
return Localization.Ceph_OSD;
|
||||
case "4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D":
|
||||
return Localization.Ceph_dm_crypt_OSD;
|
||||
case "89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE":
|
||||
return Localization.Ceph_disk_in_creation;
|
||||
case "89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE":
|
||||
return Localization.Ceph_dm_crypt_disk_in_creation;
|
||||
case "824CC7A0-36A8-11E3-890A-952519AD3F61":
|
||||
return Localization.OpenBSD_Data;
|
||||
case "CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1":
|
||||
return Localization.QNX_Power_safe_QNX6;
|
||||
case "C91818F9-8025-47AF-89D2-F030D7000C2C":
|
||||
return Localization.Plan_9;
|
||||
case "9D275380-40AD-11DB-BF97-000C2911D1B8":
|
||||
return Localization.VMware_vmkcore_coredump;
|
||||
case "AA31E02A-400F-11DB-9590-000C2911D1B8":
|
||||
return Localization.VMware_VMFS;
|
||||
case "9198EFFC-31C0-11DB-8F78-000C2911D1B8":
|
||||
return Localization.VMware_Reserved;
|
||||
case "7412F7D5-A156-4B13-81DC-867174929325":
|
||||
return Localization.ONIE_boot;
|
||||
case "D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149":
|
||||
return Localization.ONIE_config;
|
||||
case "9E1A2D38-C612-4316-AA26-8B49521E5A8B":
|
||||
return Localization.PowerPC_PReP_boot;
|
||||
case "0311FC50-01CA-4725-AD77-9ADBB20ACE98":
|
||||
return Localization.Acronis_Secure_Zone;
|
||||
case "7C3457EF-0000-11AA-AA11-00306543ECAC":
|
||||
return Localization.Apple_File_System;
|
||||
case "9D087404-1CA5-11DC-8817-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_Label;
|
||||
case "9D58FDBD-1CA5-11DC-8817-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_Swap;
|
||||
case "9D94CE7C-1CA5-11DC-8817-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_UFS;
|
||||
case "9DD4478F-1CA5-11DC-8817-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_Vinum;
|
||||
case "DBD5211B-1CA5-11DC-8817-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_CCD;
|
||||
case "3D48CE54-1D16-11DC-8817-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_Label;
|
||||
case "BD215AB2-1D16-11DC-8696-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_Legacy;
|
||||
case "61DC63AC-6E38-11DC-8513-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_Hammer;
|
||||
case "5CBB9AD1-862D-11DC-A94D-01301BB8A9F5":
|
||||
return Localization.DragonflyBSD_Hammer2;
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
#region Nested type: Entry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||
struct Entry
|
||||
{
|
||||
public readonly Guid partitionType;
|
||||
public readonly Guid partitionId;
|
||||
public readonly ulong startLBA;
|
||||
public readonly ulong endLBA;
|
||||
public readonly ulong attributes;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
|
||||
public readonly string name;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Header
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
struct Header
|
||||
{
|
||||
@@ -345,15 +467,5 @@ public sealed class GuidPartitionTable : IPartition
|
||||
public readonly uint entriesCrc;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||
struct Entry
|
||||
{
|
||||
public readonly Guid partitionType;
|
||||
public readonly Guid partitionId;
|
||||
public readonly ulong startLBA;
|
||||
public readonly ulong endLBA;
|
||||
public readonly ulong attributes;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
|
||||
public readonly string name;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
@@ -51,10 +51,14 @@ public sealed class Human68K : IPartition
|
||||
const uint X68K_MAGIC = 0x5836384B;
|
||||
const string MODULE_NAME = "Human68k partitions plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.Human68K_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -89,7 +93,8 @@ public sealed class Human68K : IPartition
|
||||
sectsPerUnit = 1;
|
||||
|
||||
break;
|
||||
default: return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
@@ -102,11 +107,11 @@ public sealed class Human68K : IPartition
|
||||
if(table.magic != X68K_MAGIC)
|
||||
return false;
|
||||
|
||||
for(int i = 0; i < table.entries.Length; i++)
|
||||
for(var i = 0; i < table.entries.Length; i++)
|
||||
table.entries[i] = (Entry)Marshal.SwapStructureMembersEndian(table.entries[i]);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size = {0:X4}", table.size);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size2 = {0:X4}", table.size2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size = {0:X4}", table.size);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.size2 = {0:X4}", table.size2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "table.unknown = {0:X4}", table.unknown);
|
||||
|
||||
ulong counter = 0;
|
||||
@@ -117,7 +122,7 @@ public sealed class Human68K : IPartition
|
||||
StringHandlers.CToString(entry.name, Encoding.GetEncoding(932)));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.stateStart = {0}", entry.stateStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.length = {0}", entry.length);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.length = {0}", entry.length);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "sectsPerUnit = {0} {1}", sectsPerUnit,
|
||||
imagePlugin.Info.SectorSize);
|
||||
@@ -144,6 +149,23 @@ public sealed class Human68K : IPartition
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Entry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Entry
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] name;
|
||||
public readonly uint stateStart;
|
||||
public readonly uint length;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Table
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Table
|
||||
{
|
||||
@@ -155,12 +177,5 @@ public sealed class Human68K : IPartition
|
||||
public readonly Entry[] entries;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Entry
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] name;
|
||||
public readonly uint stateStart;
|
||||
public readonly uint length;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -303,10 +303,14 @@ public sealed class MBR : IPartition
|
||||
Localization.Xenix_bad_block
|
||||
};
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.MBR_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("5E8A34E8-4F1A-59E6-4BF7-7EA647063A76");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -349,7 +353,7 @@ public sealed class MBR : IPartition
|
||||
DiskManagerMasterBootRecord mbrOntrack =
|
||||
Marshal.ByteArrayToStructureLittleEndian<DiskManagerMasterBootRecord>(sector);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "xmlmedia = {0}", imagePlugin.Info.MetadataMediaType);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "xmlmedia = {0}", imagePlugin.Info.MetadataMediaType);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mbr.magic = {0:X4}", mbr.magic);
|
||||
|
||||
if(mbr.magic != MBR_MAGIC)
|
||||
@@ -360,7 +364,7 @@ public sealed class MBR : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return false;
|
||||
|
||||
ulong signature = BitConverter.ToUInt64(hdrBytes, 0);
|
||||
var signature = BitConverter.ToUInt64(hdrBytes, 0);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "gpt.signature = 0x{0:X16}", signature);
|
||||
|
||||
@@ -392,18 +396,18 @@ public sealed class MBR : IPartition
|
||||
|
||||
foreach(PartitionEntry entry in entries)
|
||||
{
|
||||
byte startSector = (byte)(entry.start_sector & 0x3F);
|
||||
ushort startCylinder = (ushort)(((entry.start_sector & 0xC0) << 2) | entry.start_cylinder);
|
||||
byte endSector = (byte)(entry.end_sector & 0x3F);
|
||||
ushort endCylinder = (ushort)(((entry.end_sector & 0xC0) << 2) | entry.end_cylinder);
|
||||
ulong lbaStart = entry.lba_start;
|
||||
ulong lbaSectors = entry.lba_sectors;
|
||||
var startSector = (byte)(entry.start_sector & 0x3F);
|
||||
var startCylinder = (ushort)((entry.start_sector & 0xC0) << 2 | entry.start_cylinder);
|
||||
var endSector = (byte)(entry.end_sector & 0x3F);
|
||||
var endCylinder = (ushort)((entry.end_sector & 0xC0) << 2 | entry.end_cylinder);
|
||||
ulong lbaStart = entry.lba_start;
|
||||
ulong lbaSectors = entry.lba_sectors;
|
||||
|
||||
// Let's start the fun...
|
||||
|
||||
bool valid = true;
|
||||
bool extended = false;
|
||||
bool minix = false;
|
||||
var valid = true;
|
||||
var extended = false;
|
||||
var minix = false;
|
||||
|
||||
if(entry.status != 0x00 &&
|
||||
entry.status != 0x80)
|
||||
@@ -449,27 +453,29 @@ public sealed class MBR : IPartition
|
||||
if(lbaStart + lbaSectors > imagePlugin.Info.Sectors)
|
||||
lbaSectors = imagePlugin.Info.Sectors - lbaStart;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.status {0}", entry.status);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.type {0}", entry.type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_start {0}", entry.lba_start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_sectors {0}", entry.lba_sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.status {0}", entry.status);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.type {0}", entry.type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_start {0}", entry.lba_start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.lba_sectors {0}", entry.lba_sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_cylinder {0}", startCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_head {0}", entry.start_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_sector {0}", startSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_cylinder {0}", endCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_head {0}", entry.end_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_sector {0}", endSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_head {0}", entry.start_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.start_sector {0}", startSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_cylinder {0}", endCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_head {0}", entry.end_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.end_sector {0}", endSector);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.minix = {0}", minix);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "lba_start {0}", lbaStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "lba_start {0}", lbaStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "lba_sectors {0}", lbaSectors);
|
||||
|
||||
if(valid && minix) // Let's mix the fun
|
||||
{
|
||||
if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize, out List<Partition> mnxParts))
|
||||
partitions.AddRange(mnxParts);
|
||||
else
|
||||
minix = false;
|
||||
}
|
||||
|
||||
if(valid && !minix)
|
||||
{
|
||||
@@ -505,7 +511,7 @@ public sealed class MBR : IPartition
|
||||
if(!extended)
|
||||
continue;
|
||||
|
||||
bool processingExtended = true;
|
||||
var processingExtended = true;
|
||||
ulong chainStart = lbaStart;
|
||||
|
||||
while(processingExtended)
|
||||
@@ -526,25 +532,25 @@ public sealed class MBR : IPartition
|
||||
|
||||
foreach(PartitionEntry ebrEntry in ebr.entries)
|
||||
{
|
||||
bool extValid = true;
|
||||
var extValid = true;
|
||||
startSector = (byte)(ebrEntry.start_sector & 0x3F);
|
||||
startCylinder = (ushort)(((ebrEntry.start_sector & 0xC0) << 2) | ebrEntry.start_cylinder);
|
||||
startCylinder = (ushort)((ebrEntry.start_sector & 0xC0) << 2 | ebrEntry.start_cylinder);
|
||||
endSector = (byte)(ebrEntry.end_sector & 0x3F);
|
||||
endCylinder = (ushort)(((ebrEntry.end_sector & 0xC0) << 2) | ebrEntry.end_cylinder);
|
||||
endCylinder = (ushort)((ebrEntry.end_sector & 0xC0) << 2 | ebrEntry.end_cylinder);
|
||||
ulong extStart = ebrEntry.lba_start;
|
||||
ulong extSectors = ebrEntry.lba_sectors;
|
||||
bool extMinix = false;
|
||||
var extMinix = false;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.status {0}", ebrEntry.status);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.type {0}", ebrEntry.type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_start {0}", ebrEntry.lba_start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_sectors {0}", ebrEntry.lba_sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.status {0}", ebrEntry.status);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.type {0}", ebrEntry.type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_start {0}", ebrEntry.lba_start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.lba_sectors {0}", ebrEntry.lba_sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_cylinder {0}", startCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_head {0}", ebrEntry.start_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_sector {0}", startSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_cylinder {0}", endCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_head {0}", ebrEntry.end_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_sector {0}", endSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_head {0}", ebrEntry.start_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.start_sector {0}", startSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_cylinder {0}", endCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_head {0}", ebrEntry.end_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ebr_entry.end_sector {0}", endSector);
|
||||
|
||||
// Let's start the fun...
|
||||
extValid &= ebrEntry.status is 0x00 or 0x80;
|
||||
@@ -569,7 +575,7 @@ public sealed class MBR : IPartition
|
||||
extStart /= divider;
|
||||
extSectors /= divider;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ext_start {0}", extStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ext_start {0}", extStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "ext_sectors {0}", extSectors);
|
||||
|
||||
if(ebrEntry.type is 0x05 or 0x0F or 0x15 or 0x1F or 0x85 or 0x91 or 0x9B or 0xC5 or 0xCF or 0xD5)
|
||||
@@ -586,11 +592,13 @@ public sealed class MBR : IPartition
|
||||
extSectors = imagePlugin.Info.Sectors - extStart;
|
||||
|
||||
if(extValid && extMinix) // Let's mix the fun
|
||||
{
|
||||
if(GetMinix(imagePlugin, lbaStart, divider, sectorOffset, sectorSize,
|
||||
out List<Partition> mnxParts))
|
||||
partitions.AddRange(mnxParts);
|
||||
else
|
||||
extMinix = false;
|
||||
}
|
||||
|
||||
if(!extValid || extMinix)
|
||||
continue;
|
||||
@@ -632,6 +640,8 @@ public sealed class MBR : IPartition
|
||||
return partitions.Count != 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static bool GetMinix(IMediaImage imagePlugin, ulong start, ulong divider, ulong sectorOffset, uint sectorSize,
|
||||
out List<Partition> partitions)
|
||||
{
|
||||
@@ -649,28 +659,28 @@ public sealed class MBR : IPartition
|
||||
if(mnx.magic != MBR_MAGIC)
|
||||
return false;
|
||||
|
||||
bool anyMnx = false;
|
||||
var anyMnx = false;
|
||||
|
||||
foreach(PartitionEntry mnxEntry in mnx.entries)
|
||||
{
|
||||
bool mnxValid = true;
|
||||
byte startSector = (byte)(mnxEntry.start_sector & 0x3F);
|
||||
ushort startCylinder = (ushort)(((mnxEntry.start_sector & 0xC0) << 2) | mnxEntry.start_cylinder);
|
||||
byte endSector = (byte)(mnxEntry.end_sector & 0x3F);
|
||||
ushort endCylinder = (ushort)(((mnxEntry.end_sector & 0xC0) << 2) | mnxEntry.end_cylinder);
|
||||
ulong mnxStart = mnxEntry.lba_start;
|
||||
ulong mnxSectors = mnxEntry.lba_sectors;
|
||||
var mnxValid = true;
|
||||
var startSector = (byte)(mnxEntry.start_sector & 0x3F);
|
||||
var startCylinder = (ushort)((mnxEntry.start_sector & 0xC0) << 2 | mnxEntry.start_cylinder);
|
||||
var endSector = (byte)(mnxEntry.end_sector & 0x3F);
|
||||
var endCylinder = (ushort)((mnxEntry.end_sector & 0xC0) << 2 | mnxEntry.end_cylinder);
|
||||
ulong mnxStart = mnxEntry.lba_start;
|
||||
ulong mnxSectors = mnxEntry.lba_sectors;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.status {0}", mnxEntry.status);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.type {0}", mnxEntry.type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_start {0}", mnxEntry.lba_start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_sectors {0}", mnxEntry.lba_sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.status {0}", mnxEntry.status);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.type {0}", mnxEntry.type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_start {0}", mnxEntry.lba_start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.lba_sectors {0}", mnxEntry.lba_sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_cylinder {0}", startCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_head {0}", mnxEntry.start_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_sector {0}", startSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_cylinder {0}", endCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_head {0}", mnxEntry.end_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_sector {0}", endSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_head {0}", mnxEntry.start_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.start_sector {0}", startSector);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_cylinder {0}", endCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_head {0}", mnxEntry.end_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_entry.end_sector {0}", endSector);
|
||||
|
||||
mnxValid &= mnxEntry.status is 0x00 or 0x80;
|
||||
mnxValid &= mnxEntry.type is 0x81 or 0x80;
|
||||
@@ -692,7 +702,7 @@ public sealed class MBR : IPartition
|
||||
mnxStart /= divider;
|
||||
mnxSectors /= divider;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_start {0}", mnxStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_start {0}", mnxStart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "mnx_sectors {0}", mnxSectors);
|
||||
|
||||
if(!mnxValid)
|
||||
@@ -728,14 +738,20 @@ public sealed class MBR : IPartition
|
||||
|
||||
static string DecodeMbrType(byte type) => _mbrTypes[type];
|
||||
|
||||
#region Nested type: DiskManagerMasterBootRecord
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct MasterBootRecord
|
||||
readonly struct DiskManagerMasterBootRecord
|
||||
{
|
||||
/// <summary>Boot code</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 446)]
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 252)]
|
||||
public readonly byte[] boot_code;
|
||||
/// <summary>
|
||||
/// <see cref="MBR.DM_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly ushort dm_magic;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly PartitionEntry[] entries;
|
||||
/// <summary>
|
||||
/// <see cref="MBR.MBR_MAGIC" />
|
||||
@@ -743,6 +759,10 @@ public sealed class MBR : IPartition
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: ExtendedBootRecord
|
||||
|
||||
// TODO: IBM Boot Manager
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct ExtendedBootRecord
|
||||
@@ -759,25 +779,16 @@ public sealed class MBR : IPartition
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: MasterBootRecord
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct TimedMasterBootRecord
|
||||
readonly struct MasterBootRecord
|
||||
{
|
||||
/// <summary>Boot code</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 218)]
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 446)]
|
||||
public readonly byte[] boot_code;
|
||||
/// <summary>Set to 0</summary>
|
||||
public readonly ushort zero;
|
||||
/// <summary>Original physical drive</summary>
|
||||
public readonly byte drive;
|
||||
/// <summary>Disk timestamp, seconds</summary>
|
||||
public readonly byte seconds;
|
||||
/// <summary>Disk timestamp, minutes</summary>
|
||||
public readonly byte minutes;
|
||||
/// <summary>Disk timestamp, hours</summary>
|
||||
public readonly byte hours;
|
||||
/// <summary>Boot code, continuation</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 222)]
|
||||
public readonly byte[] boot_code2;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
public readonly PartitionEntry[] entries;
|
||||
@@ -787,24 +798,9 @@ public sealed class MBR : IPartition
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct SerializedMasterBootRecord
|
||||
{
|
||||
/// <summary>Boot code</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 440)]
|
||||
public readonly byte[] boot_code;
|
||||
/// <summary>Disk serial number</summary>
|
||||
public readonly uint serial;
|
||||
/// <summary>Set to 0</summary>
|
||||
public readonly ushort zero;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
public readonly PartitionEntry[] entries;
|
||||
/// <summary>
|
||||
/// <see cref="MBR.MBR_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly ushort magic;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Nested type: ModernMasterBootRecord
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct ModernMasterBootRecord
|
||||
@@ -838,6 +834,10 @@ public sealed class MBR : IPartition
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: NecMasterBootRecord
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct NecMasterBootRecord
|
||||
{
|
||||
@@ -857,24 +857,9 @@ public sealed class MBR : IPartition
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct DiskManagerMasterBootRecord
|
||||
{
|
||||
/// <summary>Boot code</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 252)]
|
||||
public readonly byte[] boot_code;
|
||||
/// <summary>
|
||||
/// <see cref="MBR.DM_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly ushort dm_magic;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly PartitionEntry[] entries;
|
||||
/// <summary>
|
||||
/// <see cref="MBR.MBR_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly ushort magic;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Nested type: PartitionEntry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct PartitionEntry
|
||||
@@ -900,4 +885,61 @@ public sealed class MBR : IPartition
|
||||
/// <summary>Total sectors</summary>
|
||||
public readonly uint lba_sectors;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: SerializedMasterBootRecord
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct SerializedMasterBootRecord
|
||||
{
|
||||
/// <summary>Boot code</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 440)]
|
||||
public readonly byte[] boot_code;
|
||||
/// <summary>Disk serial number</summary>
|
||||
public readonly uint serial;
|
||||
/// <summary>Set to 0</summary>
|
||||
public readonly ushort zero;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
public readonly PartitionEntry[] entries;
|
||||
/// <summary>
|
||||
/// <see cref="MBR.MBR_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: TimedMasterBootRecord
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct TimedMasterBootRecord
|
||||
{
|
||||
/// <summary>Boot code</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 218)]
|
||||
public readonly byte[] boot_code;
|
||||
/// <summary>Set to 0</summary>
|
||||
public readonly ushort zero;
|
||||
/// <summary>Original physical drive</summary>
|
||||
public readonly byte drive;
|
||||
/// <summary>Disk timestamp, seconds</summary>
|
||||
public readonly byte seconds;
|
||||
/// <summary>Disk timestamp, minutes</summary>
|
||||
public readonly byte minutes;
|
||||
/// <summary>Disk timestamp, hours</summary>
|
||||
public readonly byte hours;
|
||||
/// <summary>Boot code, continuation</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 222)]
|
||||
public readonly byte[] boot_code2;
|
||||
/// <summary>Partitions</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
public readonly PartitionEntry[] entries;
|
||||
/// <summary>
|
||||
/// <see cref="MBR.MBR_MAGIC" />
|
||||
/// </summary>
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -49,7 +49,8 @@ namespace Aaru.Partitions;
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>Implements decoding of NeXT disklabels</summary>
|
||||
[SuppressMessage("ReSharper", "UnusedMember.Local"), SuppressMessage("ReSharper", "UnusedType.Local")]
|
||||
[SuppressMessage("ReSharper", "UnusedMember.Local")]
|
||||
[SuppressMessage("ReSharper", "UnusedType.Local")]
|
||||
public sealed class NeXTDisklabel : IPartition
|
||||
{
|
||||
/// <summary>"NeXT"</summary>
|
||||
@@ -64,17 +65,21 @@ public sealed class NeXTDisklabel : IPartition
|
||||
const ushort DISKTAB_ENTRY_SIZE = 0x2C;
|
||||
const string MODULE_NAME = "NeXT disklabel plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.NeXTDisklabel_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool GetInformation(IMediaImage imagePlugin, out List<Partition> partitions, ulong sectorOffset)
|
||||
{
|
||||
bool magicFound = false;
|
||||
var magicFound = false;
|
||||
byte[] labelSector;
|
||||
|
||||
uint sectorSize = imagePlugin.Info.SectorSize is 2352 or 2448 ? 2048 : imagePlugin.Info.SectorSize;
|
||||
@@ -84,17 +89,14 @@ public sealed class NeXTDisklabel : IPartition
|
||||
ulong labelPosition = 0;
|
||||
ErrorNumber errno;
|
||||
|
||||
foreach(ulong i in new ulong[]
|
||||
{
|
||||
0, 4, 15, 16
|
||||
}.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
|
||||
foreach(ulong i in new ulong[] { 0, 4, 15, 16 }.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
|
||||
{
|
||||
errno = imagePlugin.ReadSector(i + sectorOffset, out labelSector);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
continue;
|
||||
|
||||
uint magic = BigEndianBitConverter.ToUInt32(labelSector, 0x00);
|
||||
var magic = BigEndianBitConverter.ToUInt32(labelSector, 0x00);
|
||||
|
||||
if(magic != NEXT_MAGIC1 &&
|
||||
magic != NEXT_MAGIC2 &&
|
||||
@@ -120,19 +122,19 @@ public sealed class NeXTDisklabel : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return false;
|
||||
|
||||
Label label = Marshal.ByteArrayToStructureBigEndian<Label>(labelSector);
|
||||
byte[] disktabB = new byte[498];
|
||||
Label label = Marshal.ByteArrayToStructureBigEndian<Label>(labelSector);
|
||||
var disktabB = new byte[498];
|
||||
Array.Copy(labelSector, 44, disktabB, 0, 498);
|
||||
label.dl_dt = Marshal.ByteArrayToStructureBigEndian<DiskTab>(disktabB);
|
||||
label.dl_dt.d_partitions = new Entry[8];
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_version = 0x{0:X8}", label.dl_version);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_label_blkno = {0}", label.dl_label_blkno);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_size = {0}", label.dl_size);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_label_blkno = {0}", label.dl_label_blkno);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_size = {0}", label.dl_size);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_label = \"{0}\"", StringHandlers.CToString(label.dl_label));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_flags = {0}", label.dl_flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_flags = {0}", label.dl_flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_tag = 0x{0:X8}", label.dl_tag);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_name = \"{0}\"",
|
||||
@@ -141,17 +143,17 @@ public sealed class NeXTDisklabel : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_type = \"{0}\"",
|
||||
StringHandlers.CToString(label.dl_dt.d_type));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_secsize = {0}", label.dl_dt.d_secsize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ntracks = {0}", label.dl_dt.d_ntracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_nsectors = {0}", label.dl_dt.d_nsectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_secsize = {0}", label.dl_dt.d_secsize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ntracks = {0}", label.dl_dt.d_ntracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_nsectors = {0}", label.dl_dt.d_nsectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ncylinders = {0}", label.dl_dt.d_ncylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rpm = {0}", label.dl_dt.d_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_front = {0}", label.dl_dt.d_front);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_back = {0}", label.dl_dt.d_back);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ngroups = {0}", label.dl_dt.d_ngroups);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_size = {0}", label.dl_dt.d_ag_size);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_alts = {0}", label.dl_dt.d_ag_alts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_off = {0}", label.dl_dt.d_ag_off);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rpm = {0}", label.dl_dt.d_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_front = {0}", label.dl_dt.d_front);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_back = {0}", label.dl_dt.d_back);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ngroups = {0}", label.dl_dt.d_ngroups);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_size = {0}", label.dl_dt.d_ag_size);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_alts = {0}", label.dl_dt.d_ag_alts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_ag_off = {0}", label.dl_dt.d_ag_off);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_boot0_blkno[0] = {0}", label.dl_dt.d_boot0_blkno[0]);
|
||||
|
||||
@@ -164,12 +166,12 @@ public sealed class NeXTDisklabel : IPartition
|
||||
StringHandlers.CToString(label.dl_dt.d_hostname));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rootpartition = {0}", label.dl_dt.d_rootpartition);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rwpartition = {0}", label.dl_dt.d_rwpartition);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_rwpartition = {0}", label.dl_dt.d_rwpartition);
|
||||
|
||||
for(int i = 0; i < 8; i++)
|
||||
for(var i = 0; i < 8; i++)
|
||||
{
|
||||
byte[] partB = new byte[44];
|
||||
Array.Copy(labelSector, 44 + 146 + (44 * i), partB, 0, 44);
|
||||
var partB = new byte[44];
|
||||
Array.Copy(labelSector, 44 + 146 + 44 * i, partB, 0, 44);
|
||||
label.dl_dt.d_partitions[i] = Marshal.ByteArrayToStructureBigEndian<Entry>(partB);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_partitions[{0}].p_base = {1}", i,
|
||||
@@ -237,7 +239,7 @@ public sealed class NeXTDisklabel : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "label.dl_dt.d_partitions[{0}].p_size = {1}", i, part.Length);
|
||||
}
|
||||
|
||||
sb.AppendFormat(Localization._0_bytes_per_block, label.dl_dt.d_partitions[i].p_bsize).AppendLine();
|
||||
sb.AppendFormat(Localization._0_bytes_per_block, label.dl_dt.d_partitions[i].p_bsize).AppendLine();
|
||||
sb.AppendFormat(Localization._0_bytes_per_fragment, label.dl_dt.d_partitions[i].p_fsize).AppendLine();
|
||||
|
||||
if(label.dl_dt.d_partitions[i].p_opt == 's')
|
||||
@@ -248,7 +250,7 @@ public sealed class NeXTDisklabel : IPartition
|
||||
sb.AppendFormat(Localization.Unknown_optimization_0_X2, label.dl_dt.d_partitions[i].p_opt).AppendLine();
|
||||
|
||||
sb.AppendFormat(Localization._0_cylinders_per_group, label.dl_dt.d_partitions[i].p_cpg).AppendLine();
|
||||
sb.AppendFormat(Localization._0_bytes_per_inode, label.dl_dt.d_partitions[i].p_density).AppendLine();
|
||||
sb.AppendFormat(Localization._0_bytes_per_inode, label.dl_dt.d_partitions[i].p_density).AppendLine();
|
||||
|
||||
sb.AppendFormat(Localization._0_of_space_must_be_free_at_minimum, label.dl_dt.d_partitions[i].p_minfree).
|
||||
AppendLine();
|
||||
@@ -267,54 +269,9 @@ public sealed class NeXTDisklabel : IPartition
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>NeXT v3 disklabel, 544 bytes</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct Label
|
||||
{
|
||||
/// <summary>Signature</summary>
|
||||
public readonly uint dl_version;
|
||||
/// <summary>Block on which this label resides</summary>
|
||||
public readonly int dl_label_blkno;
|
||||
/// <summary>Device size in blocks</summary>
|
||||
public readonly int dl_size;
|
||||
/// <summary>Device name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
|
||||
public readonly byte[] dl_label;
|
||||
/// <summary>Device flags</summary>
|
||||
public readonly uint dl_flags;
|
||||
/// <summary>Device tag</summary>
|
||||
public readonly uint dl_tag;
|
||||
/// <summary>Device info and partitions</summary>
|
||||
public DiskTab dl_dt;
|
||||
/// <summary>Checksum</summary>
|
||||
public readonly ushort dl_v3_checksum;
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>NeXT v1 and v2 disklabel, 7224 bytes</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct LabelOld
|
||||
{
|
||||
/// <summary>Signature</summary>
|
||||
public readonly uint dl_version;
|
||||
/// <summary>Block on which this label resides</summary>
|
||||
public readonly int dl_label_blkno;
|
||||
/// <summary>Device size in blocks</summary>
|
||||
public readonly int dl_size;
|
||||
/// <summary>Device name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
|
||||
public readonly byte[] dl_label;
|
||||
/// <summary>Device flags</summary>
|
||||
public readonly uint dl_flags;
|
||||
/// <summary>Device tag</summary>
|
||||
public readonly uint dl_tag;
|
||||
/// <summary>Device info and partitions</summary>
|
||||
public readonly DiskTab dl_dt;
|
||||
/// <summary>Bad sector table</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1670)]
|
||||
public readonly int[] dl_bad;
|
||||
/// <summary>Checksum</summary>
|
||||
public readonly ushort dl_checksum;
|
||||
}
|
||||
#region Nested type: DiskTab
|
||||
|
||||
/// <summary>NeXT disktab and partitions, 498 bytes</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -366,6 +323,10 @@ public sealed class NeXTDisklabel : IPartition
|
||||
public Entry[] d_partitions;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Entry
|
||||
|
||||
/// <summary>Partition entries, 44 bytes each</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 2)]
|
||||
struct Entry
|
||||
@@ -397,4 +358,63 @@ public sealed class NeXTDisklabel : IPartition
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] p_type;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Label
|
||||
|
||||
/// <summary>NeXT v3 disklabel, 544 bytes</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct Label
|
||||
{
|
||||
/// <summary>Signature</summary>
|
||||
public readonly uint dl_version;
|
||||
/// <summary>Block on which this label resides</summary>
|
||||
public readonly int dl_label_blkno;
|
||||
/// <summary>Device size in blocks</summary>
|
||||
public readonly int dl_size;
|
||||
/// <summary>Device name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
|
||||
public readonly byte[] dl_label;
|
||||
/// <summary>Device flags</summary>
|
||||
public readonly uint dl_flags;
|
||||
/// <summary>Device tag</summary>
|
||||
public readonly uint dl_tag;
|
||||
/// <summary>Device info and partitions</summary>
|
||||
public DiskTab dl_dt;
|
||||
/// <summary>Checksum</summary>
|
||||
public readonly ushort dl_v3_checksum;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: LabelOld
|
||||
|
||||
/// <summary>NeXT v1 and v2 disklabel, 7224 bytes</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct LabelOld
|
||||
{
|
||||
/// <summary>Signature</summary>
|
||||
public readonly uint dl_version;
|
||||
/// <summary>Block on which this label resides</summary>
|
||||
public readonly int dl_label_blkno;
|
||||
/// <summary>Device size in blocks</summary>
|
||||
public readonly int dl_size;
|
||||
/// <summary>Device name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
|
||||
public readonly byte[] dl_label;
|
||||
/// <summary>Device flags</summary>
|
||||
public readonly uint dl_flags;
|
||||
/// <summary>Device tag</summary>
|
||||
public readonly uint dl_tag;
|
||||
/// <summary>Device info and partitions</summary>
|
||||
public readonly DiskTab dl_dt;
|
||||
/// <summary>Bad sector table</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1670)]
|
||||
public readonly int[] dl_bad;
|
||||
/// <summary>Checksum</summary>
|
||||
public readonly ushort dl_checksum;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -47,10 +47,15 @@ namespace Aaru.Partitions;
|
||||
public sealed class PC98 : IPartition
|
||||
{
|
||||
const string MODULE_NAME = "PC-98 partitions plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.PC98_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("27333401-C7C2-447D-961C-22AD0641A09A");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -84,19 +89,19 @@ public sealed class PC98 : IPartition
|
||||
|
||||
foreach(Partition entry in table.entries)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_mid = {0}", entry.dp_mid);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_sid = {0}", entry.dp_sid);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum1 = {0}", entry.dp_dum1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum2 = {0}", entry.dp_dum2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_sct = {0}", entry.dp_ipl_sct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_mid = {0}", entry.dp_mid);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_sid = {0}", entry.dp_sid);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum1 = {0}", entry.dp_dum1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_dum2 = {0}", entry.dp_dum2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_sct = {0}", entry.dp_ipl_sct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_head = {0}", entry.dp_ipl_head);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_cyl = {0}", entry.dp_ipl_cyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ssect = {0}", entry.dp_ssect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_shd = {0}", entry.dp_shd);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_scyl = {0}", entry.dp_scyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_esect = {0}", entry.dp_esect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ehd = {0}", entry.dp_ehd);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ecyl = {0}", entry.dp_ecyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ipl_cyl = {0}", entry.dp_ipl_cyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ssect = {0}", entry.dp_ssect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_shd = {0}", entry.dp_shd);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_scyl = {0}", entry.dp_scyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_esect = {0}", entry.dp_esect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ehd = {0}", entry.dp_ehd);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_ecyl = {0}", entry.dp_ecyl);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "entry.dp_name = \"{0}\"",
|
||||
StringHandlers.CToString(entry.dp_name, Encoding.GetEncoding(932)));
|
||||
@@ -128,16 +133,16 @@ public sealed class PC98 : IPartition
|
||||
|
||||
part.Size = part.Length * imagePlugin.Info.SectorSize;
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Start = {0}", part.Start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Type = {0}", part.Type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Name = {0}", part.Name);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Start = {0}", part.Start);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Type = {0}", part.Type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Name = {0}", part.Name);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Sequence = {0}", part.Sequence);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Offset = {0}", part.Offset);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Length = {0}", part.Length);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Size = {0}", part.Size);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Offset = {0}", part.Offset);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Length = {0}", part.Length);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "part.Size = {0}", part.Size);
|
||||
|
||||
if(((entry.dp_mid & 0x20) != 0x20 && (entry.dp_mid & 0x44) != 0x44) ||
|
||||
part.Start >= imagePlugin.Info.Sectors ||
|
||||
if((entry.dp_mid & 0x20) != 0x20 && (entry.dp_mid & 0x44) != 0x44 ||
|
||||
part.Start >= imagePlugin.Info.Sectors ||
|
||||
part.End > imagePlugin.Info.Sectors)
|
||||
continue;
|
||||
|
||||
@@ -148,33 +153,39 @@ public sealed class PC98 : IPartition
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static string DecodePC98Sid(byte sid)
|
||||
{
|
||||
switch(sid & 0x7F)
|
||||
{
|
||||
case 0x01: return Localization.FAT12;
|
||||
case 0x04: return Localization.PC_UX;
|
||||
case 0x06: return Localization.N88_BASIC_86;
|
||||
case 0x01:
|
||||
return Localization.FAT12;
|
||||
case 0x04:
|
||||
return Localization.PC_UX;
|
||||
case 0x06:
|
||||
return Localization.N88_BASIC_86;
|
||||
|
||||
// Supposedly for FAT16 < 32 MiB, seen in bigger partitions
|
||||
case 0x11:
|
||||
case 0x21: return Localization.FAT16;
|
||||
case 0x21:
|
||||
return Localization.FAT16;
|
||||
case 0x28:
|
||||
case 0x41:
|
||||
case 0x48: return Localization.Windows_Volume_Set;
|
||||
case 0x44: return Localization.FreeBSD;
|
||||
case 0x61: return Localization.FAT32;
|
||||
case 0x62: return Localization.Linux;
|
||||
default: return Localization.Unknown_partition_type;
|
||||
case 0x48:
|
||||
return Localization.Windows_Volume_Set;
|
||||
case 0x44:
|
||||
return Localization.FreeBSD;
|
||||
case 0x61:
|
||||
return Localization.FAT32;
|
||||
case 0x62:
|
||||
return Localization.Linux;
|
||||
default:
|
||||
return Localization.Unknown_partition_type;
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Table
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly Partition[] entries;
|
||||
}
|
||||
#region Nested type: Partition
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Partition
|
||||
@@ -197,4 +208,17 @@ public sealed class PC98 : IPartition
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly byte[] dp_name;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Table
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Table
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly Partition[] entries;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -49,10 +49,14 @@ namespace Aaru.Partitions;
|
||||
/// <summary>Implements decoding of Plan-9 partitions</summary>
|
||||
public sealed class Plan9 : IPartition
|
||||
{
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.Plan9_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("F0BF4FFC-056E-4E7C-8B65-4EAEE250ADD9");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -95,4 +99,6 @@ public sealed class Plan9 : IPartition
|
||||
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -178,10 +178,14 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
const uint FLAGS_NO_AUTOMOUNT = 0x00000002;
|
||||
const string MODULE_NAME = "Amiga Rigid Disk Block (RDB) plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.AmigaRigidDiskBlock_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("8D72ED97-1854-4170-9CE4-6E8446FD9863");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -190,7 +194,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
{
|
||||
partitions = new List<Partition>();
|
||||
ulong rdbBlock = 0;
|
||||
bool foundRdb = false;
|
||||
var foundRdb = false;
|
||||
ErrorNumber errno;
|
||||
|
||||
while(rdbBlock < 16)
|
||||
@@ -210,7 +214,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
continue;
|
||||
}
|
||||
|
||||
uint magic = BigEndianBitConverter.ToUInt32(tmpSector, 0);
|
||||
var magic = BigEndianBitConverter.ToUInt32(tmpSector, 0);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Possible_magic_at_block_0_is_1_X8, rdbBlock,
|
||||
magic);
|
||||
@@ -280,7 +284,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
rdb.HighCylinder = BigEndianBitConverter.ToUInt32(sector, 0x98);
|
||||
rdb.Reserved15 = BigEndianBitConverter.ToUInt32(sector, 0x9C);
|
||||
|
||||
byte[] tmpString = new byte[8];
|
||||
var tmpString = new byte[8];
|
||||
Array.Copy(sector, 0xA0, tmpString, 0, 8);
|
||||
rdb.DiskVendor = StringHandlers.SpacePaddedToString(tmpString);
|
||||
tmpString = new byte[16];
|
||||
@@ -311,61 +315,61 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
rdb.Reserved24 = BigEndianBitConverter.ToUInt32(sector, 0xF8);
|
||||
rdb.Reserved25 = BigEndianBitConverter.ToUInt32(sector, 0xFC);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.magic = 0x{0:X8}", rdb.Magic);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.size = {0} longs, {1} bytes", rdb.Size, rdb.Size * 4);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.checksum = 0x{0:X8}", rdb.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.targetID = {0}", rdb.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.block_size = {0}", rdb.BlockSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.badblock_ptr = {0}", rdb.BadblockPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.partition_ptr = {0}", rdb.PartitionPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.fsheader_ptr = {0}", rdb.FsheaderPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.driveinitcode = {0}", rdb.Driveinitcode);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved1 = 0x{0:X8}", rdb.Reserved1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved2 = 0x{0:X8}", rdb.Reserved2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved3 = 0x{0:X8}", rdb.Reserved3);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved4 = 0x{0:X8}", rdb.Reserved4);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved5 = 0x{0:X8}", rdb.Reserved5);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved6 = 0x{0:X8}", rdb.Reserved6);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.cylinders = {0}", rdb.Cylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.spt = {0}", rdb.Spt);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.heads = {0}", rdb.Heads);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.interleave = {0}", rdb.Interleave);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.parking = {0}", rdb.Parking);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved7 = 0x{0:X8}", rdb.Reserved7);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved8 = 0x{0:X8}", rdb.Reserved8);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved9 = 0x{0:X8}", rdb.Reserved9);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.writeprecomp = {0}", rdb.Writeprecomp);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reducedwrite = {0}", rdb.Reducedwrite);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.steprate = {0}", rdb.Steprate);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved10 = 0x{0:X8}", rdb.Reserved10);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved11 = 0x{0:X8}", rdb.Reserved11);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved12 = 0x{0:X8}", rdb.Reserved12);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved13 = 0x{0:X8}", rdb.Reserved13);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved14 = 0x{0:X8}", rdb.Reserved14);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockLow = {0}", rdb.RdbBlockLow);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockHigh = {0}", rdb.RdbBlockHigh);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.LowCylinder = {0}", rdb.LowCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.CylBlocks = {0}", rdb.CylBlocks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.AutoParkSeconds = {0}", rdb.AutoParkSeconds);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved15 = 0x{0:X8}", rdb.Reserved15);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskVendor = \"{0}\"", rdb.DiskVendor);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskProduct = \"{0}\"", rdb.DiskProduct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskRevision = \"{0}\"", rdb.DiskRevision);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerVendor = \"{0}\"", rdb.ControllerVendor);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerProduct = \"{0}\"", rdb.ControllerProduct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.magic = 0x{0:X8}", rdb.Magic);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.size = {0} longs, {1} bytes", rdb.Size, rdb.Size * 4);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.checksum = 0x{0:X8}", rdb.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.targetID = {0}", rdb.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.block_size = {0}", rdb.BlockSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.badblock_ptr = {0}", rdb.BadblockPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.partition_ptr = {0}", rdb.PartitionPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.fsheader_ptr = {0}", rdb.FsheaderPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.driveinitcode = {0}", rdb.Driveinitcode);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved1 = 0x{0:X8}", rdb.Reserved1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved2 = 0x{0:X8}", rdb.Reserved2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved3 = 0x{0:X8}", rdb.Reserved3);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved4 = 0x{0:X8}", rdb.Reserved4);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved5 = 0x{0:X8}", rdb.Reserved5);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved6 = 0x{0:X8}", rdb.Reserved6);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.cylinders = {0}", rdb.Cylinders);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.spt = {0}", rdb.Spt);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.heads = {0}", rdb.Heads);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.interleave = {0}", rdb.Interleave);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.parking = {0}", rdb.Parking);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved7 = 0x{0:X8}", rdb.Reserved7);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved8 = 0x{0:X8}", rdb.Reserved8);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved9 = 0x{0:X8}", rdb.Reserved9);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.writeprecomp = {0}", rdb.Writeprecomp);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reducedwrite = {0}", rdb.Reducedwrite);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.steprate = {0}", rdb.Steprate);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved10 = 0x{0:X8}", rdb.Reserved10);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved11 = 0x{0:X8}", rdb.Reserved11);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved12 = 0x{0:X8}", rdb.Reserved12);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved13 = 0x{0:X8}", rdb.Reserved13);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved14 = 0x{0:X8}", rdb.Reserved14);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockLow = {0}", rdb.RdbBlockLow);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.RDBBlockHigh = {0}", rdb.RdbBlockHigh);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.LowCylinder = {0}", rdb.LowCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.CylBlocks = {0}", rdb.CylBlocks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.AutoParkSeconds = {0}", rdb.AutoParkSeconds);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.HighCylinder = {0}", rdb.HighCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved15 = 0x{0:X8}", rdb.Reserved15);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskVendor = \"{0}\"", rdb.DiskVendor);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskProduct = \"{0}\"", rdb.DiskProduct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.diskRevision = \"{0}\"", rdb.DiskRevision);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerVendor = \"{0}\"", rdb.ControllerVendor);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerProduct = \"{0}\"", rdb.ControllerProduct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.controllerRevision = \"{0}\"", rdb.ControllerRevision);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved16 = 0x{0:X8}", rdb.Reserved16);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved17 = 0x{0:X8}", rdb.Reserved17);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved18 = 0x{0:X8}", rdb.Reserved18);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved19 = 0x{0:X8}", rdb.Reserved19);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved20 = 0x{0:X8}", rdb.Reserved20);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved21 = 0x{0:X8}", rdb.Reserved21);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved22 = 0x{0:X8}", rdb.Reserved22);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved23 = 0x{0:X8}", rdb.Reserved23);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved24 = 0x{0:X8}", rdb.Reserved24);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved25 = 0x{0:X8}", rdb.Reserved25);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved16 = 0x{0:X8}", rdb.Reserved16);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved17 = 0x{0:X8}", rdb.Reserved17);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved18 = 0x{0:X8}", rdb.Reserved18);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved19 = 0x{0:X8}", rdb.Reserved19);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved20 = 0x{0:X8}", rdb.Reserved20);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved21 = 0x{0:X8}", rdb.Reserved21);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved22 = 0x{0:X8}", rdb.Reserved22);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved23 = 0x{0:X8}", rdb.Reserved23);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved24 = 0x{0:X8}", rdb.Reserved24);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "RDB.reserved25 = 0x{0:X8}", rdb.Reserved25);
|
||||
|
||||
// Reading BadBlock list
|
||||
List<BadBlockList> badBlockChain = new();
|
||||
@@ -381,7 +385,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
break;
|
||||
|
||||
uint magic = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
var magic = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
|
||||
if(magic != BAD_BLOCK_LIST_MAGIC)
|
||||
break;
|
||||
@@ -407,15 +411,15 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
chainEntry.Size * 4);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.checksum = 0x{0:X8}", chainEntry.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.targetID = {0}", chainEntry.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.next_ptr = {0}", chainEntry.NextPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.targetID = {0}", chainEntry.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.next_ptr = {0}", chainEntry.NextPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "chainEntry.reserved = 0x{0:X8}", chainEntry.Reserved);
|
||||
|
||||
for(ulong i = 0; i < entries; i++)
|
||||
{
|
||||
chainEntry.BlockPairs[i].BadBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + (i * 8) + 0));
|
||||
chainEntry.BlockPairs[i].BadBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + i * 8 + 0));
|
||||
|
||||
chainEntry.BlockPairs[i].GoodBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + (i * 8) + 4));
|
||||
chainEntry.BlockPairs[i].GoodBlock = BigEndianBitConverter.ToUInt32(sector, (int)(0x18 + i * 8 + 4));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME,
|
||||
Localization.Bad_block_at_0_replaced_with_good_block_at_1,
|
||||
@@ -441,7 +445,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
break;
|
||||
|
||||
uint magic = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
var magic = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
|
||||
if(magic != PARTITION_BLOCK_MAGIC)
|
||||
break;
|
||||
@@ -500,7 +504,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
}
|
||||
};
|
||||
|
||||
byte[] driveName = new byte[32];
|
||||
var driveName = new byte[32];
|
||||
Array.Copy(sector, 0x24, driveName, 0, 32);
|
||||
partEntry.DriveName = StringHandlers.PascalToString(driveName, Encoding.GetEncoding("iso-8859-1"));
|
||||
|
||||
@@ -509,22 +513,22 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.size = {0} longs, {1} bytes", partEntry.Size,
|
||||
partEntry.Size * 4);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.checksum = 0x{0:X8}", partEntry.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.targetID = {0}", partEntry.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.next_ptr = {0}", partEntry.NextPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.flags = 0x{0:X8}", partEntry.Flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved1 = 0x{0:X8}", partEntry.Reserved1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved2 = 0x{0:X8}", partEntry.Reserved2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.devFlags = 0x{0:X8}", partEntry.DevFlags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveNameLen = {0}", partEntry.DriveNameLen);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveName = \"{0}\"", partEntry.DriveName);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved3 = 0x{0:X8}", partEntry.Reserved3);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved4 = 0x{0:X8}", partEntry.Reserved4);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved5 = 0x{0:X8}", partEntry.Reserved5);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved6 = 0x{0:X8}", partEntry.Reserved6);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved7 = 0x{0:X8}", partEntry.Reserved7);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved8 = 0x{0:X8}", partEntry.Reserved8);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved9 = 0x{0:X8}", partEntry.Reserved9);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.checksum = 0x{0:X8}", partEntry.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.targetID = {0}", partEntry.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.next_ptr = {0}", partEntry.NextPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.flags = 0x{0:X8}", partEntry.Flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved1 = 0x{0:X8}", partEntry.Reserved1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved2 = 0x{0:X8}", partEntry.Reserved2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.devFlags = 0x{0:X8}", partEntry.DevFlags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveNameLen = {0}", partEntry.DriveNameLen);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.driveName = \"{0}\"", partEntry.DriveName);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved3 = 0x{0:X8}", partEntry.Reserved3);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved4 = 0x{0:X8}", partEntry.Reserved4);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved5 = 0x{0:X8}", partEntry.Reserved5);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved6 = 0x{0:X8}", partEntry.Reserved6);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved7 = 0x{0:X8}", partEntry.Reserved7);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved8 = 0x{0:X8}", partEntry.Reserved8);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved9 = 0x{0:X8}", partEntry.Reserved9);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved10 = 0x{0:X8}", partEntry.Reserved10);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved11 = 0x{0:X8}", partEntry.Reserved11);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "partEntry.reserved12 = 0x{0:X8}", partEntry.Reserved12);
|
||||
@@ -610,7 +614,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
break;
|
||||
|
||||
uint magic = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
var magic = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
|
||||
if(magic != FILESYSTEM_HEADER_MAGIC)
|
||||
break;
|
||||
@@ -649,10 +653,10 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.size = {0} longs, {1} bytes", fshd.Size,
|
||||
fshd.Size * 4);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.checksum = 0x{0:X8}", fshd.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.targetID = {0}", fshd.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.next_ptr = {0}", fshd.NextPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.flags = 0x{0:X8}", fshd.Flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.checksum = 0x{0:X8}", fshd.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.targetID = {0}", fshd.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.next_ptr = {0}", fshd.NextPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.flags = 0x{0:X8}", fshd.Flags);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.reserved1 = 0x{0:X8}", fshd.Reserved1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.reserved2 = 0x{0:X8}", fshd.Reserved2);
|
||||
|
||||
@@ -663,20 +667,20 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.patchFlags = 0x{0:X8}", fshd.PatchFlags);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.type = {0}", fshd.Dnode.Type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.task = {0}", fshd.Dnode.Task);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.locked = {0}", fshd.Dnode.Locked);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.handler = {0}", fshd.Dnode.Handler);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.stackSize = {0}", fshd.Dnode.StackSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.priority = {0}", fshd.Dnode.Priority);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.startup = {0}", fshd.Dnode.Startup);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.type = {0}", fshd.Dnode.Type);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.task = {0}", fshd.Dnode.Task);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.locked = {0}", fshd.Dnode.Locked);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.handler = {0}", fshd.Dnode.Handler);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.stackSize = {0}", fshd.Dnode.StackSize);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.priority = {0}", fshd.Dnode.Priority);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.startup = {0}", fshd.Dnode.Startup);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.seglist_ptr = {0}", fshd.Dnode.SeglistPtr);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "FSHD.dnode.global_vec = 0x{0:X8}", fshd.Dnode.GlobalVec);
|
||||
|
||||
nextBlock = fshd.Dnode.SeglistPtr;
|
||||
bool thereAreLoadSegments = false;
|
||||
var sha1Ctx = new Sha1Context();
|
||||
var thereAreLoadSegments = false;
|
||||
var sha1Ctx = new Sha1Context();
|
||||
|
||||
while(nextBlock != 0xFFFFFFFF)
|
||||
{
|
||||
@@ -688,7 +692,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
if(errno != ErrorNumber.NoError)
|
||||
break;
|
||||
|
||||
uint magicSeg = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
var magicSeg = BigEndianBitConverter.ToUInt32(sector, 0);
|
||||
|
||||
if(magicSeg != LOAD_SEG_MAGIC)
|
||||
break;
|
||||
@@ -715,8 +719,8 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
loadSeg.Size * 4);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.checksum = 0x{0:X8}", loadSeg.Checksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.targetID = {0}", loadSeg.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.next_ptr = {0}", loadSeg.NextPtr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.targetID = {0}", loadSeg.TargetId);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "loadSeg.next_ptr = {0}", loadSeg.NextPtr);
|
||||
|
||||
segmentEntries.Add(loadSeg);
|
||||
nextBlock = loadSeg.NextPtr;
|
||||
@@ -743,11 +747,11 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
Sequence = sequence,
|
||||
Length = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) *
|
||||
rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt,
|
||||
Start = (rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt) +
|
||||
Start = rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt +
|
||||
sectorOffset,
|
||||
Type = AmigaDosTypeToString(rdbEntry.DosEnvVec.DosType),
|
||||
Scheme = Name,
|
||||
Offset = ((rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt) +
|
||||
Offset = (rdbEntry.DosEnvVec.LowCylinder * rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt +
|
||||
sectorOffset) * rdb.BlockSize,
|
||||
Size = (rdbEntry.DosEnvVec.HighCylinder + 1 - rdbEntry.DosEnvVec.LowCylinder) *
|
||||
rdbEntry.DosEnvVec.Surfaces * rdbEntry.DosEnvVec.Bpt * rdb.BlockSize
|
||||
@@ -760,34 +764,57 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static string AmigaDosTypeToDescriptionString(uint amigaDosType)
|
||||
{
|
||||
switch(amigaDosType)
|
||||
{
|
||||
case TYPEID_OFS: return Localization.Amiga_Original_File_System;
|
||||
case TYPEID_FFS: return Localization.Amiga_Fast_File_System;
|
||||
case TYPEID_OFS_INTL: return Localization.Amiga_Original_File_System_with_international_characters;
|
||||
case TYPEID_FFS_INTL: return Localization.Amiga_Fast_File_System_with_international_characters;
|
||||
case TYPEID_OFS_CACHE: return Localization.Amiga_Original_File_System_with_directory_cache;
|
||||
case TYPEID_FFS_CACHE: return Localization.Amiga_Fast_File_System_with_directory_cache;
|
||||
case TYPEID_OFS2: return Localization.Amiga_Original_File_System_with_long_filenames;
|
||||
case TYPEID_FFS2: return Localization.Amiga_Fast_File_System_with_long_filenames;
|
||||
case TYPEID_AMIX_SYSV: return Localization.Amiga_UNIX_System_V_filesystem;
|
||||
case TYPEID_AMIX_BOOT: return Localization.Amiga_UNIX_boot_filesystem;
|
||||
case TYPEID_AMIX_FFS: return Localization.Amiga_UNIX_BSD_filesystem;
|
||||
case TYPEID_AMIX_RESERVED: return Localization.Amiga_UNIX_Reserved_partition__swap_;
|
||||
case TYPEID_OFS:
|
||||
return Localization.Amiga_Original_File_System;
|
||||
case TYPEID_FFS:
|
||||
return Localization.Amiga_Fast_File_System;
|
||||
case TYPEID_OFS_INTL:
|
||||
return Localization.Amiga_Original_File_System_with_international_characters;
|
||||
case TYPEID_FFS_INTL:
|
||||
return Localization.Amiga_Fast_File_System_with_international_characters;
|
||||
case TYPEID_OFS_CACHE:
|
||||
return Localization.Amiga_Original_File_System_with_directory_cache;
|
||||
case TYPEID_FFS_CACHE:
|
||||
return Localization.Amiga_Fast_File_System_with_directory_cache;
|
||||
case TYPEID_OFS2:
|
||||
return Localization.Amiga_Original_File_System_with_long_filenames;
|
||||
case TYPEID_FFS2:
|
||||
return Localization.Amiga_Fast_File_System_with_long_filenames;
|
||||
case TYPEID_AMIX_SYSV:
|
||||
return Localization.Amiga_UNIX_System_V_filesystem;
|
||||
case TYPEID_AMIX_BOOT:
|
||||
return Localization.Amiga_UNIX_boot_filesystem;
|
||||
case TYPEID_AMIX_FFS:
|
||||
return Localization.Amiga_UNIX_BSD_filesystem;
|
||||
case TYPEID_AMIX_RESERVED:
|
||||
return Localization.Amiga_UNIX_Reserved_partition__swap_;
|
||||
case TYPEID_PFS:
|
||||
case TYPEID_PFS2:
|
||||
case TYPEID_PFS_MUSER:
|
||||
case TYPEID_AFS: return Localization.ProfessionalFileSystem;
|
||||
case TYPEID_SFS: return Localization.SmartFileSystem_v1;
|
||||
case TYPEID_SFS2: return Localization.SmartFileSystem_v2;
|
||||
case TYPEID_JXFS: return Localization.JXFS;
|
||||
case TYPEID_CROSS_DOS: return Localization.FAT_as_set_by_CrossDOS;
|
||||
case TYPEID_CROSS_MAC: return Localization.HFS_as_set_by_CrossMac;
|
||||
case TYPEID_BFFS: return Localization._4_2_UFS_for_BFFS;
|
||||
case TYPEID_OFS_MUSER: return Localization.Amiga_Original_File_System_with_multi_user_patches;
|
||||
case TYPEID_FFS_MUSER: return Localization.Amiga_Fast_File_System_with_multi_user_patches;
|
||||
case TYPEID_AFS:
|
||||
return Localization.ProfessionalFileSystem;
|
||||
case TYPEID_SFS:
|
||||
return Localization.SmartFileSystem_v1;
|
||||
case TYPEID_SFS2:
|
||||
return Localization.SmartFileSystem_v2;
|
||||
case TYPEID_JXFS:
|
||||
return Localization.JXFS;
|
||||
case TYPEID_CROSS_DOS:
|
||||
return Localization.FAT_as_set_by_CrossDOS;
|
||||
case TYPEID_CROSS_MAC:
|
||||
return Localization.HFS_as_set_by_CrossMac;
|
||||
case TYPEID_BFFS:
|
||||
return Localization._4_2_UFS_for_BFFS;
|
||||
case TYPEID_OFS_MUSER:
|
||||
return Localization.Amiga_Original_File_System_with_multi_user_patches;
|
||||
case TYPEID_FFS_MUSER:
|
||||
return Localization.Amiga_Fast_File_System_with_multi_user_patches;
|
||||
case TYPEID_OFS_INTL_MUSER:
|
||||
return Localization.Amiga_Original_File_System_with_international_characters_and_multi_user_patches;
|
||||
case TYPEID_FFS_INTL_MUSER:
|
||||
@@ -796,65 +823,99 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
return Localization.Amiga_Original_File_System_with_directory_cache_and_multi_user_patches;
|
||||
case TYPEID_FFS_CACHE_MUSER:
|
||||
return Localization.Amiga_Fast_File_System_with_directory_cache_and_multi_user_patches;
|
||||
case TYPEID_OLD_BSD_UNUSED: return Localization.BSD_unused;
|
||||
case TYPEID_OLD_BSD_SWAP: return Localization.BSD_swap;
|
||||
case TYPEID_OLD_BSD42_FFS: return Localization.BSD_4_2_FFS;
|
||||
case TYPEID_OLD_BSD44_LFS: return Localization.BSD_4_4_LFS;
|
||||
case TYPEID_NETBSD_ROOT_UNUSED: return Localization.NetBSD_unused_root_partition;
|
||||
case TYPEID_NETBSD_ROOT_42FFS: return Localization.NetBSD_4_2_FFS_root_partition;
|
||||
case TYPEID_NETBSD_ROOT_44LFS: return Localization.NetBSD_4_4_LFS_root_partition;
|
||||
case TYPEID_NETBSD_USER_UNUSED: return Localization.NetBSD_unused_user_partition;
|
||||
case TYPEID_NETBSD_USER_42FFS: return Localization.NetBSD_4_2_FFS_user_partition;
|
||||
case TYPEID_NETBSD_USER_44LFS: return Localization.NetBSD_4_4_LFS_user_partition;
|
||||
case TYPEID_NETBSD_SWAP: return Localization.NetBSD_swap_partition;
|
||||
case TYPEID_LINUX: return Localization.Linux_filesystem_partition;
|
||||
case TYPEID_LINUX_SWAP: return Localization.Linux_swap_partition;
|
||||
case TYPEID_OLD_BSD_UNUSED:
|
||||
return Localization.BSD_unused;
|
||||
case TYPEID_OLD_BSD_SWAP:
|
||||
return Localization.BSD_swap;
|
||||
case TYPEID_OLD_BSD42_FFS:
|
||||
return Localization.BSD_4_2_FFS;
|
||||
case TYPEID_OLD_BSD44_LFS:
|
||||
return Localization.BSD_4_4_LFS;
|
||||
case TYPEID_NETBSD_ROOT_UNUSED:
|
||||
return Localization.NetBSD_unused_root_partition;
|
||||
case TYPEID_NETBSD_ROOT_42FFS:
|
||||
return Localization.NetBSD_4_2_FFS_root_partition;
|
||||
case TYPEID_NETBSD_ROOT_44LFS:
|
||||
return Localization.NetBSD_4_4_LFS_root_partition;
|
||||
case TYPEID_NETBSD_USER_UNUSED:
|
||||
return Localization.NetBSD_unused_user_partition;
|
||||
case TYPEID_NETBSD_USER_42FFS:
|
||||
return Localization.NetBSD_4_2_FFS_user_partition;
|
||||
case TYPEID_NETBSD_USER_44LFS:
|
||||
return Localization.NetBSD_4_4_LFS_user_partition;
|
||||
case TYPEID_NETBSD_SWAP:
|
||||
return Localization.NetBSD_swap_partition;
|
||||
case TYPEID_LINUX:
|
||||
return Localization.Linux_filesystem_partition;
|
||||
case TYPEID_LINUX_SWAP:
|
||||
return Localization.Linux_swap_partition;
|
||||
case TYPEID_RAID_FRAME:
|
||||
case TYPEID_RAID_FRAME0: return Localization.RaidFrame_partition;
|
||||
case TYPEID_RAID_FRAME0:
|
||||
return Localization.RaidFrame_partition;
|
||||
|
||||
default:
|
||||
{
|
||||
if((amigaDosType & TYPEID_OFS) == TYPEID_OFS)
|
||||
{
|
||||
return string.Format(Localization.Unknown_Amiga_DOS_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_AMIX_SYSV) == TYPEID_AMIX_SYSV)
|
||||
{
|
||||
return string.Format(Localization.Unknown_Amiga_UNIX_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & 0x50465300) == 0x50465300 ||
|
||||
(amigaDosType & 0x41465300) == 0x41465300)
|
||||
{
|
||||
return string.Format(Localization.Unknown_ProfessionalFileSystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_SFS) == TYPEID_SFS)
|
||||
{
|
||||
return string.Format(Localization.Unknown_SmartFileSystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_OFS_MUSER) == TYPEID_OFS_MUSER)
|
||||
{
|
||||
return string.Format(Localization.Unknown_Amiga_DOS_multi_user_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_OLD_BSD_UNUSED) == TYPEID_OLD_BSD_UNUSED)
|
||||
{
|
||||
return string.Format(Localization.Unknown_BSD_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_NETBSD_ROOT_UNUSED) == TYPEID_NETBSD_ROOT_UNUSED)
|
||||
{
|
||||
return string.Format(Localization.Unknown_NetBSD_root_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_NETBSD_USER_UNUSED) == TYPEID_NETBSD_USER_UNUSED)
|
||||
{
|
||||
return string.Format(Localization.Unknown_NetBSD_user_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_NETBSD_SWAP) == TYPEID_NETBSD_SWAP)
|
||||
{
|
||||
return string.Format(Localization.Unknown_NetBSD_swap_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
if((amigaDosType & TYPEID_LINUX) == TYPEID_LINUX ||
|
||||
(amigaDosType & TYPEID_LINUX_SWAP) == TYPEID_LINUX_SWAP)
|
||||
{
|
||||
return string.Format(Localization.Unknown_Linux_filesystem_type_0,
|
||||
AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
|
||||
return string.Format(Localization.Unknown_partition_type_0, AmigaDosTypeToString(amigaDosType));
|
||||
}
|
||||
@@ -863,7 +924,7 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
|
||||
static string AmigaDosTypeToString(uint amigaDosType, bool quoted = true)
|
||||
{
|
||||
byte[] textPart = new byte[3];
|
||||
var textPart = new byte[3];
|
||||
|
||||
textPart[0] = (byte)((amigaDosType & 0xFF000000) >> 24);
|
||||
textPart[1] = (byte)((amigaDosType & 0x00FF0000) >> 16);
|
||||
@@ -874,6 +935,236 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
return quoted ? $"\"{textPartString}\\{amigaDosType & 0xFF}\"" : $"{textPartString}\\{amigaDosType & 0xFF}";
|
||||
}
|
||||
|
||||
#region Nested type: BadBlockEntry
|
||||
|
||||
/// <summary>Pair for spare blocks</summary>
|
||||
struct BadBlockEntry
|
||||
{
|
||||
/// <summary>Bad block pointer</summary>
|
||||
public uint BadBlock;
|
||||
/// <summary>Replacement block pointer</summary>
|
||||
public uint GoodBlock;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: BadBlockList
|
||||
|
||||
/// <summary>List of bad blocks and spares</summary>
|
||||
struct BadBlockList
|
||||
{
|
||||
/// <summary>"BADB"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer for next BadBlockList</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved;
|
||||
/// <summary>Bad block entries, up to block filling, 8 bytes each</summary>
|
||||
public BadBlockEntry[] BlockPairs;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DeviceNode
|
||||
|
||||
/// <summary>Device node, mostly useless, except for pointer to first LoadSegment block</summary>
|
||||
struct DeviceNode
|
||||
{
|
||||
/// <summary>Device node type, =0</summary>
|
||||
public uint Type;
|
||||
/// <summary>DOS task field, =0</summary>
|
||||
public uint Task;
|
||||
/// <summary>Unused, =0</summary>
|
||||
public uint Locked;
|
||||
/// <summary>Filename handler to LoadSegment, =0</summary>
|
||||
public uint Handler;
|
||||
/// <summary>Stack size when starting task, =0</summary>
|
||||
public uint StackSize;
|
||||
/// <summary>Task priority, =0</summary>
|
||||
public uint Priority;
|
||||
/// <summary>Startup message, =0</summary>
|
||||
public uint Startup;
|
||||
/// <summary>Pointer to first LoadSegment block</summary>
|
||||
public uint SeglistPtr;
|
||||
/// <summary>BCPL globabl vector when starting task, =0xFFFFFFFF</summary>
|
||||
public uint GlobalVec;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DosEnvironmentVector
|
||||
|
||||
/// <summary>DOSEnvVec, used by AmigaDOS</summary>
|
||||
struct DosEnvironmentVector
|
||||
{
|
||||
/// <summary>Size in longs, should be 16, minimum 11</summary>
|
||||
public uint Size;
|
||||
/// <summary>Block size in longs</summary>
|
||||
public uint BlockSize;
|
||||
/// <summary>Unknown, 0</summary>
|
||||
public uint SecOrg;
|
||||
/// <summary>Heads in drive</summary>
|
||||
public uint Surfaces;
|
||||
/// <summary>Sectors per block</summary>
|
||||
public uint Spb;
|
||||
/// <summary>Blocks per track</summary>
|
||||
public uint Bpt;
|
||||
/// <summary>DOS reserved blocks at start of partition</summary>
|
||||
public uint Reservedblocks;
|
||||
/// <summary>DOS reserved blocks at end of partition</summary>
|
||||
public uint Prealloc;
|
||||
/// <summary>Interleave</summary>
|
||||
public uint Interleave;
|
||||
/// <summary>First cylinder of a partition, inclusive</summary>
|
||||
public uint LowCylinder;
|
||||
/// <summary>Last cylinder of a partition, inclusive</summary>
|
||||
public uint HighCylinder;
|
||||
/// <summary>Buffers, usually 30</summary>
|
||||
public uint NumBuffer;
|
||||
/// <summary>Type of memory to allocate for buffers</summary>
|
||||
public uint BufMemType;
|
||||
/// <summary>Maximum transfer, usually 0x7FFFFFFF</summary>
|
||||
public uint MaxTransfer;
|
||||
/// <summary>Address mask to block out certain memory, usually 0xFFFFFFFE</summary>
|
||||
public uint Mask;
|
||||
/// <summary>Boot priority</summary>
|
||||
public uint BootPriority;
|
||||
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
|
||||
public uint DosType;
|
||||
/// <summary>Default baud rate for SER and AUX handlers</summary>
|
||||
public uint Baud;
|
||||
/// <summary>Flow control values for SER and AUX handlers</summary>
|
||||
public uint Control;
|
||||
/// <summary>Since Kickstart 2, how many boot blocks are to be loaded</summary>
|
||||
public uint BootBlocks;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: FileSystemHeader
|
||||
|
||||
/// <summary>File system header</summary>
|
||||
struct FileSystemHeader
|
||||
{
|
||||
/// <summary>"FSHD"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs, 64</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer to next FileSystemHeader block</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Flags, unknown</summary>
|
||||
public uint Flags;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved1;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved2;
|
||||
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
|
||||
public uint DosType;
|
||||
/// <summary>Filesystem version Mask 0xFFFF0000, >>16, major version Mask 0x0000FFFF, minor version</summary>
|
||||
public uint Version;
|
||||
/// <summary>Bits for DeviceNode fields that should be substituted into a standard device node</summary>
|
||||
public uint PatchFlags;
|
||||
/// <summary>Device node</summary>
|
||||
public DeviceNode Dnode;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: LoadSegment
|
||||
|
||||
/// <summary>Filesystem code</summary>
|
||||
struct LoadSegment
|
||||
{
|
||||
/// <summary>"LSEG"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer to next LoadSegment</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Executable code, with relocation hunks, til end of sector</summary>
|
||||
public byte[] LoadData;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: PartitionEntry
|
||||
|
||||
struct PartitionEntry
|
||||
{
|
||||
/// <summary>"PART"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer to next PartitionEntry</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Partition flags</summary>
|
||||
public uint Flags;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved1;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved2;
|
||||
/// <summary>Preferred flags for OpenDevice()</summary>
|
||||
public uint DevFlags;
|
||||
/// <summary>Length of drive name</summary>
|
||||
public uint DriveNameLen;
|
||||
/// <summary>Drive name, 31 bytes</summary>
|
||||
public string DriveName;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved3;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved4;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved5;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved6;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved7;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved8;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved9;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved10;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved11;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved12;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved13;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved14;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved15;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved16;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved17;
|
||||
/// <summary>DOSEnvVec, more information about partition</summary>
|
||||
public DosEnvironmentVector DosEnvVec;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: RigidDiskBlock
|
||||
|
||||
/// <summary>Amiga Rigid Disk Block, header for partitioning scheme Can be in any sector from 0 to 15, inclusive</summary>
|
||||
struct RigidDiskBlock
|
||||
{
|
||||
@@ -991,203 +1282,5 @@ public sealed class AmigaRigidDiskBlock : IPartition
|
||||
public uint Reserved25;
|
||||
}
|
||||
|
||||
/// <summary>Pair for spare blocks</summary>
|
||||
struct BadBlockEntry
|
||||
{
|
||||
/// <summary>Bad block pointer</summary>
|
||||
public uint BadBlock;
|
||||
/// <summary>Replacement block pointer</summary>
|
||||
public uint GoodBlock;
|
||||
}
|
||||
|
||||
/// <summary>List of bad blocks and spares</summary>
|
||||
struct BadBlockList
|
||||
{
|
||||
/// <summary>"BADB"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer for next BadBlockList</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved;
|
||||
/// <summary>Bad block entries, up to block filling, 8 bytes each</summary>
|
||||
public BadBlockEntry[] BlockPairs;
|
||||
}
|
||||
|
||||
/// <summary>DOSEnvVec, used by AmigaDOS</summary>
|
||||
struct DosEnvironmentVector
|
||||
{
|
||||
/// <summary>Size in longs, should be 16, minimum 11</summary>
|
||||
public uint Size;
|
||||
/// <summary>Block size in longs</summary>
|
||||
public uint BlockSize;
|
||||
/// <summary>Unknown, 0</summary>
|
||||
public uint SecOrg;
|
||||
/// <summary>Heads in drive</summary>
|
||||
public uint Surfaces;
|
||||
/// <summary>Sectors per block</summary>
|
||||
public uint Spb;
|
||||
/// <summary>Blocks per track</summary>
|
||||
public uint Bpt;
|
||||
/// <summary>DOS reserved blocks at start of partition</summary>
|
||||
public uint Reservedblocks;
|
||||
/// <summary>DOS reserved blocks at end of partition</summary>
|
||||
public uint Prealloc;
|
||||
/// <summary>Interleave</summary>
|
||||
public uint Interleave;
|
||||
/// <summary>First cylinder of a partition, inclusive</summary>
|
||||
public uint LowCylinder;
|
||||
/// <summary>Last cylinder of a partition, inclusive</summary>
|
||||
public uint HighCylinder;
|
||||
/// <summary>Buffers, usually 30</summary>
|
||||
public uint NumBuffer;
|
||||
/// <summary>Type of memory to allocate for buffers</summary>
|
||||
public uint BufMemType;
|
||||
/// <summary>Maximum transfer, usually 0x7FFFFFFF</summary>
|
||||
public uint MaxTransfer;
|
||||
/// <summary>Address mask to block out certain memory, usually 0xFFFFFFFE</summary>
|
||||
public uint Mask;
|
||||
/// <summary>Boot priority</summary>
|
||||
public uint BootPriority;
|
||||
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
|
||||
public uint DosType;
|
||||
/// <summary>Default baud rate for SER and AUX handlers</summary>
|
||||
public uint Baud;
|
||||
/// <summary>Flow control values for SER and AUX handlers</summary>
|
||||
public uint Control;
|
||||
/// <summary>Since Kickstart 2, how many boot blocks are to be loaded</summary>
|
||||
public uint BootBlocks;
|
||||
}
|
||||
|
||||
struct PartitionEntry
|
||||
{
|
||||
/// <summary>"PART"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer to next PartitionEntry</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Partition flags</summary>
|
||||
public uint Flags;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved1;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved2;
|
||||
/// <summary>Preferred flags for OpenDevice()</summary>
|
||||
public uint DevFlags;
|
||||
/// <summary>Length of drive name</summary>
|
||||
public uint DriveNameLen;
|
||||
/// <summary>Drive name, 31 bytes</summary>
|
||||
public string DriveName;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved3;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved4;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved5;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved6;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved7;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved8;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved9;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved10;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved11;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved12;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved13;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved14;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved15;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved16;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved17;
|
||||
/// <summary>DOSEnvVec, more information about partition</summary>
|
||||
public DosEnvironmentVector DosEnvVec;
|
||||
}
|
||||
|
||||
/// <summary>Device node, mostly useless, except for pointer to first LoadSegment block</summary>
|
||||
struct DeviceNode
|
||||
{
|
||||
/// <summary>Device node type, =0</summary>
|
||||
public uint Type;
|
||||
/// <summary>DOS task field, =0</summary>
|
||||
public uint Task;
|
||||
/// <summary>Unused, =0</summary>
|
||||
public uint Locked;
|
||||
/// <summary>Filename handler to LoadSegment, =0</summary>
|
||||
public uint Handler;
|
||||
/// <summary>Stack size when starting task, =0</summary>
|
||||
public uint StackSize;
|
||||
/// <summary>Task priority, =0</summary>
|
||||
public uint Priority;
|
||||
/// <summary>Startup message, =0</summary>
|
||||
public uint Startup;
|
||||
/// <summary>Pointer to first LoadSegment block</summary>
|
||||
public uint SeglistPtr;
|
||||
/// <summary>BCPL globabl vector when starting task, =0xFFFFFFFF</summary>
|
||||
public uint GlobalVec;
|
||||
}
|
||||
|
||||
/// <summary>File system header</summary>
|
||||
struct FileSystemHeader
|
||||
{
|
||||
/// <summary>"FSHD"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs, 64</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer to next FileSystemHeader block</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Flags, unknown</summary>
|
||||
public uint Flags;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved1;
|
||||
/// <summary>Reserved</summary>
|
||||
public uint Reserved2;
|
||||
/// <summary>Partition type, and filesystem driver identification for AmigaDOS</summary>
|
||||
public uint DosType;
|
||||
/// <summary>Filesystem version Mask 0xFFFF0000, >>16, major version Mask 0x0000FFFF, minor version</summary>
|
||||
public uint Version;
|
||||
/// <summary>Bits for DeviceNode fields that should be substituted into a standard device node</summary>
|
||||
public uint PatchFlags;
|
||||
/// <summary>Device node</summary>
|
||||
public DeviceNode Dnode;
|
||||
}
|
||||
|
||||
/// <summary>Filesystem code</summary>
|
||||
struct LoadSegment
|
||||
{
|
||||
/// <summary>"LSEG"</summary>
|
||||
public uint Magic;
|
||||
/// <summary>Size in longs</summary>
|
||||
public uint Size;
|
||||
/// <summary>Checksum</summary>
|
||||
public int Checksum;
|
||||
/// <summary>SCSI target ID, 7 for non-SCSI</summary>
|
||||
public uint TargetId;
|
||||
/// <summary>Pointer to next LoadSegment</summary>
|
||||
public uint NextPtr;
|
||||
/// <summary>Executable code, with relocation hunks, til end of sector</summary>
|
||||
public byte[] LoadData;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
@@ -48,10 +48,14 @@ public sealed class RioKarma : IPartition
|
||||
const ushort KARMA_MAGIC = 0xAB56;
|
||||
const byte ENTRY_MAGIC = 0x4D;
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.RioKarma_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("246A6D93-4F1A-1F8A-344D-50187A5513A9");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -72,20 +76,42 @@ public sealed class RioKarma : IPartition
|
||||
|
||||
ulong counter = 0;
|
||||
|
||||
partitions = (from entry in table.entries let part = new Partition
|
||||
{
|
||||
Start = entry.offset,
|
||||
Offset = (ulong)(entry.offset * sector.Length),
|
||||
Size = entry.size,
|
||||
Length = (ulong)(entry.size * sector.Length),
|
||||
Type = Localization.Rio_Karma,
|
||||
Sequence = counter++,
|
||||
Scheme = Name
|
||||
} where entry.type == ENTRY_MAGIC select part).ToList();
|
||||
partitions = (from entry in table.entries
|
||||
let part = new Partition
|
||||
{
|
||||
Start = entry.offset,
|
||||
Offset = (ulong)(entry.offset * sector.Length),
|
||||
Size = entry.size,
|
||||
Length = (ulong)(entry.size * sector.Length),
|
||||
Type = Localization.Rio_Karma,
|
||||
Sequence = counter++,
|
||||
Scheme = Name
|
||||
}
|
||||
where entry.type == ENTRY_MAGIC
|
||||
select part).ToList();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Entry
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Entry
|
||||
{
|
||||
public readonly uint reserved;
|
||||
public readonly byte type;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly byte[] reserved2;
|
||||
public readonly uint offset;
|
||||
public readonly uint size;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Table
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Table
|
||||
{
|
||||
@@ -98,14 +124,5 @@ public sealed class RioKarma : IPartition
|
||||
public readonly ushort magic;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Entry
|
||||
{
|
||||
public readonly uint reserved;
|
||||
public readonly byte type;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly byte[] reserved2;
|
||||
public readonly uint offset;
|
||||
public readonly uint size;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
@@ -53,10 +53,14 @@ public sealed class SGI : IPartition
|
||||
const int SGI_MAGIC = 0x0BE5A941;
|
||||
const string MODULE_NAME = "SGI Volume Header plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.SGI_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("AEF5AB45-4880-4CE8-8735-F0A402E2E5F2");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -73,10 +77,10 @@ public sealed class SGI : IPartition
|
||||
|
||||
Label dvh = Marshal.ByteArrayToStructureBigEndian<Label>(sector);
|
||||
|
||||
for(int i = 0; i < dvh.volume.Length; i++)
|
||||
for(var i = 0; i < dvh.volume.Length; i++)
|
||||
dvh.volume[i] = (Volume)Marshal.SwapStructureMembersEndian(dvh.volume[i]);
|
||||
|
||||
for(int i = 0; i < dvh.partitions.Length; i++)
|
||||
for(var i = 0; i < dvh.partitions.Length; i++)
|
||||
dvh.partitions[i] = (Partition)Marshal.SwapStructureMembersEndian(dvh.partitions[i]);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.dvh_magic_equals_0_X8_should_be_1_X8, dvh.magic,
|
||||
@@ -97,8 +101,8 @@ public sealed class SGI : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_spares_cyl = {0}",
|
||||
dvh.device_params.dp_spares_cyl);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_cyls = {0}", dvh.device_params.dp_cyls);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_shd0 = {0}", dvh.device_params.dp_shd0);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_cyls = {0}", dvh.device_params.dp_cyls);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_shd0 = {0}", dvh.device_params.dp_shd0);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_trks0 = {0}", dvh.device_params.dp_trks0);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_ctq_depth = {0}",
|
||||
@@ -122,7 +126,7 @@ public sealed class SGI : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_nretries = {0}",
|
||||
dvh.device_params.dp_nretries);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_mspw = {0}", dvh.device_params.dp_mspw);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_mspw = {0}", dvh.device_params.dp_mspw);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_xgap1 = {0}", dvh.device_params.dp_xgap1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_xsync = {0}", dvh.device_params.dp_xsync);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.device_params.dp_xrdly = {0}", dvh.device_params.dp_xrdly);
|
||||
@@ -134,7 +138,7 @@ public sealed class SGI : IPartition
|
||||
|
||||
ulong counter = 0;
|
||||
|
||||
for(int i = 0; i < dvh.partitions.Length; i++)
|
||||
for(var i = 0; i < dvh.partitions.Length; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dvh.partitions[{0}].num_blocks = {1}", i,
|
||||
dvh.partitions[i].num_blocks);
|
||||
@@ -166,86 +170,31 @@ public sealed class SGI : IPartition
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static string TypeToString(SGIType typ) => typ switch
|
||||
{
|
||||
SGIType.Header => Localization.Volume_header,
|
||||
SGIType.TrkRepl => Localization.Track_replacements,
|
||||
SGIType.SecRepl => Localization.Sector_replacements,
|
||||
SGIType.Swap => Localization.Raw_data_swap,
|
||||
SGIType.Bsd => Localization._4_2_BSD_Fast_File_System,
|
||||
SGIType.SystemV => Localization.UNIX_System_V,
|
||||
SGIType.Volume => Localization.Whole_device,
|
||||
SGIType.EFS => Localization.EFS,
|
||||
SGIType.Lvol => Localization.Logical_volume,
|
||||
SGIType.Rlvol => Localization.Raw_logical_volume,
|
||||
SGIType.XFS => Localization.XFS,
|
||||
SGIType.Xlvol => Localization.XFS_log_device,
|
||||
SGIType.Rxlvol => Localization.XLV_volume,
|
||||
SGIType.Xvm => Localization.SGI_XVM,
|
||||
SGIType.LinuxSwap => Localization.Linux_swap,
|
||||
SGIType.Linux => Localization.Linux,
|
||||
SGIType.LinuxRAID => Localization.Linux_RAID,
|
||||
_ => Localization.Unknown_partition_type
|
||||
};
|
||||
{
|
||||
SGIType.Header => Localization.Volume_header,
|
||||
SGIType.TrkRepl => Localization.Track_replacements,
|
||||
SGIType.SecRepl => Localization.Sector_replacements,
|
||||
SGIType.Swap => Localization.Raw_data_swap,
|
||||
SGIType.Bsd => Localization._4_2_BSD_Fast_File_System,
|
||||
SGIType.SystemV => Localization.UNIX_System_V,
|
||||
SGIType.Volume => Localization.Whole_device,
|
||||
SGIType.EFS => Localization.EFS,
|
||||
SGIType.Lvol => Localization.Logical_volume,
|
||||
SGIType.Rlvol => Localization.Raw_logical_volume,
|
||||
SGIType.XFS => Localization.XFS,
|
||||
SGIType.Xlvol => Localization.XFS_log_device,
|
||||
SGIType.Rxlvol => Localization.XLV_volume,
|
||||
SGIType.Xvm => Localization.SGI_XVM,
|
||||
SGIType.LinuxSwap => Localization.Linux_swap,
|
||||
SGIType.Linux => Localization.Linux,
|
||||
SGIType.LinuxRAID => Localization.Linux_RAID,
|
||||
_ => Localization.Unknown_partition_type
|
||||
};
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Label
|
||||
{
|
||||
/// <summary></summary>
|
||||
public readonly uint magic;
|
||||
/// <summary></summary>
|
||||
public readonly short root_part_num;
|
||||
/// <summary></summary>
|
||||
public readonly short swap_part_num;
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly byte[] boot_file;
|
||||
/// <summary></summary>
|
||||
public readonly DeviceParameters device_params;
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
|
||||
public readonly Volume[] volume;
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly Partition[] partitions;
|
||||
/// <summary></summary>
|
||||
public readonly uint csum;
|
||||
/// <summary></summary>
|
||||
public readonly uint padding;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Volume
|
||||
{
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] name;
|
||||
/// <summary></summary>
|
||||
public readonly uint block_num;
|
||||
/// <summary></summary>
|
||||
public readonly uint num_bytes;
|
||||
}
|
||||
|
||||
enum SGIType : uint
|
||||
{
|
||||
Header = 0, TrkRepl = 1, SecRepl = 2,
|
||||
Swap = 3, Bsd = 4, SystemV = 5,
|
||||
Volume = 6, EFS = 7, Lvol = 8,
|
||||
Rlvol = 9, XFS = 0xA, Xlvol = 0xB,
|
||||
Rxlvol = 0xC, Xvm = 0x0D, LinuxSwap = 0x82,
|
||||
Linux = 0x83, LinuxRAID = 0xFD
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct Partition
|
||||
{
|
||||
/// <summary></summary>
|
||||
public readonly uint num_blocks;
|
||||
/// <summary></summary>
|
||||
public readonly uint first_block;
|
||||
/// <summary></summary>
|
||||
public readonly SGIType type;
|
||||
}
|
||||
#region Nested type: DeviceParameters
|
||||
|
||||
struct DeviceParameters
|
||||
{
|
||||
@@ -273,4 +222,92 @@ public sealed class SGI : IPartition
|
||||
public ushort dp_xrgate;
|
||||
public ushort dp_xwcont;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Label
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Label
|
||||
{
|
||||
/// <summary></summary>
|
||||
public readonly uint magic;
|
||||
/// <summary></summary>
|
||||
public readonly short root_part_num;
|
||||
/// <summary></summary>
|
||||
public readonly short swap_part_num;
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly byte[] boot_file;
|
||||
/// <summary></summary>
|
||||
public readonly DeviceParameters device_params;
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
|
||||
public readonly Volume[] volume;
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
||||
public readonly Partition[] partitions;
|
||||
/// <summary></summary>
|
||||
public readonly uint csum;
|
||||
/// <summary></summary>
|
||||
public readonly uint padding;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Partition
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct Partition
|
||||
{
|
||||
/// <summary></summary>
|
||||
public readonly uint num_blocks;
|
||||
/// <summary></summary>
|
||||
public readonly uint first_block;
|
||||
/// <summary></summary>
|
||||
public readonly SGIType type;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: SGIType
|
||||
|
||||
enum SGIType : uint
|
||||
{
|
||||
Header = 0,
|
||||
TrkRepl = 1,
|
||||
SecRepl = 2,
|
||||
Swap = 3,
|
||||
Bsd = 4,
|
||||
SystemV = 5,
|
||||
Volume = 6,
|
||||
EFS = 7,
|
||||
Lvol = 8,
|
||||
Rlvol = 9,
|
||||
XFS = 0xA,
|
||||
Xlvol = 0xB,
|
||||
Rxlvol = 0xC,
|
||||
Xvm = 0x0D,
|
||||
LinuxSwap = 0x82,
|
||||
Linux = 0x83,
|
||||
LinuxRAID = 0xFD
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Volume
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Volume
|
||||
{
|
||||
/// <summary></summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] name;
|
||||
/// <summary></summary>
|
||||
public readonly uint block_num;
|
||||
/// <summary></summary>
|
||||
public readonly uint num_bytes;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -68,18 +68,22 @@ public sealed class SunDisklabel : IPartition
|
||||
/// <summary>Length of v_volume</summary>
|
||||
const int LEN_DKL_VVOL = 8;
|
||||
/// <summary>Size of padding in SunOS disk label</summary>
|
||||
const int LEN_DKL_PAD = DK_LABEL_SIZE - (LEN_DKL_ASCII + (NDKMAP * 8) + (14 * 2));
|
||||
const int LEN_DKL_PAD = DK_LABEL_SIZE - (LEN_DKL_ASCII + NDKMAP * 8 + 14 * 2);
|
||||
/// <summary>Size of padding in Solaris disk label with 8 partitions</summary>
|
||||
const int LEN_DKL_PAD8 = DK_LABEL_SIZE - (LEN_DKL_ASCII + 136 + // sizeof(dk_vtoc8)
|
||||
(NDKMAP * 8) + (14 * 2) + (2 * 2));
|
||||
const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16)
|
||||
(4 * 4) + (12 * 2) + (2 * 2));
|
||||
const int LEN_DKL_PAD8 = DK_LABEL_SIZE - (LEN_DKL_ASCII + 136 + // sizeof(dk_vtoc8)
|
||||
NDKMAP * 8 + 14 * 2 + 2 * 2);
|
||||
const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16)
|
||||
4 * 4 + 12 * 2 + 2 * 2);
|
||||
const string MODULE_NAME = "Sun partitions plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.SunDisklabel_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("50F35CC4-8375-4445-8DCB-1BA550C931A3");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -105,17 +109,19 @@ public sealed class SunDisklabel : IPartition
|
||||
dk_label8 dkl8 = Marshal.ByteArrayToStructureLittleEndian<dk_label8>(sunSector);
|
||||
dk_label16 dkl16 = Marshal.ByteArrayToStructureLittleEndian<dk_label16>(sunSector);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_magic = 0x{0:X4}", dkl.dkl_magic);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_sanity = 0x{0:X8}", dkl8.dkl_vtoc.v_sanity);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_magic = 0x{0:X4}", dkl.dkl_magic);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_sanity = 0x{0:X8}", dkl8.dkl_vtoc.v_sanity);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_sanity = 0x{0:X8}", dkl16.dkl_vtoc.v_sanity);
|
||||
|
||||
if(dkl.dkl_magic is DKL_MAGIC or DKL_CIGAM)
|
||||
{
|
||||
if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
|
||||
useDkl16 = true;
|
||||
else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
|
||||
useDkl8 = true;
|
||||
else
|
||||
useDkl = true;
|
||||
}
|
||||
|
||||
if(!useDkl &&
|
||||
!useDkl8 &&
|
||||
@@ -130,12 +136,14 @@ public sealed class SunDisklabel : IPartition
|
||||
dkl16 = Marshal.ByteArrayToStructureLittleEndian<dk_label16>(sunSector);
|
||||
|
||||
if(dkl.dkl_magic is DKL_MAGIC or DKL_CIGAM)
|
||||
{
|
||||
if(dkl16.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
|
||||
useDkl16 = true;
|
||||
else if(dkl8.dkl_vtoc.v_sanity is VTOC_SANE or VTOC_ENAS)
|
||||
useDkl8 = true;
|
||||
else
|
||||
useDkl = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,25 +161,25 @@ public sealed class SunDisklabel : IPartition
|
||||
|
||||
if(useDkl)
|
||||
{
|
||||
ulong sectorsPerCylinder = (ulong)(dkl.dkl_nsect * dkl.dkl_nhead);
|
||||
var sectorsPerCylinder = (ulong)(dkl.dkl_nsect * dkl.dkl_nhead);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_asciilabel = \"{0}\"",
|
||||
StringHandlers.CToString(dkl.dkl_asciilabel));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_rpm = {0}", dkl.dkl_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_pcyl = {0}", dkl.dkl_pcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_apc = {0}", dkl.dkl_apc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap1 = {0}", dkl.dkl_gap1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap2 = {0}", dkl.dkl_gap2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_rpm = {0}", dkl.dkl_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_pcyl = {0}", dkl.dkl_pcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_apc = {0}", dkl.dkl_apc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap1 = {0}", dkl.dkl_gap1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_gap2 = {0}", dkl.dkl_gap2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_intrlv = {0}", dkl.dkl_intrlv);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ncyl = {0}", dkl.dkl_ncyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_acyl = {0}", dkl.dkl_acyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nhead = {0}", dkl.dkl_nhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nsect = {0}", dkl.dkl_nsect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_bhead = {0}", dkl.dkl_bhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ppart = {0}", dkl.dkl_ppart);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ncyl = {0}", dkl.dkl_ncyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_acyl = {0}", dkl.dkl_acyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nhead = {0}", dkl.dkl_nhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_nsect = {0}", dkl.dkl_nsect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_bhead = {0}", dkl.dkl_bhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_ppart = {0}", dkl.dkl_ppart);
|
||||
|
||||
for(int i = 0; i < NDKMAP; i++)
|
||||
for(var i = 0; i < NDKMAP; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_map[{0}].dkl_cylno = {1}", i,
|
||||
dkl.dkl_map[i].dkl_cylno);
|
||||
@@ -183,7 +191,8 @@ public sealed class SunDisklabel : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl.dkl_cksum = 0x{0:X4}", dkl.dkl_cksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "sectorsPerCylinder = {0}", sectorsPerCylinder);
|
||||
|
||||
for(int i = 0; i < NDKMAP; i++)
|
||||
for(var i = 0; i < NDKMAP; i++)
|
||||
{
|
||||
if(dkl.dkl_map[i].dkl_cylno > 0 &&
|
||||
dkl.dkl_map[i].dkl_nblk > 0)
|
||||
{
|
||||
@@ -193,8 +202,8 @@ public sealed class SunDisklabel : IPartition
|
||||
Length = (ulong)(dkl.dkl_map[i].dkl_nblk * DK_LABEL_SIZE / imagePlugin.Info.SectorSize),
|
||||
Sequence = (ulong)i,
|
||||
Offset =
|
||||
(((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) * DK_LABEL_SIZE,
|
||||
Start = (((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) *
|
||||
((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) * DK_LABEL_SIZE,
|
||||
Start = ((ulong)dkl.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) *
|
||||
DK_LABEL_SIZE / imagePlugin.Info.SectorSize,
|
||||
Type = Localization.SunOS_partition,
|
||||
Scheme = Name
|
||||
@@ -204,10 +213,11 @@ public sealed class SunDisklabel : IPartition
|
||||
part.End <= imagePlugin.Info.Sectors)
|
||||
partitions.Add(part);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(useDkl8)
|
||||
{
|
||||
ulong sectorsPerCylinder = (ulong)(dkl8.dkl_nsect * dkl8.dkl_nhead);
|
||||
var sectorsPerCylinder = (ulong)(dkl8.dkl_nsect * dkl8.dkl_nhead);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_asciilabel = \"{0}\"",
|
||||
StringHandlers.CToString(dkl8.dkl_asciilabel));
|
||||
@@ -217,24 +227,24 @@ public sealed class SunDisklabel : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_volume = \"{0}\"",
|
||||
StringHandlers.CToString(dkl8.dkl_vtoc.v_volume));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_nparts = {0}", dkl8.dkl_vtoc.v_nparts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_nparts = {0}", dkl8.dkl_vtoc.v_nparts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_vtoc.v_sanity = 0x{0:X8}", dkl8.dkl_vtoc.v_sanity);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_write_reinstruct = {0}", dkl8.dkl_write_reinstruct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_read_reinstruct = {0}", dkl8.dkl_read_reinstruct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_rpm = {0}", dkl8.dkl_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_pcyl = {0}", dkl8.dkl_pcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_apc = {0}", dkl8.dkl_apc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs1 = {0}", dkl8.dkl_obs1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs2 = {0}", dkl8.dkl_obs2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_intrlv = {0}", dkl8.dkl_intrlv);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_ncyl = {0}", dkl8.dkl_ncyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_acyl = {0}", dkl8.dkl_acyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nhead = {0}", dkl8.dkl_nhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nsect = {0}", dkl8.dkl_nsect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs3 = {0}", dkl8.dkl_obs3);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs4 = {0}", dkl8.dkl_obs4);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_write_reinstruct = {0}", dkl8.dkl_write_reinstruct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_read_reinstruct = {0}", dkl8.dkl_read_reinstruct);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_rpm = {0}", dkl8.dkl_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_pcyl = {0}", dkl8.dkl_pcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_apc = {0}", dkl8.dkl_apc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs1 = {0}", dkl8.dkl_obs1);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs2 = {0}", dkl8.dkl_obs2);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_intrlv = {0}", dkl8.dkl_intrlv);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_ncyl = {0}", dkl8.dkl_ncyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_acyl = {0}", dkl8.dkl_acyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nhead = {0}", dkl8.dkl_nhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_nsect = {0}", dkl8.dkl_nsect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs3 = {0}", dkl8.dkl_obs3);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_obs4 = {0}", dkl8.dkl_obs4);
|
||||
|
||||
for(int i = 0; i < NDKMAP; i++)
|
||||
for(var i = 0; i < NDKMAP; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_map[{0}].dkl_cylno = {1}", i,
|
||||
dkl8.dkl_map[i].dkl_cylno);
|
||||
@@ -254,12 +264,13 @@ public sealed class SunDisklabel : IPartition
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_magic = 0x{0:X4}", dkl8.dkl_magic);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl8.dkl_cksum = 0x{0:X4}", dkl8.dkl_cksum);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "sectorsPerCylinder = {0}", sectorsPerCylinder);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "sectorsPerCylinder = {0}", sectorsPerCylinder);
|
||||
|
||||
if(dkl8.dkl_vtoc.v_nparts > NDKMAP)
|
||||
return false;
|
||||
|
||||
for(int i = 0; i < dkl8.dkl_vtoc.v_nparts; i++)
|
||||
for(var i = 0; i < dkl8.dkl_vtoc.v_nparts; i++)
|
||||
{
|
||||
if(dkl8.dkl_map[i].dkl_nblk > 0 &&
|
||||
dkl8.dkl_vtoc.v_part[i].p_tag != SunTag.SunEmpty &&
|
||||
dkl8.dkl_vtoc.v_part[i].p_tag != SunTag.SunWholeDisk)
|
||||
@@ -270,54 +281,57 @@ public sealed class SunDisklabel : IPartition
|
||||
Size = (ulong)dkl8.dkl_map[i].dkl_nblk * DK_LABEL_SIZE,
|
||||
Length = (ulong)(dkl8.dkl_map[i].dkl_nblk * DK_LABEL_SIZE / imagePlugin.Info.SectorSize),
|
||||
Sequence = (ulong)i,
|
||||
Offset = (((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) *
|
||||
Offset = ((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) *
|
||||
DK_LABEL_SIZE,
|
||||
Start = (((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder) + sectorOffset) *
|
||||
Start = ((ulong)dkl8.dkl_map[i].dkl_cylno * sectorsPerCylinder + sectorOffset) *
|
||||
DK_LABEL_SIZE / imagePlugin.Info.SectorSize,
|
||||
Type = SunIdToString(dkl8.dkl_vtoc.v_part[i].p_tag),
|
||||
Scheme = Name
|
||||
};
|
||||
|
||||
if(dkl8.dkl_vtoc.v_timestamp[i] != 0)
|
||||
{
|
||||
part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0,
|
||||
DateHandlers.
|
||||
UnixToDateTime(dkl8.dkl_vtoc.v_timestamp[i]));
|
||||
}
|
||||
|
||||
if(part.Start < imagePlugin.Info.Sectors &&
|
||||
part.End <= imagePlugin.Info.Sectors)
|
||||
partitions.Add(part);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_sanity = 0x{0:X8}", dkl16.dkl_vtoc.v_sanity);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_version = {0}", dkl16.dkl_vtoc.v_version);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_version = {0}", dkl16.dkl_vtoc.v_version);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_volume = \"{0}\"",
|
||||
StringHandlers.CToString(dkl16.dkl_vtoc.v_volume));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_sectorsz = {0}", dkl16.dkl_vtoc.v_sectorsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_nparts = {0}", dkl16.dkl_vtoc.v_nparts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_nparts = {0}", dkl16.dkl_vtoc.v_nparts);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_asciilabel = \"{0}\"",
|
||||
StringHandlers.CToString(dkl16.dkl_vtoc.v_asciilabel));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_pcyl = {0}", dkl16.dkl_pcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_ncyl = {0}", dkl16.dkl_ncyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_acyl = {0}", dkl16.dkl_acyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_bcyl = {0}", dkl16.dkl_bcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nhead = {0}", dkl16.dkl_nhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nsect = {0}", dkl16.dkl_nsect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_pcyl = {0}", dkl16.dkl_pcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_ncyl = {0}", dkl16.dkl_ncyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_acyl = {0}", dkl16.dkl_acyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_bcyl = {0}", dkl16.dkl_bcyl);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nhead = {0}", dkl16.dkl_nhead);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_nsect = {0}", dkl16.dkl_nsect);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_intrlv = {0}", dkl16.dkl_intrlv);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_skew = {0}", dkl16.dkl_skew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_apc = {0}", dkl16.dkl_apc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_rpm = {0}", dkl16.dkl_rpm);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_skew = {0}", dkl16.dkl_skew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_apc = {0}", dkl16.dkl_apc);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_rpm = {0}", dkl16.dkl_rpm);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_write_reinstruct = {0}", dkl16.dkl_write_reinstruct);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_read_reinstruct = {0}", dkl16.dkl_read_reinstruct);
|
||||
|
||||
for(int i = 0; i < NDKMAP16; i++)
|
||||
for(var i = 0; i < NDKMAP16; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "dkl16.dkl_vtoc.v_part[{0}].p_start = {1}", i,
|
||||
dkl16.dkl_vtoc.v_part[i].p_start);
|
||||
@@ -341,7 +355,8 @@ public sealed class SunDisklabel : IPartition
|
||||
if(dkl16.dkl_vtoc.v_nparts > NDKMAP16)
|
||||
return false;
|
||||
|
||||
for(int i = 0; i < dkl16.dkl_vtoc.v_nparts; i++)
|
||||
for(var i = 0; i < dkl16.dkl_vtoc.v_nparts; i++)
|
||||
{
|
||||
if(dkl16.dkl_vtoc.v_part[i].p_size > 0 &&
|
||||
dkl16.dkl_vtoc.v_part[i].p_tag != SunTag.SunEmpty &&
|
||||
dkl16.dkl_vtoc.v_part[i].p_tag != SunTag.SunWholeDisk)
|
||||
@@ -361,25 +376,30 @@ public sealed class SunDisklabel : IPartition
|
||||
};
|
||||
|
||||
if(dkl16.dkl_vtoc.v_timestamp[i] != 0)
|
||||
{
|
||||
part.Description += "\n" + string.Format(Localization.Partition_timestamped_on_0,
|
||||
DateHandlers.
|
||||
UnixToDateTime(dkl16.dkl_vtoc.v_timestamp[i]));
|
||||
}
|
||||
|
||||
if(part.Start < imagePlugin.Info.Sectors &&
|
||||
part.End <= imagePlugin.Info.Sectors)
|
||||
partitions.Add(part);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static dk_label SwapDiskLabel(dk_label label)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label);
|
||||
label = (dk_label)Marshal.SwapStructureMembersEndian(label);
|
||||
|
||||
for(int i = 0; i < label.dkl_map.Length; i++)
|
||||
for(var i = 0; i < label.dkl_map.Length; i++)
|
||||
label.dkl_map[i] = (dk_map)Marshal.SwapStructureMembersEndian(label.dkl_map[i]);
|
||||
|
||||
return label;
|
||||
@@ -390,22 +410,22 @@ public sealed class SunDisklabel : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label8);
|
||||
label = (dk_label8)Marshal.SwapStructureMembersEndian(label);
|
||||
|
||||
for(int i = 0; i < label.dkl_map.Length; i++)
|
||||
for(var i = 0; i < label.dkl_map.Length; i++)
|
||||
label.dkl_map[i] = (dk_map)Marshal.SwapStructureMembersEndian(label.dkl_map[i]);
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
|
||||
label.dkl_vtoc.v_bootinfo[i] = Swapping.Swap(label.dkl_vtoc.v_bootinfo[i]);
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_part.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_part.Length; i++)
|
||||
{
|
||||
label.dkl_vtoc.v_part[i].p_flag = (SunFlags)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_flag);
|
||||
label.dkl_vtoc.v_part[i].p_tag = (SunTag)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_tag);
|
||||
}
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
|
||||
label.dkl_vtoc.v_timestamp[i] = Swapping.Swap(label.dkl_vtoc.v_timestamp[i]);
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
|
||||
label.dkl_vtoc.v_reserved[i] = Swapping.Swap(label.dkl_vtoc.v_reserved[i]);
|
||||
|
||||
return label;
|
||||
@@ -416,10 +436,10 @@ public sealed class SunDisklabel : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Swapping_dk_label16);
|
||||
label = (dk_label16)Marshal.SwapStructureMembersEndian(label);
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_bootinfo.Length; i++)
|
||||
label.dkl_vtoc.v_bootinfo[i] = Swapping.Swap(label.dkl_vtoc.v_bootinfo[i]);
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_part.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_part.Length; i++)
|
||||
{
|
||||
label.dkl_vtoc.v_part[i].p_flag = (SunFlags)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_flag);
|
||||
label.dkl_vtoc.v_part[i].p_tag = (SunTag)Swapping.Swap((ushort)label.dkl_vtoc.v_part[i].p_tag);
|
||||
@@ -427,10 +447,10 @@ public sealed class SunDisklabel : IPartition
|
||||
label.dkl_vtoc.v_part[i].p_start = Swapping.Swap(label.dkl_vtoc.v_part[i].p_start);
|
||||
}
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_timestamp.Length; i++)
|
||||
label.dkl_vtoc.v_timestamp[i] = Swapping.Swap(label.dkl_vtoc.v_timestamp[i]);
|
||||
|
||||
for(int i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
|
||||
for(var i = 0; i < label.dkl_vtoc.v_reserved.Length; i++)
|
||||
label.dkl_vtoc.v_reserved[i] = Swapping.Swap(label.dkl_vtoc.v_reserved[i]);
|
||||
|
||||
return label;
|
||||
@@ -450,61 +470,35 @@ public sealed class SunDisklabel : IPartition
|
||||
}
|
||||
|
||||
static string SunIdToString(SunTag id) => id switch
|
||||
{
|
||||
SunTag.Linux => Localization.Linux,
|
||||
SunTag.LinuxRaid => Localization.Linux_RAID,
|
||||
SunTag.LinuxSwap => Localization.Linux_swap,
|
||||
SunTag.LVM => Localization.LVM,
|
||||
SunTag.SunBoot => Localization.Sun_boot,
|
||||
SunTag.SunEmpty => Localization.Empty,
|
||||
SunTag.SunHome => Localization.Sun_home,
|
||||
SunTag.SunRoot => Localization.Sun_root,
|
||||
SunTag.SunStand => Localization.Sun_stand,
|
||||
SunTag.SunSwap => Localization.Sun_swap,
|
||||
SunTag.SunUsr => Localization.Sun_usr,
|
||||
SunTag.SunVar => Localization.Sun_var,
|
||||
SunTag.SunWholeDisk => Localization.Whole_disk,
|
||||
SunTag.SunAlt => Localization.Replacement_sectors,
|
||||
SunTag.SunCache => Localization.Sun_cachefs,
|
||||
SunTag.SunReserved => Localization.Reserved_for_SMI,
|
||||
SunTag.VxVmPublic => Localization.Veritas_public,
|
||||
SunTag.VxVmPrivate => Localization.Veritas_private,
|
||||
SunTag.NetBSD => Localization.NetBSD,
|
||||
SunTag.FreeBSD_Swap => Localization.FreeBSD_swap,
|
||||
SunTag.FreeBSD_UFS => Localization.FreeBSD,
|
||||
SunTag.FreeBSD_Vinum => Localization.Vinum,
|
||||
SunTag.FreeBSD_ZFS => Localization.FreeBSD_ZFS,
|
||||
SunTag.FreeBSD_NANDFS => Localization.FreeBSD_nandfs,
|
||||
_ => Localization.Unknown_partition_type
|
||||
};
|
||||
{
|
||||
SunTag.Linux => Localization.Linux,
|
||||
SunTag.LinuxRaid => Localization.Linux_RAID,
|
||||
SunTag.LinuxSwap => Localization.Linux_swap,
|
||||
SunTag.LVM => Localization.LVM,
|
||||
SunTag.SunBoot => Localization.Sun_boot,
|
||||
SunTag.SunEmpty => Localization.Empty,
|
||||
SunTag.SunHome => Localization.Sun_home,
|
||||
SunTag.SunRoot => Localization.Sun_root,
|
||||
SunTag.SunStand => Localization.Sun_stand,
|
||||
SunTag.SunSwap => Localization.Sun_swap,
|
||||
SunTag.SunUsr => Localization.Sun_usr,
|
||||
SunTag.SunVar => Localization.Sun_var,
|
||||
SunTag.SunWholeDisk => Localization.Whole_disk,
|
||||
SunTag.SunAlt => Localization.Replacement_sectors,
|
||||
SunTag.SunCache => Localization.Sun_cachefs,
|
||||
SunTag.SunReserved => Localization.Reserved_for_SMI,
|
||||
SunTag.VxVmPublic => Localization.Veritas_public,
|
||||
SunTag.VxVmPrivate => Localization.Veritas_private,
|
||||
SunTag.NetBSD => Localization.NetBSD,
|
||||
SunTag.FreeBSD_Swap => Localization.FreeBSD_swap,
|
||||
SunTag.FreeBSD_UFS => Localization.FreeBSD,
|
||||
SunTag.FreeBSD_Vinum => Localization.Vinum,
|
||||
SunTag.FreeBSD_ZFS => Localization.FreeBSD_ZFS,
|
||||
SunTag.FreeBSD_NANDFS => Localization.FreeBSD_nandfs,
|
||||
_ => Localization.Unknown_partition_type
|
||||
};
|
||||
|
||||
enum SunTag : ushort
|
||||
{
|
||||
SunEmpty = 0x0000, SunBoot = 0x0001, SunRoot = 0x0002,
|
||||
SunSwap = 0x0003, SunUsr = 0x0004, SunWholeDisk = 0x0005,
|
||||
SunStand = 0x0006, SunVar = 0x0007, SunHome = 0x0008,
|
||||
SunAlt = 0x0009, SunCache = 0x000A, SunReserved = 0x000B,
|
||||
VxVmPublic = 0x000E, VxVmPrivate = 0x000F, LinuxSwap = 0x0082,
|
||||
Linux = 0x0083, LVM = 0x008E, LinuxRaid = 0x00FD,
|
||||
NetBSD = 0x00FF, FreeBSD_Swap = 0x0901, FreeBSD_UFS = 0x0902,
|
||||
FreeBSD_Vinum = 0x0903, FreeBSD_ZFS = 0x0904, FreeBSD_NANDFS = 0x0905
|
||||
}
|
||||
|
||||
[Flags]
|
||||
enum SunFlags : ushort
|
||||
{
|
||||
NoMount = 0x0001, ReadOnly = 0x0010
|
||||
}
|
||||
|
||||
/// <summary>SunOS logical partitions</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_map
|
||||
{
|
||||
/// <summary>starting cylinder</summary>
|
||||
public readonly int dkl_cylno;
|
||||
/// <summary>number of blocks</summary>
|
||||
public readonly int dkl_nblk;
|
||||
}
|
||||
#region Nested type: dk_label
|
||||
|
||||
/// <summary>SunOS disk label</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -549,88 +543,54 @@ public sealed class SunDisklabel : IPartition
|
||||
public readonly ushort dkl_cksum;
|
||||
}
|
||||
|
||||
/// <summary>Solaris logical partition for small disk label</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_map2
|
||||
{
|
||||
/// <summary> ID tag of partition</summary>
|
||||
public SunTag p_tag;
|
||||
/// <summary> permission flag</summary>
|
||||
public SunFlags p_flag;
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>Solaris logical partition</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dkl_partition
|
||||
{
|
||||
/// <summary>ID tag of partition</summary>
|
||||
public SunTag p_tag;
|
||||
/// <summary>permision flags</summary>
|
||||
public SunFlags p_flag;
|
||||
/// <summary>start sector no of partition</summary>
|
||||
public int p_start;
|
||||
/// <summary># of blocks in partition</summary>
|
||||
public int p_size;
|
||||
}
|
||||
#region Nested type: dk_label16
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_vtoc8
|
||||
struct dk_label16
|
||||
{
|
||||
/// <summary> layout version</summary>
|
||||
public readonly uint v_version;
|
||||
/// <summary> volume name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
|
||||
public readonly byte[] v_volume;
|
||||
/// <summary> number of partitions </summary>
|
||||
public readonly ushort v_nparts;
|
||||
/// <summary> partition hdrs, sec 2</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
|
||||
public readonly dk_map2[] v_part;
|
||||
/// <summary>Alignment</summary>
|
||||
public readonly ushort padding;
|
||||
/// <summary> info needed by mboot</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly uint[] v_bootinfo;
|
||||
/// <summary> to verify vtoc sanity</summary>
|
||||
public readonly uint v_sanity;
|
||||
/// <summary> free space</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved;
|
||||
/// <summary> partition timestamp</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
|
||||
public readonly int[] v_timestamp;
|
||||
/// <summary>vtoc inclusions from AT&T SVr4</summary>
|
||||
public readonly dk_vtoc16 dkl_vtoc;
|
||||
/// <summary># of physical cylinders</summary>
|
||||
public readonly uint dkl_pcyl;
|
||||
/// <summary># of data cylinders</summary>
|
||||
public readonly uint dkl_ncyl;
|
||||
/// <summary># of alternate cylinders</summary>
|
||||
public readonly ushort dkl_acyl;
|
||||
/// <summary>cyl offset (for fixed head area)</summary>
|
||||
public readonly ushort dkl_bcyl;
|
||||
/// <summary># of heads</summary>
|
||||
public readonly uint dkl_nhead;
|
||||
/// <summary># of data sectors per track</summary>
|
||||
public readonly uint dkl_nsect;
|
||||
/// <summary>interleave factor</summary>
|
||||
public readonly ushort dkl_intrlv;
|
||||
/// <summary>skew factor</summary>
|
||||
public readonly ushort dkl_skew;
|
||||
/// <summary>alternates per cyl (SCSI only) </summary>
|
||||
public readonly ushort dkl_apc;
|
||||
/// <summary>revolutions per minute</summary>
|
||||
public readonly ushort dkl_rpm;
|
||||
/// <summary># sectors to skip, writes</summary>
|
||||
public readonly ushort dkl_write_reinstruct;
|
||||
/// <summary># sectors to skip, reads </summary>
|
||||
public readonly ushort dkl_read_reinstruct;
|
||||
/// <summary>for compatible expansion</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
public readonly ushort[] dkl_extra;
|
||||
/// <summary>unused part of 512 bytes</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_PAD16)]
|
||||
public readonly byte[] dkl_pad;
|
||||
/// <summary>identifies this label format</summary>
|
||||
public readonly ushort dkl_magic;
|
||||
/// <summary>xor checksum of sector</summary>
|
||||
public readonly ushort dkl_cksum;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_vtoc16
|
||||
{
|
||||
/// <summary>info needed by mboot</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly uint[] v_bootinfo;
|
||||
/// <summary>to verify vtoc sanity</summary>
|
||||
public readonly uint v_sanity;
|
||||
/// <summary>layout version</summary>
|
||||
public readonly uint v_version;
|
||||
/// <summary>volume name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
|
||||
public readonly byte[] v_volume;
|
||||
/// <summary>sector size in bytes</summary>
|
||||
public readonly ushort v_sectorsz;
|
||||
/// <summary>number of partitions</summary>
|
||||
public readonly ushort v_nparts;
|
||||
/// <summary>free space</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved;
|
||||
/// <summary>partition headers</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
|
||||
public readonly dkl_partition[] v_part;
|
||||
/// <summary>partition timestamp</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
|
||||
public readonly int[] v_timestamp;
|
||||
/// <summary>for compatibility</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_ASCII)]
|
||||
public readonly byte[] v_asciilabel;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Nested type: dk_label8
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_label8
|
||||
@@ -680,44 +640,161 @@ public sealed class SunDisklabel : IPartition
|
||||
public readonly ushort dkl_cksum;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: dk_map
|
||||
|
||||
/// <summary>SunOS logical partitions</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_label16
|
||||
struct dk_map
|
||||
{
|
||||
/// <summary>vtoc inclusions from AT&T SVr4</summary>
|
||||
public readonly dk_vtoc16 dkl_vtoc;
|
||||
/// <summary># of physical cylinders</summary>
|
||||
public readonly uint dkl_pcyl;
|
||||
/// <summary># of data cylinders</summary>
|
||||
public readonly uint dkl_ncyl;
|
||||
/// <summary># of alternate cylinders</summary>
|
||||
public readonly ushort dkl_acyl;
|
||||
/// <summary>cyl offset (for fixed head area)</summary>
|
||||
public readonly ushort dkl_bcyl;
|
||||
/// <summary># of heads</summary>
|
||||
public readonly uint dkl_nhead;
|
||||
/// <summary># of data sectors per track</summary>
|
||||
public readonly uint dkl_nsect;
|
||||
/// <summary>interleave factor</summary>
|
||||
public readonly ushort dkl_intrlv;
|
||||
/// <summary>skew factor</summary>
|
||||
public readonly ushort dkl_skew;
|
||||
/// <summary>alternates per cyl (SCSI only) </summary>
|
||||
public readonly ushort dkl_apc;
|
||||
/// <summary>revolutions per minute</summary>
|
||||
public readonly ushort dkl_rpm;
|
||||
/// <summary># sectors to skip, writes</summary>
|
||||
public readonly ushort dkl_write_reinstruct;
|
||||
/// <summary># sectors to skip, reads </summary>
|
||||
public readonly ushort dkl_read_reinstruct;
|
||||
/// <summary>for compatible expansion</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||
public readonly ushort[] dkl_extra;
|
||||
/// <summary>unused part of 512 bytes</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_PAD16)]
|
||||
public readonly byte[] dkl_pad;
|
||||
/// <summary>identifies this label format</summary>
|
||||
public readonly ushort dkl_magic;
|
||||
/// <summary>xor checksum of sector</summary>
|
||||
public readonly ushort dkl_cksum;
|
||||
/// <summary>starting cylinder</summary>
|
||||
public readonly int dkl_cylno;
|
||||
/// <summary>number of blocks</summary>
|
||||
public readonly int dkl_nblk;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: dk_map2
|
||||
|
||||
/// <summary>Solaris logical partition for small disk label</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_map2
|
||||
{
|
||||
/// <summary> ID tag of partition</summary>
|
||||
public SunTag p_tag;
|
||||
/// <summary> permission flag</summary>
|
||||
public SunFlags p_flag;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: dk_vtoc16
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_vtoc16
|
||||
{
|
||||
/// <summary>info needed by mboot</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly uint[] v_bootinfo;
|
||||
/// <summary>to verify vtoc sanity</summary>
|
||||
public readonly uint v_sanity;
|
||||
/// <summary>layout version</summary>
|
||||
public readonly uint v_version;
|
||||
/// <summary>volume name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
|
||||
public readonly byte[] v_volume;
|
||||
/// <summary>sector size in bytes</summary>
|
||||
public readonly ushort v_sectorsz;
|
||||
/// <summary>number of partitions</summary>
|
||||
public readonly ushort v_nparts;
|
||||
/// <summary>free space</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved;
|
||||
/// <summary>partition headers</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
|
||||
public readonly dkl_partition[] v_part;
|
||||
/// <summary>partition timestamp</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP16)]
|
||||
public readonly int[] v_timestamp;
|
||||
/// <summary>for compatibility</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_ASCII)]
|
||||
public readonly byte[] v_asciilabel;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: dk_vtoc8
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dk_vtoc8
|
||||
{
|
||||
/// <summary> layout version</summary>
|
||||
public readonly uint v_version;
|
||||
/// <summary> volume name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = LEN_DKL_VVOL)]
|
||||
public readonly byte[] v_volume;
|
||||
/// <summary> number of partitions </summary>
|
||||
public readonly ushort v_nparts;
|
||||
/// <summary> partition hdrs, sec 2</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
|
||||
public readonly dk_map2[] v_part;
|
||||
/// <summary>Alignment</summary>
|
||||
public readonly ushort padding;
|
||||
/// <summary> info needed by mboot</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly uint[] v_bootinfo;
|
||||
/// <summary> to verify vtoc sanity</summary>
|
||||
public readonly uint v_sanity;
|
||||
/// <summary> free space</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved;
|
||||
/// <summary> partition timestamp</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NDKMAP)]
|
||||
public readonly int[] v_timestamp;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: dkl_partition
|
||||
|
||||
/// <summary>Solaris logical partition</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct dkl_partition
|
||||
{
|
||||
/// <summary>ID tag of partition</summary>
|
||||
public SunTag p_tag;
|
||||
/// <summary>permision flags</summary>
|
||||
public SunFlags p_flag;
|
||||
/// <summary>start sector no of partition</summary>
|
||||
public int p_start;
|
||||
/// <summary># of blocks in partition</summary>
|
||||
public int p_size;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: SunFlags
|
||||
|
||||
[Flags]
|
||||
enum SunFlags : ushort
|
||||
{
|
||||
NoMount = 0x0001,
|
||||
ReadOnly = 0x0010
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: SunTag
|
||||
|
||||
enum SunTag : ushort
|
||||
{
|
||||
SunEmpty = 0x0000,
|
||||
SunBoot = 0x0001,
|
||||
SunRoot = 0x0002,
|
||||
SunSwap = 0x0003,
|
||||
SunUsr = 0x0004,
|
||||
SunWholeDisk = 0x0005,
|
||||
SunStand = 0x0006,
|
||||
SunVar = 0x0007,
|
||||
SunHome = 0x0008,
|
||||
SunAlt = 0x0009,
|
||||
SunCache = 0x000A,
|
||||
SunReserved = 0x000B,
|
||||
VxVmPublic = 0x000E,
|
||||
VxVmPrivate = 0x000F,
|
||||
LinuxSwap = 0x0082,
|
||||
Linux = 0x0083,
|
||||
LVM = 0x008E,
|
||||
LinuxRaid = 0x00FD,
|
||||
NetBSD = 0x00FF,
|
||||
FreeBSD_Swap = 0x0901,
|
||||
FreeBSD_UFS = 0x0902,
|
||||
FreeBSD_Vinum = 0x0903,
|
||||
FreeBSD_ZFS = 0x0904,
|
||||
FreeBSD_NANDFS = 0x0905
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -1373,10 +1373,14 @@ public sealed class UNIX : IPartition
|
||||
}
|
||||
};
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.UNIX_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("9ED7E30B-53BF-4619-87A0-5D2002155617");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -1465,14 +1469,17 @@ public sealed class UNIX : IPartition
|
||||
parts = RP06;
|
||||
|
||||
break;
|
||||
default: return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int i = 0; i < parts.Length; i++)
|
||||
for(var i = 0; i < parts.Length; i++)
|
||||
parts[i].Scheme = "";
|
||||
|
||||
partitions = parts.ToList();
|
||||
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -57,10 +57,14 @@ public sealed class VTOC : IPartition
|
||||
const uint XPDVERS = 3; /* 1st version of extended pdinfo */
|
||||
const string MODULE_NAME = "UNIX VTOC plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.VTOC_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("6D35A66F-8D77-426F-A562-D88F6A1F1702");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -72,14 +76,11 @@ public sealed class VTOC : IPartition
|
||||
uint magic = 0;
|
||||
ulong pdloc = 0;
|
||||
byte[] pdsector = null;
|
||||
bool magicFound = false;
|
||||
bool absolute = false;
|
||||
var magicFound = false;
|
||||
var absolute = false;
|
||||
ErrorNumber errno;
|
||||
|
||||
foreach(ulong i in new ulong[]
|
||||
{
|
||||
0, 1, 8, 29
|
||||
}.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
|
||||
foreach(ulong i in new ulong[] { 0, 1, 8, 29 }.TakeWhile(i => i + sectorOffset < imagePlugin.Info.Sectors))
|
||||
{
|
||||
errno = imagePlugin.ReadSector(i + sectorOffset, out pdsector);
|
||||
|
||||
@@ -122,48 +123,48 @@ public sealed class VTOC : IPartition
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sanity = 0x{0:X8} (should be 0x{1:X8})", pd.sanity, PD_MAGIC);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.version = {0}", pd.version);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.version = {0}", pd.version);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.serial = \"{0}\"", StringHandlers.CToString(pd.serial));
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.cyls = {0}", pd.cyls);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.tracks = {0}", pd.tracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sectors = {0}", pd.sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.bytes = {0}", pd.bytes);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.logicalst = {0}", pd.logicalst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogst = {0}", pd.errlogst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogsz = {0}", pd.errlogsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgst = {0}", pd.mfgst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgsz = {0}", pd.mfgsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectst = {0}", pd.defectst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectsz = {0}", pd.defectsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relno = {0}", pd.relno);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relst = {0}", pd.relst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relsz = {0}", pd.relsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relnext = {0}", pd.relnext);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcstrt = {0}", pdold.allcstrt);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcend = {0}", pdold.allcend);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_ptr = {0}", pd.vtoc_ptr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_len = {0}", pd.vtoc_len);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_pad = {0}", pd.vtoc_pad);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_ptr = {0}", pd.alt_ptr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_len = {0}", pd.alt_len);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pcyls = {0}", pd.pcyls);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.ptracks = {0}", pd.ptracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.psectors = {0}", pd.psectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pbytes = {0}", pd.pbytes);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.secovhd = {0}", pd.secovhd);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.cyls = {0}", pd.cyls);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.tracks = {0}", pd.tracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.sectors = {0}", pd.sectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.bytes = {0}", pd.bytes);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.logicalst = {0}", pd.logicalst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogst = {0}", pd.errlogst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.errlogsz = {0}", pd.errlogsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgst = {0}", pd.mfgst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.mfgsz = {0}", pd.mfgsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectst = {0}", pd.defectst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.defectsz = {0}", pd.defectsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relno = {0}", pd.relno);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relst = {0}", pd.relst);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relsz = {0}", pd.relsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.relnext = {0}", pd.relnext);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcstrt = {0}", pdold.allcstrt);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.allcend = {0}", pdold.allcend);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_ptr = {0}", pd.vtoc_ptr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_len = {0}", pd.vtoc_len);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.vtoc_pad = {0}", pd.vtoc_pad);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_ptr = {0}", pd.alt_ptr);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.alt_len = {0}", pd.alt_len);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pcyls = {0}", pd.pcyls);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.ptracks = {0}", pd.ptracks);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.psectors = {0}", pd.psectors);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pbytes = {0}", pd.pbytes);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.secovhd = {0}", pd.secovhd);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.interleave = {0}", pd.interleave);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.skew = {0}", pd.skew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[0] = {0}", pd.pad[0]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[1] = {0}", pd.pad[1]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[2] = {0}", pd.pad[2]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[3] = {0}", pd.pad[3]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[4] = {0}", pd.pad[4]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[5] = {0}", pd.pad[5]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[6] = {0}", pd.pad[6]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[7] = {0}", pd.pad[7]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.skew = {0}", pd.skew);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[0] = {0}", pd.pad[0]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[1] = {0}", pd.pad[1]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[2] = {0}", pd.pad[2]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[3] = {0}", pd.pad[3]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[4] = {0}", pd.pad[4]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[5] = {0}", pd.pad[5]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[6] = {0}", pd.pad[6]);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "pdinfo.pad[7] = {0}", pd.pad[7]);
|
||||
|
||||
magicFound = false;
|
||||
bool useOld = false;
|
||||
var useOld = false;
|
||||
errno = imagePlugin.ReadSector(pdloc + sectorOffset + 1, out byte[] vtocsector);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
@@ -184,7 +185,7 @@ public sealed class VTOC : IPartition
|
||||
{
|
||||
vtoc = Marshal.ByteArrayToStructureBigEndian<vtoc>(vtocsector);
|
||||
|
||||
for(int i = 0; i < vtoc.v_part.Length; i++)
|
||||
for(var i = 0; i < vtoc.v_part.Length; i++)
|
||||
{
|
||||
vtoc.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtoc.v_part[i].p_tag);
|
||||
vtoc.v_part[i].p_flag = (pFlag)Swapping.Swap((ushort)vtoc.v_part[i].p_flag);
|
||||
@@ -212,7 +213,7 @@ public sealed class VTOC : IPartition
|
||||
{
|
||||
vtocOld = Marshal.ByteArrayToStructureBigEndian<vtocold>(vtocsector);
|
||||
|
||||
for(int i = 0; i < vtocOld.v_part.Length; i++)
|
||||
for(var i = 0; i < vtocOld.v_part.Length; i++)
|
||||
{
|
||||
vtocOld.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtocOld.v_part[i].p_tag);
|
||||
vtocOld.v_part[i].p_flag = (pFlag)Swapping.Swap((ushort)vtocOld.v_part[i].p_flag);
|
||||
@@ -265,7 +266,7 @@ public sealed class VTOC : IPartition
|
||||
{
|
||||
vtoc = Marshal.ByteArrayToStructureBigEndian<vtoc>(vtocsector);
|
||||
|
||||
for(int i = 0; i < vtoc.v_part.Length; i++)
|
||||
for(var i = 0; i < vtoc.v_part.Length; i++)
|
||||
{
|
||||
vtoc.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtoc.v_part[i].p_tag);
|
||||
vtoc.v_part[i].p_flag = (pFlag)Swapping.Swap((ushort)vtoc.v_part[i].p_flag);
|
||||
@@ -295,9 +296,9 @@ public sealed class VTOC : IPartition
|
||||
StringHandlers.CToString(vtocOld.v_volume));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_sectorsz = {0}", vtocOld.v_sectorsz);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_nparts = {0}", vtocOld.v_nparts);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_nparts = {0}", vtocOld.v_nparts);
|
||||
|
||||
for(int i = 0; i < V_NUMPAR; i++)
|
||||
for(var i = 0; i < V_NUMPAR; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtocOld.v_part[{0}].p_tag = {1} ({2})", i,
|
||||
vtocOld.v_part[i].p_tag, (ushort)vtocOld.v_part[i].p_tag);
|
||||
@@ -325,10 +326,10 @@ public sealed class VTOC : IPartition
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_volume = \"{0}\"",
|
||||
StringHandlers.CToString(vtoc.v_volume));
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_pad = {0}", vtoc.v_pad);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_pad = {0}", vtoc.v_pad);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_nparts = {0}", vtoc.v_nparts);
|
||||
|
||||
for(int i = 0; i < V_NUMPAR; i++)
|
||||
for(var i = 0; i < V_NUMPAR; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "vtoc.v_part[{0}].p_tag = {1} ({2})", i, vtoc.v_part[i].p_tag,
|
||||
(ushort)vtoc.v_part[i].p_tag);
|
||||
@@ -364,7 +365,8 @@ public sealed class VTOC : IPartition
|
||||
|
||||
// Check for a partition describing the VTOC whose start is the same as the start we know.
|
||||
// This means partition starts are absolute, not relative, to the VTOC position
|
||||
for(int i = 0; i < V_NUMPAR; i++)
|
||||
for(var i = 0; i < V_NUMPAR; i++)
|
||||
{
|
||||
if(parts[i].p_tag == pTag.V_BACKUP &&
|
||||
(ulong)parts[i].p_start == sectorOffset)
|
||||
{
|
||||
@@ -372,8 +374,10 @@ public sealed class VTOC : IPartition
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = 0; i < V_NUMPAR; i++)
|
||||
for(var i = 0; i < V_NUMPAR; i++)
|
||||
{
|
||||
if(parts[i].p_tag != pTag.V_UNUSED)
|
||||
{
|
||||
var part = new Partition
|
||||
@@ -387,7 +391,7 @@ public sealed class VTOC : IPartition
|
||||
Scheme = Name
|
||||
};
|
||||
|
||||
string info = "";
|
||||
var info = "";
|
||||
|
||||
// Apparently old ones are absolute :?
|
||||
if(!useOld &&
|
||||
@@ -420,30 +424,59 @@ public sealed class VTOC : IPartition
|
||||
if(part.End < imagePlugin.Info.Sectors)
|
||||
partitions.Add(part);
|
||||
}
|
||||
}
|
||||
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
static string DecodeUnixtag(pTag type, bool isNew) => type switch
|
||||
{
|
||||
pTag.V_UNUSED => Localization.Unused,
|
||||
pTag.V_BOOT => Localization.Boot,
|
||||
pTag.V_ROOT => "/",
|
||||
pTag.V_SWAP => Localization.swap,
|
||||
pTag.V_USER => "/usr",
|
||||
pTag.V_BACKUP => Localization.Whole_disk,
|
||||
pTag.V_STAND_OLD => isNew
|
||||
? "Stand"
|
||||
: Localization.Alternate_sector_space,
|
||||
pTag.V_VAR_OLD => isNew ? "/var" : Localization.non_UNIX,
|
||||
pTag.V_HOME_OLD => isNew
|
||||
? "/home"
|
||||
: Localization.Alternate_track_space,
|
||||
pTag.V_ALTSCTR_OLD => isNew
|
||||
? Localization.Alternate_sector_track
|
||||
: "Stand",
|
||||
pTag.V_CACHE => isNew ? Localization.Cache : "/var",
|
||||
pTag.V_RESERVED =>
|
||||
isNew ? Localization.Reserved : "/home",
|
||||
pTag.V_DUMP => Localization.dump,
|
||||
pTag.V_ALTSCTR => Localization.Alternate_sector_track,
|
||||
pTag.V_VMPUBLIC => Localization.
|
||||
volume_mgt_public_partition,
|
||||
pTag.V_VMPRIVATE => Localization.
|
||||
volume_mgt_private_partition,
|
||||
_ => string.Format(Localization.Unknown_TAG_0, type)
|
||||
};
|
||||
|
||||
#region Nested type: partition
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
struct partition
|
||||
{
|
||||
pTag.V_UNUSED => Localization.Unused,
|
||||
pTag.V_BOOT => Localization.Boot,
|
||||
pTag.V_ROOT => "/",
|
||||
pTag.V_SWAP => Localization.swap,
|
||||
pTag.V_USER => "/usr",
|
||||
pTag.V_BACKUP => Localization.Whole_disk,
|
||||
pTag.V_STAND_OLD => isNew ? "Stand" : Localization.Alternate_sector_space,
|
||||
pTag.V_VAR_OLD => isNew ? "/var" : Localization.non_UNIX,
|
||||
pTag.V_HOME_OLD => isNew ? "/home" : Localization.Alternate_track_space,
|
||||
pTag.V_ALTSCTR_OLD => isNew ? Localization.Alternate_sector_track : "Stand",
|
||||
pTag.V_CACHE => isNew ? Localization.Cache : "/var",
|
||||
pTag.V_RESERVED => isNew ? Localization.Reserved : "/home",
|
||||
pTag.V_DUMP => Localization.dump,
|
||||
pTag.V_ALTSCTR => Localization.Alternate_sector_track,
|
||||
pTag.V_VMPUBLIC => Localization.volume_mgt_public_partition,
|
||||
pTag.V_VMPRIVATE => Localization.volume_mgt_private_partition,
|
||||
_ => string.Format(Localization.Unknown_TAG_0, type)
|
||||
};
|
||||
public pTag p_tag; /*ID tag of partition*/
|
||||
public pFlag p_flag; /*permision flags*/
|
||||
public int p_start; /*start sector no of partition*/
|
||||
public int p_size; /*# of blocks in partition*/
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: PDInfo
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
|
||||
@@ -489,6 +522,10 @@ public sealed class VTOC : IPartition
|
||||
public readonly uint[] pad; /*space for more stuff*/
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: PDInfoOld
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
@@ -518,56 +555,26 @@ public sealed class VTOC : IPartition
|
||||
public readonly uint allcend; /*end of allocatable disk*/
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
#endregion
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
struct vtocold
|
||||
#region Nested type: pFlag
|
||||
|
||||
[Flags]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
enum pFlag : ushort
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly uint[] v_bootinfo; /*info needed by mboot*/
|
||||
public readonly uint v_sanity; /*to verify vtoc sanity*/
|
||||
public readonly uint v_version; /*layout version*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] v_volume; /*volume name*/
|
||||
public readonly ushort v_sectorsz; /*sector size in bytes*/
|
||||
public readonly ushort v_nparts; /*number of partitions*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved; /*free space*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly partition[] v_part; /*partition headers*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly int[] timestamp; /* SCSI time stamp */
|
||||
/* Partition permission flags */
|
||||
V_UNMNT = 0x01, /* Unmountable partition */
|
||||
V_RONLY = 0x10, /* Read only */
|
||||
V_REMAP = 0x20, /* do alternate sector mapping */
|
||||
V_OPEN = 0x100, /* Partition open (for driver use) */
|
||||
V_VALID = 0x200, /* Partition is valid to use */
|
||||
V_VOMASK = 0x300 /* mask for open and valid */
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
#endregion
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
struct vtoc
|
||||
{
|
||||
public readonly uint v_sanity; /*to verify vtoc sanity*/
|
||||
public readonly uint v_version; /*layout version*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] v_volume; /*volume name*/
|
||||
public readonly ushort v_nparts; /*number of partitions*/
|
||||
public readonly ushort v_pad; /*pad for 286 compiler*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved; /*free space*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly partition[] v_part; /*partition headers*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly int[] timestamp; /* SCSI time stamp */
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
struct partition
|
||||
{
|
||||
public pTag p_tag; /*ID tag of partition*/
|
||||
public pFlag p_flag; /*permision flags*/
|
||||
public int p_start; /*start sector no of partition*/
|
||||
public int p_size; /*# of blocks in partition*/
|
||||
}
|
||||
#region Nested type: pTag
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
enum pTag : ushort
|
||||
@@ -618,11 +625,53 @@ public sealed class VTOC : IPartition
|
||||
V_VMPRIVATE = 0x000F
|
||||
}
|
||||
|
||||
[Flags, SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
enum pFlag : ushort
|
||||
#endregion
|
||||
|
||||
#region Nested type: vtoc
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
struct vtoc
|
||||
{
|
||||
/* Partition permission flags */ V_UNMNT = 0x01, /* Unmountable partition */ V_RONLY = 0x10, /* Read only */
|
||||
V_REMAP = 0x20, /* do alternate sector mapping */ V_OPEN = 0x100, /* Partition open (for driver use) */
|
||||
V_VALID = 0x200, /* Partition is valid to use */ V_VOMASK = 0x300 /* mask for open and valid */
|
||||
public readonly uint v_sanity; /*to verify vtoc sanity*/
|
||||
public readonly uint v_version; /*layout version*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] v_volume; /*volume name*/
|
||||
public readonly ushort v_nparts; /*number of partitions*/
|
||||
public readonly ushort v_pad; /*pad for 286 compiler*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved; /*free space*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly partition[] v_part; /*partition headers*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly int[] timestamp; /* SCSI time stamp */
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: vtocold
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
struct vtocold
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public readonly uint[] v_bootinfo; /*info needed by mboot*/
|
||||
public readonly uint v_sanity; /*to verify vtoc sanity*/
|
||||
public readonly uint v_version; /*layout version*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public readonly byte[] v_volume; /*volume name*/
|
||||
public readonly ushort v_sectorsz; /*sector size in bytes*/
|
||||
public readonly ushort v_nparts; /*number of partitions*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
||||
public readonly uint[] v_reserved; /*free space*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly partition[] v_part; /*partition headers*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public readonly int[] timestamp; /* SCSI time stamp */
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -53,10 +53,14 @@ public sealed class XENIX : IPartition
|
||||
const uint XENIX_OFFSET = 977;
|
||||
const string MODULE_NAME = "XENIX partitions plugin";
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.XENIX_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("53BE01DE-E68B-469F-A17F-EC2E4BD61CD9");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -81,9 +85,9 @@ public sealed class XENIX : IPartition
|
||||
if(xnxtbl.p_magic != PAMAGIC)
|
||||
return false;
|
||||
|
||||
for(int i = 0; i < MAXPARTS; i++)
|
||||
for(var i = 0; i < MAXPARTS; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "xnxtbl.p[{0}].p_off = {1}", i, xnxtbl.p[i].p_off);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "xnxtbl.p[{0}].p_off = {1}", i, xnxtbl.p[i].p_off);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "xnxtbl.p[{0}].p_size = {1}", i, xnxtbl.p[i].p_size);
|
||||
|
||||
if(xnxtbl.p[i].p_size <= 0)
|
||||
@@ -91,11 +95,11 @@ public sealed class XENIX : IPartition
|
||||
|
||||
var part = new CommonTypes.Partition
|
||||
{
|
||||
Start = ((ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) / imagePlugin.Info.SectorSize) +
|
||||
Start = (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) / imagePlugin.Info.SectorSize +
|
||||
sectorOffset,
|
||||
Length = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE) / imagePlugin.Info.SectorSize,
|
||||
Offset = (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) +
|
||||
(imagePlugin.Info.SectorSize * sectorOffset),
|
||||
imagePlugin.Info.SectorSize * sectorOffset,
|
||||
Size = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE),
|
||||
Sequence = (ulong)i,
|
||||
Type = "XENIX",
|
||||
@@ -109,6 +113,10 @@ public sealed class XENIX : IPartition
|
||||
return partitions.Count > 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Partable
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Partable
|
||||
{
|
||||
@@ -117,10 +125,16 @@ public sealed class XENIX : IPartition
|
||||
public readonly Partition[] p; /*partition headers*/
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Partition
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
readonly struct Partition
|
||||
{
|
||||
public readonly int p_off; /*start 1K block no of partition*/
|
||||
public readonly int p_size; /*# of 1K blocks in partition*/
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -64,10 +64,14 @@ public sealed class Xbox : IPartition
|
||||
const long XBOX360_COMPAT_LEN = 0x10000000;
|
||||
const uint XBOX360_DEVKIT_MAGIC = 0x00020000;
|
||||
|
||||
#region IPartition Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.Xbox_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("E3F6FB91-D358-4F22-A550-81E92D50EB78");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
@@ -146,8 +150,8 @@ public sealed class Xbox : IPartition
|
||||
var dataPart = new Partition
|
||||
{
|
||||
Description = Localization.Data_volume,
|
||||
Size = (imagePlugin.Info.Sectors * imagePlugin.Info.SectorSize) - MEMORY_UNIT_DATA_OFF,
|
||||
Length = imagePlugin.Info.Sectors - sysCachePart.Length,
|
||||
Size = imagePlugin.Info.Sectors * imagePlugin.Info.SectorSize - MEMORY_UNIT_DATA_OFF,
|
||||
Length = imagePlugin.Info.Sectors - sysCachePart.Length,
|
||||
Sequence = 2,
|
||||
Offset = MEMORY_UNIT_DATA_OFF,
|
||||
Start = sysCachePart.Length,
|
||||
@@ -266,6 +270,10 @@ public sealed class Xbox : IPartition
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Xbox360DevKitPartitionTable
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct Xbox360DevKitPartitionTable
|
||||
{
|
||||
@@ -276,4 +284,6 @@ public sealed class Xbox : IPartition
|
||||
public readonly uint dashboardOff;
|
||||
public readonly uint dashboardLen;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user