REFACTOR: All refactor in DiscImageChef.Partitions.

This commit is contained in:
2017-12-22 16:53:11 +00:00
parent 97d35a8e8e
commit fabb50584e
18 changed files with 190 additions and 202 deletions

View File

@@ -72,10 +72,9 @@ namespace DiscImageChef.Partitions
if(sector.Length < 512) return false; if(sector.Length < 512) return false;
AcornBootBlock bootBlock;
IntPtr bbPtr = Marshal.AllocHGlobal(512); IntPtr bbPtr = Marshal.AllocHGlobal(512);
Marshal.Copy(sector, 0, bbPtr, 512); Marshal.Copy(sector, 0, bbPtr, 512);
bootBlock = (AcornBootBlock)Marshal.PtrToStructure(bbPtr, typeof(AcornBootBlock)); AcornBootBlock bootBlock = (AcornBootBlock)Marshal.PtrToStructure(bbPtr, typeof(AcornBootBlock));
Marshal.FreeHGlobal(bbPtr); Marshal.FreeHGlobal(bbPtr);
int checksum = 0; int checksum = 0;
@@ -112,10 +111,9 @@ namespace DiscImageChef.Partitions
switch(bootBlock.flags & TYPE_MASK) { switch(bootBlock.flags & TYPE_MASK) {
case TYPE_LINUX: case TYPE_LINUX:
{ {
LinuxTable table;
IntPtr tablePtr = Marshal.AllocHGlobal(512); IntPtr tablePtr = Marshal.AllocHGlobal(512);
Marshal.Copy(map, 0, tablePtr, 512); Marshal.Copy(map, 0, tablePtr, 512);
table = (LinuxTable)Marshal.PtrToStructure(tablePtr, typeof(LinuxTable)); LinuxTable table = (LinuxTable)Marshal.PtrToStructure(tablePtr, typeof(LinuxTable));
Marshal.FreeHGlobal(tablePtr); Marshal.FreeHGlobal(tablePtr);
foreach(LinuxEntry entry in table.entries) foreach(LinuxEntry entry in table.entries)
@@ -140,10 +138,9 @@ namespace DiscImageChef.Partitions
case TYPE_RISCIX_MFM: case TYPE_RISCIX_MFM:
case TYPE_RISCIX_SCSI: case TYPE_RISCIX_SCSI:
{ {
RiscIxTable table;
IntPtr tablePtr = Marshal.AllocHGlobal(512); IntPtr tablePtr = Marshal.AllocHGlobal(512);
Marshal.Copy(map, 0, tablePtr, 512); Marshal.Copy(map, 0, tablePtr, 512);
table = (RiscIxTable)Marshal.PtrToStructure(tablePtr, typeof(RiscIxTable)); RiscIxTable table = (RiscIxTable)Marshal.PtrToStructure(tablePtr, typeof(RiscIxTable));
Marshal.FreeHGlobal(tablePtr); Marshal.FreeHGlobal(tablePtr);
if(table.magic == RISCIX_MAGIC) if(table.magic == RISCIX_MAGIC)
@@ -169,7 +166,7 @@ namespace DiscImageChef.Partitions
} }
} }
return !(partitions.Count == 0); return partitions.Count != 0;
} }
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]

View File

@@ -62,30 +62,29 @@ namespace DiscImageChef.Partitions
public override bool GetInformation(ImagePlugin imagePlugin, public override bool GetInformation(ImagePlugin imagePlugin,
out List<Partition> partitions, ulong sectorOffset) out List<Partition> partitions, ulong sectorOffset)
{ {
uint sector_size; uint sectorSize;
if(imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448) sector_size = 2048; if(imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448) sectorSize = 2048;
else sector_size = imagePlugin.GetSectorSize(); else sectorSize = imagePlugin.GetSectorSize();
partitions = new List<Partition>(); partitions = new List<Partition>();
if(sectorOffset + 2 >= imagePlugin.GetSectors()) return false; if(sectorOffset + 2 >= imagePlugin.GetSectors()) return false;
byte[] ddm_sector = imagePlugin.ReadSector(sectorOffset); byte[] ddmSector = imagePlugin.ReadSector(sectorOffset);
AppleDriverDescriptorMap ddm;
ushort max_drivers = 61; ushort maxDrivers = 61;
if(sector_size == 256) if(sectorSize == 256)
{ {
byte[] tmp = new byte[512]; byte[] tmp = new byte[512];
Array.Copy(ddm_sector, 0, tmp, 0, 256); Array.Copy(ddmSector, 0, tmp, 0, 256);
ddm_sector = tmp; ddmSector = tmp;
max_drivers = 29; maxDrivers = 29;
} }
else if(sector_size < 256) return false; else if(sectorSize < 256) return false;
ddm = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDriverDescriptorMap>(ddm_sector); AppleDriverDescriptorMap ddm = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDriverDescriptorMap>(ddmSector);
DicConsole.DebugWriteLine("AppleMap Plugin", "ddm.sbSig = 0x{0:X4}", ddm.sbSig); DicConsole.DebugWriteLine("AppleMap Plugin", "ddm.sbSig = 0x{0:X4}", ddm.sbSig);
DicConsole.DebugWriteLine("AppleMap Plugin", "ddm.sbBlockSize = {0}", ddm.sbBlockSize); DicConsole.DebugWriteLine("AppleMap Plugin", "ddm.sbBlockSize = {0}", ddm.sbBlockSize);
@@ -98,13 +97,13 @@ namespace DiscImageChef.Partitions
uint sequence = 0; uint sequence = 0;
if(ddm.sbSig == DDM_MAGIC) if(ddm.sbSig == DDM_MAGIC)
if(ddm.sbDrvrCount < max_drivers) if(ddm.sbDrvrCount < maxDrivers)
{ {
ddm.sbMap = new AppleDriverEntry[ddm.sbDrvrCount]; ddm.sbMap = new AppleDriverEntry[ddm.sbDrvrCount];
for(int i = 0; i < ddm.sbDrvrCount; i++) for(int i = 0; i < ddm.sbDrvrCount; i++)
{ {
byte[] tmp = new byte[8]; byte[] tmp = new byte[8];
Array.Copy(ddm_sector, 18 + i * 8, tmp, 0, 8); Array.Copy(ddmSector, 18 + i * 8, tmp, 0, 8);
ddm.sbMap[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDriverEntry>(tmp); ddm.sbMap[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleDriverEntry>(tmp);
DicConsole.DebugWriteLine("AppleMap Plugin", "ddm.sbMap[{1}].ddBlock = {0}", DicConsole.DebugWriteLine("AppleMap Plugin", "ddm.sbMap[{1}].ddBlock = {0}",
ddm.sbMap[i].ddBlock, i); ddm.sbMap[i].ddBlock, i);
@@ -118,14 +117,14 @@ namespace DiscImageChef.Partitions
Partition part = new Partition Partition part = new Partition
{ {
Size = (ulong)(ddm.sbMap[i].ddSize * 512), Size = (ulong)(ddm.sbMap[i].ddSize * 512),
Length = (ulong)(ddm.sbMap[i].ddSize * 512 / sector_size), Length = (ulong)(ddm.sbMap[i].ddSize * 512 / sectorSize),
Sequence = sequence, Sequence = sequence,
Offset = ddm.sbMap[i].ddBlock * sector_size, Offset = ddm.sbMap[i].ddBlock * sectorSize,
Start = ddm.sbMap[i].ddBlock + sectorOffset, Start = ddm.sbMap[i].ddBlock + sectorOffset,
Type = "Apple_Driver" Type = "Apple_Driver"
}; };
if(ddm.sbMap[i].ddSize * 512 % sector_size > 0) part.Length++; if(ddm.sbMap[i].ddSize * 512 % sectorSize > 0) part.Length++;
partitions.Add(part); partitions.Add(part);
@@ -133,45 +132,44 @@ namespace DiscImageChef.Partitions
} }
} }
byte[] part_sector = imagePlugin.ReadSector(1 + sectorOffset); byte[] partSector = imagePlugin.ReadSector(1 + sectorOffset);
AppleOldDevicePartitionMap old_map = AppleOldDevicePartitionMap oldMap =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleOldDevicePartitionMap>(part_sector); BigEndianMarshal.ByteArrayToStructureBigEndian<AppleOldDevicePartitionMap>(partSector);
// This is the easy one, no sector size mixing // This is the easy one, no sector size mixing
if(old_map.pdSig == APM_MAGIC_OLD) if(oldMap.pdSig == APM_MAGIC_OLD)
{ {
for(int i = 2; i < part_sector.Length; i += 12) for(int i = 2; i < partSector.Length; i += 12)
{ {
byte[] tmp = new byte[12]; byte[] tmp = new byte[12];
Array.Copy(part_sector, i, tmp, 0, 12); Array.Copy(partSector, i, tmp, 0, 12);
AppleMapOldPartitionEntry old_entry = AppleMapOldPartitionEntry oldEntry =
BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapOldPartitionEntry>(tmp); BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapOldPartitionEntry>(tmp);
DicConsole.DebugWriteLine("AppleMap Plugin", "old_map.sbMap[{1}].pdStart = {0}", old_entry.pdStart, DicConsole.DebugWriteLine("AppleMap Plugin", "old_map.sbMap[{1}].pdStart = {0}", oldEntry.pdStart,
(i - 2) / 12); (i - 2) / 12);
DicConsole.DebugWriteLine("AppleMap Plugin", "old_map.sbMap[{1}].pdSize = {0}", old_entry.pdSize, DicConsole.DebugWriteLine("AppleMap Plugin", "old_map.sbMap[{1}].pdSize = {0}", oldEntry.pdSize,
(i - 2) / 12); (i - 2) / 12);
DicConsole.DebugWriteLine("AppleMap Plugin", "old_map.sbMap[{1}].pdFSID = 0x{0:X8}", DicConsole.DebugWriteLine("AppleMap Plugin", "old_map.sbMap[{1}].pdFSID = 0x{0:X8}",
old_entry.pdFSID, (i - 2) / 12); oldEntry.pdFSID, (i - 2) / 12);
if(old_entry.pdSize == 0 && old_entry.pdFSID == 0) if(oldEntry.pdSize == 0 && oldEntry.pdFSID == 0)
{ {
if(old_entry.pdStart == 0) break; if(oldEntry.pdStart == 0) break;
continue; continue;
} }
Partition part = new Partition Partition part = new Partition
{ {
Size = old_entry.pdStart * ddm.sbBlockSize, Size = oldEntry.pdStart * ddm.sbBlockSize,
Length = old_entry.pdStart * ddm.sbBlockSize / sector_size, Length = oldEntry.pdStart * ddm.sbBlockSize / sectorSize,
Sequence = sequence, Sequence = sequence,
Offset = old_entry.pdSize * ddm.sbBlockSize, Offset = oldEntry.pdSize * ddm.sbBlockSize,
Start = old_entry.pdSize * ddm.sbBlockSize / sector_size, Start = oldEntry.pdSize * ddm.sbBlockSize / sectorSize,
Scheme = Name Scheme = Name,
Type = oldEntry.pdFSID == HFS_MAGIC_OLD ? "Apple_HFS" : $"0x{oldEntry.pdFSID:X8}"
}; };
if(old_entry.pdFSID == HFS_MAGIC_OLD) part.Type = "Apple_HFS";
else part.Type = $"0x{old_entry.pdFSID:X8}";
partitions.Add(part); partitions.Add(part);
@@ -182,68 +180,68 @@ namespace DiscImageChef.Partitions
} }
AppleMapPartitionEntry entry; AppleMapPartitionEntry entry;
uint entry_size; uint entrySize;
uint entry_count; uint entryCount;
uint sectors_to_read; uint sectorsToRead;
uint skip_ddm; uint skipDdm;
// If sector is bigger than 512 // If sector is bigger than 512
if(sector_size > 512) if(sectorSize > 512)
{ {
byte[] tmp = new byte[512]; byte[] tmp = new byte[512];
Array.Copy(ddm_sector, 512, tmp, 0, 512); Array.Copy(ddmSector, 512, tmp, 0, 512);
entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp); entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp);
// Check for a partition entry that's 512-byte aligned // Check for a partition entry that's 512-byte aligned
if(entry.signature == APM_MAGIC) if(entry.signature == APM_MAGIC)
{ {
DicConsole.DebugWriteLine("AppleMap Plugin", "Found misaligned entry."); DicConsole.DebugWriteLine("AppleMap Plugin", "Found misaligned entry.");
entry_size = 512; entrySize = 512;
entry_count = entry.entries; entryCount = entry.entries;
skip_ddm = 512; skipDdm = 512;
sectors_to_read = (entry_count + 1) * 512 / sector_size + 1; sectorsToRead = (entryCount + 1) * 512 / sectorSize + 1;
} }
else else
{ {
entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(part_sector); entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(partSector);
if(entry.signature == APM_MAGIC) if(entry.signature == APM_MAGIC)
{ {
DicConsole.DebugWriteLine("AppleMap Plugin", "Found aligned entry."); DicConsole.DebugWriteLine("AppleMap Plugin", "Found aligned entry.");
entry_size = sector_size; entrySize = sectorSize;
entry_count = entry.entries; entryCount = entry.entries;
skip_ddm = sector_size; skipDdm = sectorSize;
sectors_to_read = entry_count + 2; sectorsToRead = entryCount + 2;
} }
else return partitions.Count > 0; else return partitions.Count > 0;
} }
} }
else else
{ {
entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(part_sector); entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(partSector);
if(entry.signature == APM_MAGIC) if(entry.signature == APM_MAGIC)
{ {
DicConsole.DebugWriteLine("AppleMap Plugin", "Found aligned entry."); DicConsole.DebugWriteLine("AppleMap Plugin", "Found aligned entry.");
entry_size = sector_size; entrySize = sectorSize;
entry_count = entry.entries; entryCount = entry.entries;
skip_ddm = sector_size; skipDdm = sectorSize;
sectors_to_read = entry_count + 2; sectorsToRead = entryCount + 2;
} }
else return partitions.Count > 0; else return partitions.Count > 0;
} }
byte[] entries = imagePlugin.ReadSectors(sectorOffset, sectors_to_read); byte[] entries = imagePlugin.ReadSectors(sectorOffset, sectorsToRead);
DicConsole.DebugWriteLine("AppleMap Plugin", "entry_size = {0}", entry_size); DicConsole.DebugWriteLine("AppleMap Plugin", "entry_size = {0}", entrySize);
DicConsole.DebugWriteLine("AppleMap Plugin", "entry_count = {0}", entry_count); DicConsole.DebugWriteLine("AppleMap Plugin", "entry_count = {0}", entryCount);
DicConsole.DebugWriteLine("AppleMap Plugin", "skip_ddm = {0}", skip_ddm); DicConsole.DebugWriteLine("AppleMap Plugin", "skip_ddm = {0}", skipDdm);
DicConsole.DebugWriteLine("AppleMap Plugin", "sectors_to_read = {0}", sectors_to_read); DicConsole.DebugWriteLine("AppleMap Plugin", "sectors_to_read = {0}", sectorsToRead);
byte[] copy = new byte[entries.Length - skip_ddm]; byte[] copy = new byte[entries.Length - skipDdm];
Array.Copy(entries, skip_ddm, copy, 0, copy.Length); Array.Copy(entries, skipDdm, copy, 0, copy.Length);
entries = copy; entries = copy;
for(int i = 0; i < entry_count; i++) for(int i = 0; i < entryCount; i++)
{ {
byte[] tmp = new byte[entry_size]; byte[] tmp = new byte[entrySize];
Array.Copy(entries, i * entry_size, tmp, 0, entry_size); Array.Copy(entries, i * entrySize, tmp, 0, entrySize);
entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp); entry = BigEndianMarshal.ByteArrayToStructureBigEndian<AppleMapPartitionEntry>(tmp);
if(entry.signature != APM_MAGIC) continue; if(entry.signature != APM_MAGIC) continue;
@@ -289,10 +287,10 @@ namespace DiscImageChef.Partitions
Sequence = sequence, Sequence = sequence,
Type = StringHandlers.CToString(entry.type), Type = StringHandlers.CToString(entry.type),
Name = StringHandlers.CToString(entry.name), Name = StringHandlers.CToString(entry.name),
Offset = entry.start * entry_size, Offset = entry.start * entrySize,
Size = entry.sectors * entry_size, Size = entry.sectors * entrySize,
Start = entry.start * entry_size / sector_size + sectorOffset, Start = entry.start * entrySize / sectorSize + sectorOffset,
Length = entry.sectors * entry_size / sector_size, Length = entry.sectors * entrySize / sectorSize,
Scheme = Name Scheme = Name
}; };
sb.AppendLine("Partition flags:"); sb.AppendLine("Partition flags:");
@@ -306,7 +304,7 @@ namespace DiscImageChef.Partitions
if(flags.HasFlag(AppleMapFlags.Bootable)) if(flags.HasFlag(AppleMapFlags.Bootable))
{ {
sb.AppendFormat("First boot sector: {0}", sb.AppendFormat("First boot sector: {0}",
entry.first_boot_block * entry_size / sector_size).AppendLine(); entry.first_boot_block * entrySize / sectorSize).AppendLine();
sb.AppendFormat("Boot is {0} bytes.", entry.boot_size).AppendLine(); sb.AppendFormat("Boot is {0} bytes.", entry.boot_size).AppendLine();
sb.AppendFormat("Boot load address: 0x{0:X8}", entry.load_address).AppendLine(); sb.AppendFormat("Boot load address: 0x{0:X8}", entry.load_address).AppendLine();
sb.AppendFormat("Boot entry point: 0x{0:X8}", entry.entry_point).AppendLine(); sb.AppendFormat("Boot entry point: 0x{0:X8}", entry.entry_point).AppendLine();

View File

@@ -73,10 +73,9 @@ namespace DiscImageChef.Partitions
if(sector.Length < 512) return false; if(sector.Length < 512) return false;
ApricotLabel label;
IntPtr lblPtr = Marshal.AllocHGlobal(512); IntPtr lblPtr = Marshal.AllocHGlobal(512);
Marshal.Copy(sector, 0, lblPtr, 512); Marshal.Copy(sector, 0, lblPtr, 512);
label = (ApricotLabel)Marshal.PtrToStructure(lblPtr, typeof(ApricotLabel)); ApricotLabel label = (ApricotLabel)Marshal.PtrToStructure(lblPtr, typeof(ApricotLabel));
Marshal.FreeHGlobal(lblPtr); Marshal.FreeHGlobal(lblPtr);
// Not much to check but... // Not much to check but...

View File

@@ -72,11 +72,13 @@ namespace DiscImageChef.Partitions
byte[] sector = imagePlugin.ReadSector(sectorOffset); byte[] sector = imagePlugin.ReadSector(sectorOffset);
AtariTable table = new AtariTable(); AtariTable table = new AtariTable
table.boot = new byte[342]; {
table.icdEntries = new AtariEntry[8]; boot = new byte[342],
table.unused = new byte[12]; icdEntries = new AtariEntry[8],
table.entries = new AtariEntry[4]; unused = new byte[12],
entries = new AtariEntry[4]
};
Array.Copy(sector, 0, table.boot, 0, 342); Array.Copy(sector, 0, table.boot, 0, 342);

View File

@@ -49,7 +49,7 @@ namespace DiscImageChef.Partitions
/// <summary>Known byte offsets for BSD disklabel</summary> /// <summary>Known byte offsets for BSD disklabel</summary>
readonly uint[] labelOffsets = {0, 9, 64, 128, 516}; readonly uint[] labelOffsets = {0, 9, 64, 128, 516};
/// <summary>Maximum size of a disklabel with 22 partitions</summary> /// <summary>Maximum size of a disklabel with 22 partitions</summary>
const uint maxLabelSize = 500; const uint MAX_LABEL_SIZE = 500;
public BSD() public BSD()
{ {
@@ -60,10 +60,9 @@ namespace DiscImageChef.Partitions
public override bool GetInformation(ImagePlugin imagePlugin, out List<Partition> partitions, ulong sectorOffset) public override bool GetInformation(ImagePlugin imagePlugin, out List<Partition> partitions, ulong sectorOffset)
{ {
partitions = new List<Partition>(); partitions = new List<Partition>();
uint run = (maxLabelSize + labelOffsets.Last()) / imagePlugin.GetSectorSize(); uint run = (MAX_LABEL_SIZE + labelOffsets.Last()) / imagePlugin.GetSectorSize();
if((maxLabelSize + labelOffsets.Last()) % imagePlugin.GetSectorSize() > 0) run++; if((MAX_LABEL_SIZE + labelOffsets.Last()) % imagePlugin.GetSectorSize() > 0) run++;
byte[] sector;
DiskLabel dl = new DiskLabel(); DiskLabel dl = new DiskLabel();
bool found = false; bool found = false;
@@ -74,8 +73,8 @@ namespace DiscImageChef.Partitions
byte[] tmp = imagePlugin.ReadSectors(location + sectorOffset, run); byte[] tmp = imagePlugin.ReadSectors(location + sectorOffset, run);
foreach(uint offset in labelOffsets) foreach(uint offset in labelOffsets)
{ {
sector = new byte[maxLabelSize]; byte[] sector = new byte[MAX_LABEL_SIZE];
Array.Copy(tmp, offset, sector, 0, maxLabelSize); Array.Copy(tmp, offset, sector, 0, MAX_LABEL_SIZE);
dl = GetDiskLabel(sector); dl = GetDiskLabel(sector);
DicConsole.DebugWriteLine("BSD plugin", DicConsole.DebugWriteLine("BSD plugin",
"dl.magic on sector {0} at offset {1} = 0x{2:X8} (expected 0x{3:X8})", "dl.magic on sector {0} at offset {1} = 0x{2:X8} (expected 0x{3:X8})",

View File

@@ -59,10 +59,9 @@ namespace DiscImageChef.Partitions
byte[] sector = imagePlugin.ReadSector(31 + sectorOffset); byte[] sector = imagePlugin.ReadSector(31 + sectorOffset);
if(sector.Length < 512) return false; if(sector.Length < 512) return false;
DECLabel table;
IntPtr tablePtr = Marshal.AllocHGlobal(512); IntPtr tablePtr = Marshal.AllocHGlobal(512);
Marshal.Copy(sector, 0, tablePtr, 512); Marshal.Copy(sector, 0, tablePtr, 512);
table = (DECLabel)Marshal.PtrToStructure(tablePtr, typeof(DECLabel)); DECLabel table = (DECLabel)Marshal.PtrToStructure(tablePtr, typeof(DECLabel));
Marshal.FreeHGlobal(tablePtr); Marshal.FreeHGlobal(tablePtr);
if(table.pt_magic != PT_MAGIC || table.pt_valid != PT_VALID) return false; if(table.pt_magic != PT_MAGIC || table.pt_valid != PT_VALID) return false;

View File

@@ -59,10 +59,9 @@ namespace DiscImageChef.Partitions
byte[] sectors = imagePlugin.ReadSectors(sectorOffset, nSectors); byte[] sectors = imagePlugin.ReadSectors(sectorOffset, nSectors);
if(sectors.Length < 2048) return false; if(sectors.Length < 2048) return false;
Disklabel64 disklabel;
IntPtr labelPtr = Marshal.AllocHGlobal(2048); IntPtr labelPtr = Marshal.AllocHGlobal(2048);
Marshal.Copy(sectors, 0, labelPtr, 2048); Marshal.Copy(sectors, 0, labelPtr, 2048);
disklabel = (Disklabel64)Marshal.PtrToStructure(labelPtr, typeof(Disklabel64)); Disklabel64 disklabel = (Disklabel64)Marshal.PtrToStructure(labelPtr, typeof(Disklabel64));
Marshal.FreeHGlobal(labelPtr); Marshal.FreeHGlobal(labelPtr);
if(disklabel.d_magic != 0xC4464C59) return false; if(disklabel.d_magic != 0xC4464C59) return false;
@@ -79,13 +78,14 @@ namespace DiscImageChef.Partitions
Length = entry.p_bsize / imagePlugin.GetSectorSize(), Length = entry.p_bsize / imagePlugin.GetSectorSize(),
Name = entry.p_stor_uuid.ToString(), Name = entry.p_stor_uuid.ToString(),
Sequence = counter, Sequence = counter,
Scheme = Name Scheme = Name,
Type = (BSD.fsType) entry.p_fstype == BSD.fsType.Other
? entry.p_type_uuid.ToString()
: BSD.fsTypeToString((BSD.fsType) entry.p_fstype)
}; };
if(entry.p_bsize % imagePlugin.GetSectorSize() > 0) part.Length++; if(entry.p_bsize % imagePlugin.GetSectorSize() > 0) part.Length++;
if((BSD.fsType)entry.p_fstype == BSD.fsType.Other) part.Type = entry.p_type_uuid.ToString();
else part.Type = BSD.fsTypeToString((BSD.fsType)entry.p_fstype);
if(entry.p_bsize <= 0 || entry.p_boffset <= 0) continue; if(entry.p_bsize <= 0 || entry.p_boffset <= 0) continue;
partitions.Add(part); partitions.Add(part);

View File

@@ -42,8 +42,8 @@ namespace DiscImageChef.Partitions
{ {
public class GuidPartitionTable : PartitionPlugin public class GuidPartitionTable : PartitionPlugin
{ {
const ulong GptMagic = 0x5452415020494645; const ulong GPT_MAGIC = 0x5452415020494645;
const uint GptRevision1 = 0x00010000; const uint GPT_REVISION1 = 0x00010000;
public GuidPartitionTable() public GuidPartitionTable()
{ {
@@ -66,13 +66,13 @@ namespace DiscImageChef.Partitions
DicConsole.DebugWriteLine("GPT Plugin", "hdr.signature = 0x{0:X16}", signature); DicConsole.DebugWriteLine("GPT Plugin", "hdr.signature = 0x{0:X16}", signature);
if(signature != GptMagic) if(signature != GPT_MAGIC)
if(imagePlugin.ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc) if(imagePlugin.ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{ {
hdrBytes = imagePlugin.ReadSector(sectorOffset); hdrBytes = imagePlugin.ReadSector(sectorOffset);
signature = BitConverter.ToUInt64(hdrBytes, 512); signature = BitConverter.ToUInt64(hdrBytes, 512);
DicConsole.DebugWriteLine("GPT Plugin", "hdr.signature @ 0x200 = 0x{0:X16}", signature); DicConsole.DebugWriteLine("GPT Plugin", "hdr.signature @ 0x200 = 0x{0:X16}", signature);
if(signature == GptMagic) if(signature == GPT_MAGIC)
{ {
DicConsole.DebugWriteLine("GPT Plugin", "Found unaligned signature", signature); DicConsole.DebugWriteLine("GPT Plugin", "Found unaligned signature", signature);
byte[] real = new byte[512]; byte[] real = new byte[512];
@@ -106,7 +106,7 @@ namespace DiscImageChef.Partitions
DicConsole.DebugWriteLine("GPT Plugin", "hdr.entriesSize = {0}", hdr.entriesSize); DicConsole.DebugWriteLine("GPT Plugin", "hdr.entriesSize = {0}", hdr.entriesSize);
DicConsole.DebugWriteLine("GPT Plugin", "hdr.entriesCrc = 0x{0:X8}", hdr.entriesCrc); DicConsole.DebugWriteLine("GPT Plugin", "hdr.entriesCrc = 0x{0:X8}", hdr.entriesCrc);
if(hdr.signature != GptMagic) return false; if(hdr.signature != GPT_MAGIC) return false;
if(hdr.myLBA != 1 + sectorOffset) return false; if(hdr.myLBA != 1 + sectorOffset) return false;
@@ -145,7 +145,8 @@ namespace DiscImageChef.Partitions
entries.Add(entry); entries.Add(entry);
} }
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch { } catch { // ignored
}
#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
} }
@@ -183,7 +184,7 @@ namespace DiscImageChef.Partitions
return true; return true;
} }
public string GetGuidTypeName(Guid type) static string GetGuidTypeName(Guid type)
{ {
string strType = type.ToString().ToUpperInvariant(); string strType = type.ToString().ToUpperInvariant();
switch(strType) switch(strType)

View File

@@ -42,7 +42,7 @@ namespace DiscImageChef.Partitions
{ {
public class Human68K : PartitionPlugin public class Human68K : PartitionPlugin
{ {
const uint X68kMagic = 0x5836384B; const uint X68K_MAGIC = 0x5836384B;
public Human68K() public Human68K()
{ {
@@ -82,7 +82,7 @@ namespace DiscImageChef.Partitions
DicConsole.DebugWriteLine("Human68k plugin", "table.magic = {0:X4}", table.magic); DicConsole.DebugWriteLine("Human68k plugin", "table.magic = {0:X4}", table.magic);
if(table.magic != X68kMagic) return false; if(table.magic != X68K_MAGIC) return false;
for(int i = 0; i < table.entries.Length; i++) for(int i = 0; i < table.entries.Length; i++)
table.entries[i] = BigEndianMarshal.SwapStructureMembersEndian(table.entries[i]); table.entries[i] = BigEndianMarshal.SwapStructureMembersEndian(table.entries[i]);

View File

@@ -50,9 +50,9 @@ namespace DiscImageChef.Partitions
// "dlV2" // "dlV2"
const uint NEXT_MAGIC3 = 0x646C5633; const uint NEXT_MAGIC3 = 0x646C5633;
// "dlV3" // "dlV3"
const ushort disktabStart = 0xB4; const ushort DISKTAB_START = 0xB4;
// 180 // 180
const ushort disktabEntrySize = 0x2C; const ushort DISKTAB_ENTRY_SIZE = 0x2C;
// 44 // 44
public NeXTDisklabel() public NeXTDisklabel()
@@ -61,45 +61,44 @@ namespace DiscImageChef.Partitions
PluginUuid = new Guid("246A6D93-4F1A-1F8A-344D-50187A5513A9"); PluginUuid = new Guid("246A6D93-4F1A-1F8A-344D-50187A5513A9");
} }
public override bool GetInformation(ImagePlugin imagePlugin, public override bool GetInformation(ImagePlugin imagePlugin, out List<Partition> partitions, ulong sectorOffset)
out List<Partition> partitions, ulong sectorOffset)
{ {
bool magic_found = false; bool magicFound = false;
byte[] label_sector; byte[] labelSector;
uint magic; uint sectorSize;
uint sector_size;
if(imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448) sector_size = 2048; if(imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448) sectorSize = 2048;
else sector_size = imagePlugin.GetSectorSize(); else sectorSize = imagePlugin.GetSectorSize();
partitions = new List<Partition>(); partitions = new List<Partition>();
BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;
ulong label_position = 0; ulong labelPosition = 0;
foreach(ulong i in new ulong[] {0, 4, 15, 16}.TakeWhile(i => i + sectorOffset < imagePlugin.GetSectors())) { foreach(ulong i in new ulong[] {0, 4, 15, 16}.TakeWhile(i => i + sectorOffset < imagePlugin.GetSectors()))
label_sector = imagePlugin.ReadSector(i + sectorOffset); {
magic = BigEndianBitConverter.ToUInt32(label_sector, 0x00); labelSector = imagePlugin.ReadSector(i + sectorOffset);
uint magic = BigEndianBitConverter.ToUInt32(labelSector, 0x00);
if(magic != NEXT_MAGIC1 && magic != NEXT_MAGIC2 && magic != NEXT_MAGIC3) continue; if(magic != NEXT_MAGIC1 && magic != NEXT_MAGIC2 && magic != NEXT_MAGIC3) continue;
magic_found = true; magicFound = true;
label_position = i + sectorOffset; labelPosition = i + sectorOffset;
break; break;
} }
if(!magic_found) return false; if(!magicFound) return false;
uint sectors_to_read = 7680 / imagePlugin.ImageInfo.SectorSize; uint sectorsToRead = 7680 / imagePlugin.ImageInfo.SectorSize;
if(7680 % imagePlugin.ImageInfo.SectorSize > 0) sectors_to_read++; if(7680 % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++;
label_sector = imagePlugin.ReadSectors(label_position, sectors_to_read); labelSector = imagePlugin.ReadSectors(labelPosition, sectorsToRead);
NeXTLabel label = BigEndianMarshal.ByteArrayToStructureBigEndian<NeXTLabel>(label_sector); NeXTLabel label = BigEndianMarshal.ByteArrayToStructureBigEndian<NeXTLabel>(labelSector);
byte[] disktab_b = new byte[498]; byte[] disktabB = new byte[498];
Array.Copy(label_sector, 44, disktab_b, 0, 498); Array.Copy(labelSector, 44, disktabB, 0, 498);
label.dl_dt = BigEndianMarshal.ByteArrayToStructureBigEndian<NeXTDiskTab>(disktab_b); label.dl_dt = BigEndianMarshal.ByteArrayToStructureBigEndian<NeXTDiskTab>(disktabB);
label.dl_dt.d_partitions = new NeXTEntry[8]; label.dl_dt.d_partitions = new NeXTEntry[8];
DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_version = 0x{0:X8}", label.dl_version); DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_version = 0x{0:X8}", label.dl_version);
@@ -137,9 +136,9 @@ namespace DiscImageChef.Partitions
for(int i = 0; i < 8; i++) for(int i = 0; i < 8; i++)
{ {
byte[] part_b = new byte[44]; byte[] partB = new byte[44];
Array.Copy(label_sector, 44 + 146 + 44 * i, part_b, 0, 44); Array.Copy(labelSector, 44 + 146 + 44 * i, partB, 0, 44);
label.dl_dt.d_partitions[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<NeXTEntry>(part_b); label.dl_dt.d_partitions[i] = BigEndianMarshal.ByteArrayToStructureBigEndian<NeXTEntry>(partB);
DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_dt.d_partitions[{0}].p_base = {1}", i, DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_dt.d_partitions[{0}].p_base = {1}", i,
label.dl_dt.d_partitions[i].p_base); label.dl_dt.d_partitions[i].p_base);
DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_dt.d_partitions[{0}].p_size = {1}", i, DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_dt.d_partitions[{0}].p_size = {1}", i,
@@ -178,9 +177,9 @@ namespace DiscImageChef.Partitions
Type = StringHandlers.CToString(label.dl_dt.d_partitions[i].p_type), Type = StringHandlers.CToString(label.dl_dt.d_partitions[i].p_type),
Sequence = (ulong)i, Sequence = (ulong)i,
Name = StringHandlers.CToString(label.dl_dt.d_partitions[i].p_mountpt), Name = StringHandlers.CToString(label.dl_dt.d_partitions[i].p_mountpt),
Length = (ulong)(label.dl_dt.d_partitions[i].p_size * label.dl_dt.d_secsize / sector_size), Length = (ulong)(label.dl_dt.d_partitions[i].p_size * label.dl_dt.d_secsize / sectorSize),
Start = (ulong)((label.dl_dt.d_partitions[i].p_base + label.dl_dt.d_front) * Start = (ulong)((label.dl_dt.d_partitions[i].p_base + label.dl_dt.d_front) * label.dl_dt.d_secsize /
label.dl_dt.d_secsize / sector_size), sectorSize),
Scheme = Name Scheme = Name
}; };
@@ -188,7 +187,7 @@ namespace DiscImageChef.Partitions
{ {
DicConsole.DebugWriteLine("NeXT Plugin", "Partition bigger than device, reducing..."); DicConsole.DebugWriteLine("NeXT Plugin", "Partition bigger than device, reducing...");
part.Length = imagePlugin.ImageInfo.Sectors - part.Start; part.Length = imagePlugin.ImageInfo.Sectors - part.Start;
part.Size = part.Length * sector_size; part.Size = part.Length * sectorSize;
DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_dt.d_partitions[{0}].p_size = {1}", i, DicConsole.DebugWriteLine("NeXT Plugin", "label.dl_dt.d_partitions[{0}].p_size = {1}", i,
part.Length); part.Length);
} }
@@ -202,8 +201,7 @@ namespace DiscImageChef.Partitions
sb.AppendFormat("{0} bytes per inode", label.dl_dt.d_partitions[i].p_density).AppendLine(); sb.AppendFormat("{0} bytes per inode", label.dl_dt.d_partitions[i].p_density).AppendLine();
sb.AppendFormat("{0}% of space must be free at minimum", label.dl_dt.d_partitions[i].p_minfree) sb.AppendFormat("{0}% of space must be free at minimum", label.dl_dt.d_partitions[i].p_minfree)
.AppendLine(); .AppendLine();
if(label.dl_dt.d_partitions[i].p_newfs != 1) if(label.dl_dt.d_partitions[i].p_newfs != 1) sb.AppendLine("Filesystem should be formatted at start");
sb.AppendLine("Filesystem should be formatted at start");
if(label.dl_dt.d_partitions[i].p_automnt == 1) if(label.dl_dt.d_partitions[i].p_automnt == 1)
sb.AppendLine("Filesystem should be automatically mounted"); sb.AppendLine("Filesystem should be automatically mounted");

View File

@@ -43,12 +43,10 @@ namespace DiscImageChef.Partitions
{ {
public class PC98 : PartitionPlugin public class PC98 : PartitionPlugin
{ {
const ushort IntelMagic = 0xAA55;
public PC98() public PC98()
{ {
Name = "NEC PC-9800 partition table"; Name = "NEC PC-9800 partition table";
PluginUuid = new Guid("27333401-C7C2-447D-961C-22AD0641A09A\n"); PluginUuid = new Guid("27333401-C7C2-447D-961C-22AD0641A09A");
} }
public override bool GetInformation(ImagePlugin imagePlugin, out List<Partition> partitions, ulong sectorOffset) public override bool GetInformation(ImagePlugin imagePlugin, out List<Partition> partitions, ulong sectorOffset)
@@ -61,10 +59,9 @@ namespace DiscImageChef.Partitions
byte[] sector = imagePlugin.ReadSector(1); byte[] sector = imagePlugin.ReadSector(1);
if(bootSector[bootSector.Length - 2] != 0x55 || bootSector[bootSector.Length - 1] != 0xAA) return false; if(bootSector[bootSector.Length - 2] != 0x55 || bootSector[bootSector.Length - 1] != 0xAA) return false;
PC98Table table;
IntPtr tablePtr = Marshal.AllocHGlobal(256); IntPtr tablePtr = Marshal.AllocHGlobal(256);
Marshal.Copy(sector, 0, tablePtr, 256); Marshal.Copy(sector, 0, tablePtr, 256);
table = (PC98Table)Marshal.PtrToStructure(tablePtr, typeof(PC98Table)); PC98Table table = (PC98Table)Marshal.PtrToStructure(tablePtr, typeof(PC98Table));
Marshal.FreeHGlobal(tablePtr); Marshal.FreeHGlobal(tablePtr);
ulong counter = 0; ulong counter = 0;

View File

@@ -65,7 +65,7 @@ namespace DiscImageChef.Partitions
foreach(string[] tokens in really.TakeWhile(part => part.Length >= 5 && part.Substring(0, 5) == "part ").Select(part => part.Split(' ')).TakeWhile(tokens => tokens.Length == 4)) { foreach(string[] tokens in really.TakeWhile(part => part.Length >= 5 && part.Substring(0, 5) == "part ").Select(part => part.Split(' ')).TakeWhile(tokens => tokens.Length == 4)) {
if(!ulong.TryParse(tokens[2], out ulong start) || !ulong.TryParse(tokens[3], out ulong end)) break; if(!ulong.TryParse(tokens[2], out ulong start) || !ulong.TryParse(tokens[3], out ulong end)) break;
Partition _part = new Partition Partition part = new Partition
{ {
Length = end - start + 1, Length = end - start + 1,
Offset = (start + sectorOffset) * imagePlugin.GetSectorSize(), Offset = (start + sectorOffset) * imagePlugin.GetSectorSize(),
@@ -76,7 +76,7 @@ namespace DiscImageChef.Partitions
Type = tokens[1] Type = tokens[1]
}; };
partitions.Add(_part); partitions.Add(part);
} }
return partitions.Count > 0; return partitions.Count > 0;

View File

@@ -103,11 +103,11 @@ namespace DiscImageChef.Partitions
/// <summary> /// <summary>
/// Type ID for Amiga UNIX System V filesystem /// Type ID for Amiga UNIX System V filesystem
/// </summary> /// </summary>
const uint TypeID_AMIXSysV = 0x554E4901; const uint TYPEID_AMIX_SYSV = 0x554E4901;
/// <summary> /// <summary>
/// Type ID for Amiga UNIX BSD filesystem /// Type ID for Amiga UNIX BSD filesystem
/// </summary> /// </summary>
const uint TYPEID_AMIXFFS = 0x554E4902; const uint TYPEID_AMIX_FFS = 0x554E4902;
/// <summary> /// <summary>
/// Type ID for Amiga UNIX Reserved partition (swap) /// Type ID for Amiga UNIX Reserved partition (swap)
/// </summary> /// </summary>
@@ -928,12 +928,9 @@ namespace DiscImageChef.Partitions
rdbBlock += sectorOffset; rdbBlock += sectorOffset;
byte[] sector;
byte[] tmpString;
RigidDiskBlock rdb = new RigidDiskBlock(); RigidDiskBlock rdb = new RigidDiskBlock();
sector = imagePlugin.ReadSector(rdbBlock); byte[] sector = imagePlugin.ReadSector(rdbBlock);
rdb.Magic = BigEndianBitConverter.ToUInt32(sector, 0x00); rdb.Magic = BigEndianBitConverter.ToUInt32(sector, 0x00);
rdb.Size = BigEndianBitConverter.ToUInt32(sector, 0x04); rdb.Size = BigEndianBitConverter.ToUInt32(sector, 0x04);
@@ -976,7 +973,7 @@ namespace DiscImageChef.Partitions
rdb.HighCylinder = BigEndianBitConverter.ToUInt32(sector, 0x98); rdb.HighCylinder = BigEndianBitConverter.ToUInt32(sector, 0x98);
rdb.Reserved15 = BigEndianBitConverter.ToUInt32(sector, 0x9C); rdb.Reserved15 = BigEndianBitConverter.ToUInt32(sector, 0x9C);
tmpString = new byte[8]; byte[] tmpString = new byte[8];
Array.Copy(sector, 0xA0, tmpString, 0, 8); Array.Copy(sector, 0xA0, tmpString, 0, 8);
rdb.DiskVendor = StringHandlers.SpacePaddedToString(tmpString); rdb.DiskVendor = StringHandlers.SpacePaddedToString(tmpString);
tmpString = new byte[16]; tmpString = new byte[16];
@@ -1340,12 +1337,14 @@ namespace DiscImageChef.Partitions
DicConsole.DebugWriteLine("Amiga RDB plugin", "Found LoadSegment block"); DicConsole.DebugWriteLine("Amiga RDB plugin", "Found LoadSegment block");
thereAreLoadSegments = true; thereAreLoadSegments = true;
LoadSegment loadSeg = new LoadSegment(); LoadSegment loadSeg = new LoadSegment
loadSeg.Magic = BigEndianBitConverter.ToUInt32(sector, 0x00); {
loadSeg.Size = BigEndianBitConverter.ToUInt32(sector, 0x04); Magic = BigEndianBitConverter.ToUInt32(sector, 0x00),
loadSeg.Checksum = BigEndianBitConverter.ToInt32(sector, 0x08); Size = BigEndianBitConverter.ToUInt32(sector, 0x04),
loadSeg.TargetId = BigEndianBitConverter.ToUInt32(sector, 0x0C); Checksum = BigEndianBitConverter.ToInt32(sector, 0x08),
loadSeg.NextPtr = BigEndianBitConverter.ToUInt32(sector, 0x10); TargetId = BigEndianBitConverter.ToUInt32(sector, 0x0C),
NextPtr = BigEndianBitConverter.ToUInt32(sector, 0x10)
};
loadSeg.LoadData = new byte[(loadSeg.Size - 5) * 4]; loadSeg.LoadData = new byte[(loadSeg.Size - 5) * 4];
Array.Copy(sector, 0x14, loadSeg.LoadData, 0, (loadSeg.Size - 5) * 4); Array.Copy(sector, 0x14, loadSeg.LoadData, 0, (loadSeg.Size - 5) * 4);
@@ -1410,9 +1409,9 @@ namespace DiscImageChef.Partitions
case TYPEID_FFS_CACHE: return "Amiga Fast File System with directory cache"; case TYPEID_FFS_CACHE: return "Amiga Fast File System with directory cache";
case TYPEID_OFS2: return "Amiga Original File System with long filenames"; case TYPEID_OFS2: return "Amiga Original File System with long filenames";
case TYPEID_FFS2: return "Amiga Fast File System with long filenames"; case TYPEID_FFS2: return "Amiga Fast File System with long filenames";
case TypeID_AMIXSysV: return "Amiga UNIX System V filesystem"; case TYPEID_AMIX_SYSV: return "Amiga UNIX System V filesystem";
case TYPEID_AMIX_BOOT: return "Amiga UNIX boot filesystem"; case TYPEID_AMIX_BOOT: return "Amiga UNIX boot filesystem";
case TYPEID_AMIXFFS: return "Amiga UNIX BSD filesystem"; case TYPEID_AMIX_FFS: return "Amiga UNIX BSD filesystem";
case TYPEID_AMIX_RESERVED: return "Amiga UNIX Reserved partition (swap)"; case TYPEID_AMIX_RESERVED: return "Amiga UNIX Reserved partition (swap)";
case TYPEID_PFS: case TYPEID_PFS:
case TYPEID_PFS2: case TYPEID_PFS2:
@@ -1455,7 +1454,7 @@ namespace DiscImageChef.Partitions
if((amigaDosType & TYPEID_OFS) == TYPEID_OFS) if((amigaDosType & TYPEID_OFS) == TYPEID_OFS)
return $"Unknown Amiga DOS filesystem type {AmigaDosTypeToString(amigaDosType)}"; return $"Unknown Amiga DOS filesystem type {AmigaDosTypeToString(amigaDosType)}";
if((amigaDosType & TypeID_AMIXSysV) == TypeID_AMIXSysV) if((amigaDosType & TYPEID_AMIX_SYSV) == TYPEID_AMIX_SYSV)
return $"Unknown Amiga UNIX filesystem type {AmigaDosTypeToString(amigaDosType)}"; return $"Unknown Amiga UNIX filesystem type {AmigaDosTypeToString(amigaDosType)}";
if((amigaDosType & 0x50465300) == 0x50465300 || (amigaDosType & 0x41465300) == 0x41465300) if((amigaDosType & 0x50465300) == 0x50465300 || (amigaDosType & 0x41465300) == 0x41465300)
@@ -1488,21 +1487,15 @@ namespace DiscImageChef.Partitions
} }
} }
static string AmigaDosTypeToString(uint amigaDosType) static string AmigaDosTypeToString(uint amigaDosType, bool quoted = true)
{
return AmigaDosTypeToString(amigaDosType, true);
}
static string AmigaDosTypeToString(uint amigaDosType, bool quoted)
{ {
byte[] textPart = new byte[3]; byte[] textPart = new byte[3];
string textPartString;
textPart[0] = (byte)((amigaDosType & 0xFF000000) >> 24); textPart[0] = (byte)((amigaDosType & 0xFF000000) >> 24);
textPart[1] = (byte)((amigaDosType & 0x00FF0000) >> 16); textPart[1] = (byte)((amigaDosType & 0x00FF0000) >> 16);
textPart[2] = (byte)((amigaDosType & 0x0000FF00) >> 8); textPart[2] = (byte)((amigaDosType & 0x0000FF00) >> 8);
textPartString = Encoding.ASCII.GetString(textPart); string textPartString = Encoding.ASCII.GetString(textPart);
return quoted return quoted
? $"\"{textPartString}\\{amigaDosType & 0xFF}\"" ? $"\"{textPartString}\\{amigaDosType & 0xFF}\""

View File

@@ -57,10 +57,9 @@ namespace DiscImageChef.Partitions
byte[] sector = imagePlugin.ReadSector(sectorOffset); byte[] sector = imagePlugin.ReadSector(sectorOffset);
if(sector.Length < 512) return false; if(sector.Length < 512) return false;
RioKarmaTable table;
IntPtr tablePtr = Marshal.AllocHGlobal(512); IntPtr tablePtr = Marshal.AllocHGlobal(512);
Marshal.Copy(sector, 0, tablePtr, 512); Marshal.Copy(sector, 0, tablePtr, 512);
table = (RioKarmaTable)Marshal.PtrToStructure(tablePtr, typeof(RioKarmaTable)); RioKarmaTable table = (RioKarmaTable)Marshal.PtrToStructure(tablePtr, typeof(RioKarmaTable));
Marshal.FreeHGlobal(tablePtr); Marshal.FreeHGlobal(tablePtr);
if(table.magic != KARMA_MAGIC) return false; if(table.magic != KARMA_MAGIC) return false;

View File

@@ -32,13 +32,17 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes;
using DiscImageChef.Console; using DiscImageChef.Console;
using DiscImageChef.DiscImages; using DiscImageChef.DiscImages;
#pragma warning disable 169
#pragma warning disable 649
namespace DiscImageChef.Partitions namespace DiscImageChef.Partitions
{ {
[SuppressMessage("ReSharper", "InconsistentNaming")]
public class SGI : PartitionPlugin public class SGI : PartitionPlugin
{ {
const int SGI_MAGIC = 0x0BE5A941; const int SGI_MAGIC = 0x0BE5A941;

View File

@@ -32,6 +32,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes;
@@ -40,6 +41,7 @@ using DiscImageChef.DiscImages;
namespace DiscImageChef.Partitions namespace DiscImageChef.Partitions
{ {
[SuppressMessage("ReSharper", "InconsistentNaming")]
public class SunDisklabel : PartitionPlugin public class SunDisklabel : PartitionPlugin
{ {
/// <summary>Sun disklabel magic number</summary> /// <summary>Sun disklabel magic number</summary>
@@ -68,7 +70,7 @@ namespace DiscImageChef.Partitions
const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16) const int LEN_DKL_PAD16 = DK_LABEL_SIZE - (456 + // sizeof(dk_vtoc16)
4 * 4 + 12 * 2 + 2 * 2); 4 * 4 + 12 * 2 + 2 * 2);
public enum SunTag : ushort enum SunTag : ushort
{ {
SunEmpty = 0x0000, SunEmpty = 0x0000,
SunBoot = 0x0001, SunBoot = 0x0001,
@@ -97,7 +99,7 @@ namespace DiscImageChef.Partitions
} }
[Flags] [Flags]
public enum SunFlags : ushort enum SunFlags : ushort
{ {
NoMount = 0x0001, NoMount = 0x0001,
ReadOnly = 0x0010 ReadOnly = 0x0010
@@ -405,7 +407,7 @@ namespace DiscImageChef.Partitions
return lebal; return lebal;
} }
public static string SunFlagsToString(SunFlags flags) static string SunFlagsToString(SunFlags flags)
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if(flags.HasFlag(SunFlags.NoMount)) sb.AppendLine("Unmountable"); if(flags.HasFlag(SunFlags.NoMount)) sb.AppendLine("Unmountable");
@@ -413,7 +415,7 @@ namespace DiscImageChef.Partitions
return sb.ToString(); return sb.ToString();
} }
public static string SunIdToString(SunTag id) static string SunIdToString(SunTag id)
{ {
switch(id) switch(id)
{ {

View File

@@ -62,7 +62,7 @@ namespace DiscImageChef.Partitions
uint magic = 0; uint magic = 0;
ulong pdloc = 0; ulong pdloc = 0;
byte[] pdsector = null; byte[] pdsector = null;
bool magic_found = false; bool magicFound = false;
bool absolute = false; bool absolute = false;
foreach(ulong i in new ulong[] {0, 1, 8, 29}.TakeWhile(i => i + sectorOffset < imagePlugin.GetSectors())) { foreach(ulong i in new ulong[] {0, 1, 8, 29}.TakeWhile(i => i + sectorOffset < imagePlugin.GetSectors())) {
@@ -72,12 +72,12 @@ namespace DiscImageChef.Partitions
i + sectorOffset, magic, PD_MAGIC, PD_CIGAM); i + sectorOffset, magic, PD_MAGIC, PD_CIGAM);
if(magic != PD_MAGIC && magic != PD_CIGAM) continue; if(magic != PD_MAGIC && magic != PD_CIGAM) continue;
magic_found = true; magicFound = true;
pdloc = i; pdloc = i;
break; break;
} }
if(!magic_found) return false; if(!magicFound) return false;
PDInfo pd; PDInfo pd;
PDInfoOld pdold; PDInfoOld pdold;
@@ -139,7 +139,7 @@ namespace DiscImageChef.Partitions
DicConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[6] = {0}", pd.pad[6]); DicConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[6] = {0}", pd.pad[6]);
DicConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[7] = {0}", pd.pad[7]); DicConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[7] = {0}", pd.pad[7]);
magic_found = false; magicFound = false;
bool useOld = false; bool useOld = false;
byte[] vtocsector = imagePlugin.ReadSector(pdloc + sectorOffset + 1); byte[] vtocsector = imagePlugin.ReadSector(pdloc + sectorOffset + 1);
vtoc vtoc = new vtoc(); vtoc vtoc = new vtoc();
@@ -148,7 +148,7 @@ namespace DiscImageChef.Partitions
if(magic == VTOC_SANE || magic == VTOC_ENAS) if(magic == VTOC_SANE || magic == VTOC_ENAS)
{ {
magic_found = true; magicFound = true;
DicConsole.DebugWriteLine("VTOC plugin", "New VTOC found at {0}", pdloc + sectorOffset + 1); DicConsole.DebugWriteLine("VTOC plugin", "New VTOC found at {0}", pdloc + sectorOffset + 1);
if(magic == VTOC_SANE) if(magic == VTOC_SANE)
{ {
@@ -170,13 +170,13 @@ namespace DiscImageChef.Partitions
} }
} }
if(!magic_found && pd.version < XPDVERS) if(!magicFound && pd.version < XPDVERS)
{ {
magic = BitConverter.ToUInt32(vtocsector, 12); magic = BitConverter.ToUInt32(vtocsector, 12);
if(magic == VTOC_SANE || magic == VTOC_ENAS) if(magic == VTOC_SANE || magic == VTOC_ENAS)
{ {
magic_found = true; magicFound = true;
useOld = true; useOld = true;
DicConsole.DebugWriteLine("VTOC plugin", "Old VTOC found at {0}", pdloc + sectorOffset + 1); DicConsole.DebugWriteLine("VTOC plugin", "Old VTOC found at {0}", pdloc + sectorOffset + 1);
if(magic == VTOC_SANE) if(magic == VTOC_SANE)
@@ -200,30 +200,30 @@ namespace DiscImageChef.Partitions
} }
} }
if(!magic_found) if(!magicFound)
{ {
DicConsole.DebugWriteLine("VTOC plugin", "Searching for VTOC on relative byte {0}", pd.vtoc_ptr); DicConsole.DebugWriteLine("VTOC plugin", "Searching for VTOC on relative byte {0}", pd.vtoc_ptr);
ulong rel_sec_ptr = pd.vtoc_ptr / imagePlugin.GetSectorSize(); ulong relSecPtr = pd.vtoc_ptr / imagePlugin.GetSectorSize();
uint rel_sec_off = pd.vtoc_ptr % imagePlugin.GetSectorSize(); uint relSecOff = pd.vtoc_ptr % imagePlugin.GetSectorSize();
uint sec_count = (rel_sec_off + pd.vtoc_len) / imagePlugin.GetSectorSize(); uint secCount = (relSecOff + pd.vtoc_len) / imagePlugin.GetSectorSize();
if((rel_sec_off + pd.vtoc_len) % imagePlugin.GetSectorSize() > 0) sec_count++; if((relSecOff + pd.vtoc_len) % imagePlugin.GetSectorSize() > 0) secCount++;
DicConsole.DebugWriteLine("VTOC plugin", DicConsole.DebugWriteLine("VTOC plugin",
"Going to read {0} sectors from sector {1}, getting VTOC from byte {2}", "Going to read {0} sectors from sector {1}, getting VTOC from byte {2}",
sec_count, rel_sec_ptr + sectorOffset, rel_sec_off); secCount, relSecPtr + sectorOffset, relSecOff);
if(rel_sec_ptr + sectorOffset + sec_count >= imagePlugin.GetSectors()) if(relSecPtr + sectorOffset + secCount >= imagePlugin.GetSectors())
{ {
DicConsole.DebugWriteLine("VTOC plugin", "Going to read past device size, aborting..."); DicConsole.DebugWriteLine("VTOC plugin", "Going to read past device size, aborting...");
return false; return false;
} }
byte[] tmp = imagePlugin.ReadSectors(rel_sec_ptr + sectorOffset, sec_count); byte[] tmp = imagePlugin.ReadSectors(relSecPtr + sectorOffset, secCount);
vtocsector = new byte[pd.vtoc_len]; vtocsector = new byte[pd.vtoc_len];
Array.Copy(tmp, rel_sec_off, vtocsector, 0, pd.vtoc_len); Array.Copy(tmp, relSecOff, vtocsector, 0, pd.vtoc_len);
magic = BitConverter.ToUInt32(vtocsector, 0); magic = BitConverter.ToUInt32(vtocsector, 0);
if(magic == VTOC_SANE || magic == VTOC_ENAS) if(magic == VTOC_SANE || magic == VTOC_ENAS)
{ {
magic_found = true; magicFound = true;
DicConsole.DebugWriteLine("VTOC plugin", "New VTOC found."); DicConsole.DebugWriteLine("VTOC plugin", "New VTOC found.");
if(magic == VTOC_SANE) if(magic == VTOC_SANE)
{ {
@@ -246,7 +246,7 @@ namespace DiscImageChef.Partitions
} }
} }
if(!magic_found) if(!magicFound)
{ {
DicConsole.DebugWriteLine("VTOC plugin", "Cannot find VTOC."); DicConsole.DebugWriteLine("VTOC plugin", "Cannot find VTOC.");
return false; return false;

View File

@@ -69,7 +69,7 @@ namespace DiscImageChef.Partitions
public uint dashboardLen; public uint dashboardLen;
} }
const uint Xbox360DevKitMagic = 0x00020000; const uint XBOX360_DEVKIT_MAGIC = 0x00020000;
public Xbox() public Xbox()
{ {
@@ -90,7 +90,7 @@ namespace DiscImageChef.Partitions
Xbox360DevKitPartitionTable table = Xbox360DevKitPartitionTable table =
BigEndianMarshal.ByteArrayToStructureBigEndian<Xbox360DevKitPartitionTable>(sector); BigEndianMarshal.ByteArrayToStructureBigEndian<Xbox360DevKitPartitionTable>(sector);
if(table.magic == Xbox360DevKitMagic && if(table.magic == XBOX360_DEVKIT_MAGIC &&
table.contentOff + table.contentLen <= imagePlugin.ImageInfo.Sectors && table.contentOff + table.contentLen <= imagePlugin.ImageInfo.Sectors &&
table.dashboardOff + table.dashboardLen <= imagePlugin.ImageInfo.Sectors) table.dashboardOff + table.dashboardLen <= imagePlugin.ImageInfo.Sectors)
{ {