mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Code restyling.
This commit is contained in:
@@ -64,20 +64,29 @@ namespace Aaru.Partitions
|
||||
bool magicFound = false;
|
||||
bool absolute = false;
|
||||
|
||||
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))
|
||||
{
|
||||
pdsector = imagePlugin.ReadSector(i + sectorOffset);
|
||||
magic = BitConverter.ToUInt32(pdsector, 4);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "sanity at {0} is 0x{1:X8} (should be 0x{2:X8} or 0x{3:X8})",
|
||||
i + sectorOffset, magic, PD_MAGIC, PD_CIGAM);
|
||||
if(magic != PD_MAGIC && magic != PD_CIGAM) continue;
|
||||
i + sectorOffset, magic, PD_MAGIC, PD_CIGAM);
|
||||
|
||||
if(magic != PD_MAGIC &&
|
||||
magic != PD_CIGAM)
|
||||
continue;
|
||||
|
||||
magicFound = true;
|
||||
pdloc = i;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if(!magicFound) return false;
|
||||
if(!magicFound)
|
||||
return false;
|
||||
|
||||
PDInfo pd;
|
||||
PDInfoOld pdold;
|
||||
@@ -94,63 +103,69 @@ namespace Aaru.Partitions
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.driveid = {0}", pd.driveid);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.sanity = 0x{0:X8} (should be 0x{1:X8})", pd.sanity,
|
||||
PD_MAGIC);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.version = {0}", pd.version);
|
||||
PD_MAGIC);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.version = {0}", pd.version);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.serial = \"{0}\"", StringHandlers.CToString(pd.serial));
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.cyls = {0}", pd.cyls);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.tracks = {0}", pd.tracks);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.sectors = {0}", pd.sectors);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.bytes = {0}", pd.bytes);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.logicalst = {0}", pd.logicalst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.errlogst = {0}", pd.errlogst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.errlogsz = {0}", pd.errlogsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.mfgst = {0}", pd.mfgst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.mfgsz = {0}", pd.mfgsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.defectst = {0}", pd.defectst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.defectsz = {0}", pd.defectsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relno = {0}", pd.relno);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relst = {0}", pd.relst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relsz = {0}", pd.relsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relnext = {0}", pd.relnext);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.allcstrt = {0}", pdold.allcstrt);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.allcend = {0}", pdold.allcend);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.vtoc_ptr = {0}", pd.vtoc_ptr);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.vtoc_len = {0}", pd.vtoc_len);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.vtoc_pad = {0}", pd.vtoc_pad);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.alt_ptr = {0}", pd.alt_ptr);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.alt_len = {0}", pd.alt_len);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pcyls = {0}", pd.pcyls);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.ptracks = {0}", pd.ptracks);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.psectors = {0}", pd.psectors);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pbytes = {0}", pd.pbytes);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.secovhd = {0}", pd.secovhd);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.cyls = {0}", pd.cyls);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.tracks = {0}", pd.tracks);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.sectors = {0}", pd.sectors);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.bytes = {0}", pd.bytes);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.logicalst = {0}", pd.logicalst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.errlogst = {0}", pd.errlogst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.errlogsz = {0}", pd.errlogsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.mfgst = {0}", pd.mfgst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.mfgsz = {0}", pd.mfgsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.defectst = {0}", pd.defectst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.defectsz = {0}", pd.defectsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relno = {0}", pd.relno);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relst = {0}", pd.relst);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relsz = {0}", pd.relsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.relnext = {0}", pd.relnext);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.allcstrt = {0}", pdold.allcstrt);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.allcend = {0}", pdold.allcend);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.vtoc_ptr = {0}", pd.vtoc_ptr);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.vtoc_len = {0}", pd.vtoc_len);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.vtoc_pad = {0}", pd.vtoc_pad);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.alt_ptr = {0}", pd.alt_ptr);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.alt_len = {0}", pd.alt_len);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pcyls = {0}", pd.pcyls);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.ptracks = {0}", pd.ptracks);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.psectors = {0}", pd.psectors);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pbytes = {0}", pd.pbytes);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.secovhd = {0}", pd.secovhd);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.interleave = {0}", pd.interleave);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.skew = {0}", pd.skew);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[0] = {0}", pd.pad[0]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[1] = {0}", pd.pad[1]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[2] = {0}", pd.pad[2]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[3] = {0}", pd.pad[3]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[4] = {0}", pd.pad[4]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[5] = {0}", pd.pad[5]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[6] = {0}", pd.pad[6]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[7] = {0}", pd.pad[7]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.skew = {0}", pd.skew);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[0] = {0}", pd.pad[0]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[1] = {0}", pd.pad[1]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[2] = {0}", pd.pad[2]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[3] = {0}", pd.pad[3]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[4] = {0}", pd.pad[4]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[5] = {0}", pd.pad[5]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[6] = {0}", pd.pad[6]);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "pdinfo.pad[7] = {0}", pd.pad[7]);
|
||||
|
||||
magicFound = false;
|
||||
bool useOld = false;
|
||||
byte[] vtocsector = imagePlugin.ReadSector(pdloc + sectorOffset + 1);
|
||||
vtoc vtoc = new vtoc();
|
||||
vtocold vtocOld = new vtocold();
|
||||
bool useOld = false;
|
||||
byte[] vtocsector = imagePlugin.ReadSector(pdloc + sectorOffset + 1);
|
||||
var vtoc = new vtoc();
|
||||
var vtocOld = new vtocold();
|
||||
magic = BitConverter.ToUInt32(vtocsector, 0);
|
||||
|
||||
if(magic == VTOC_SANE || magic == VTOC_ENAS)
|
||||
if(magic == VTOC_SANE ||
|
||||
magic == VTOC_ENAS)
|
||||
{
|
||||
magicFound = true;
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "New VTOC found at {0}", pdloc + sectorOffset + 1);
|
||||
if(magic == VTOC_SANE) vtoc = Marshal.ByteArrayToStructureLittleEndian<vtoc>(vtocsector);
|
||||
|
||||
if(magic == VTOC_SANE)
|
||||
vtoc = Marshal.ByteArrayToStructureLittleEndian<vtoc>(vtocsector);
|
||||
else
|
||||
{
|
||||
vtoc = Marshal.ByteArrayToStructureBigEndian<vtoc>(vtocsector);
|
||||
|
||||
for(int i = 0; i < vtoc.v_part.Length; i++)
|
||||
{
|
||||
vtoc.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtoc.v_part[i].p_tag);
|
||||
@@ -162,19 +177,24 @@ namespace Aaru.Partitions
|
||||
}
|
||||
}
|
||||
|
||||
if(!magicFound && pd.version < XPDVERS)
|
||||
if(!magicFound &&
|
||||
pd.version < XPDVERS)
|
||||
{
|
||||
magic = BitConverter.ToUInt32(vtocsector, 12);
|
||||
|
||||
if(magic == VTOC_SANE || magic == VTOC_ENAS)
|
||||
if(magic == VTOC_SANE ||
|
||||
magic == VTOC_ENAS)
|
||||
{
|
||||
magicFound = true;
|
||||
useOld = true;
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "Old VTOC found at {0}", pdloc + sectorOffset + 1);
|
||||
if(magic == VTOC_SANE) vtocOld = Marshal.ByteArrayToStructureLittleEndian<vtocold>(vtocsector);
|
||||
|
||||
if(magic == VTOC_SANE)
|
||||
vtocOld = Marshal.ByteArrayToStructureLittleEndian<vtocold>(vtocsector);
|
||||
else
|
||||
{
|
||||
vtocOld = Marshal.ByteArrayToStructureBigEndian<vtocold>(vtocsector);
|
||||
|
||||
for(int i = 0; i < vtocOld.v_part.Length; i++)
|
||||
{
|
||||
vtocOld.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtocOld.v_part[i].p_tag);
|
||||
@@ -193,13 +213,18 @@ namespace Aaru.Partitions
|
||||
ulong relSecPtr = pd.vtoc_ptr / imagePlugin.Info.SectorSize;
|
||||
uint relSecOff = pd.vtoc_ptr % imagePlugin.Info.SectorSize;
|
||||
uint secCount = (relSecOff + pd.vtoc_len) / imagePlugin.Info.SectorSize;
|
||||
if((relSecOff + pd.vtoc_len) % imagePlugin.Info.SectorSize > 0) secCount++;
|
||||
|
||||
if((relSecOff + pd.vtoc_len) % imagePlugin.Info.SectorSize > 0)
|
||||
secCount++;
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin",
|
||||
"Going to read {0} sectors from sector {1}, getting VTOC from byte {2}",
|
||||
secCount, relSecPtr + sectorOffset, relSecOff);
|
||||
"Going to read {0} sectors from sector {1}, getting VTOC from byte {2}",
|
||||
secCount, relSecPtr + sectorOffset, relSecOff);
|
||||
|
||||
if(relSecPtr + sectorOffset + secCount >= imagePlugin.Info.Sectors)
|
||||
{
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "Going to read past device size, aborting...");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -208,14 +233,18 @@ namespace Aaru.Partitions
|
||||
Array.Copy(tmp, relSecOff, vtocsector, 0, pd.vtoc_len);
|
||||
magic = BitConverter.ToUInt32(vtocsector, 0);
|
||||
|
||||
if(magic == VTOC_SANE || magic == VTOC_ENAS)
|
||||
if(magic == VTOC_SANE ||
|
||||
magic == VTOC_ENAS)
|
||||
{
|
||||
magicFound = true;
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "New VTOC found.");
|
||||
if(magic == VTOC_SANE) vtoc = Marshal.ByteArrayToStructureLittleEndian<vtoc>(vtocsector);
|
||||
|
||||
if(magic == VTOC_SANE)
|
||||
vtoc = Marshal.ByteArrayToStructureLittleEndian<vtoc>(vtocsector);
|
||||
else
|
||||
{
|
||||
vtoc = Marshal.ByteArrayToStructureBigEndian<vtoc>(vtocsector);
|
||||
|
||||
for(int i = 0; i < vtoc.v_part.Length; i++)
|
||||
{
|
||||
vtoc.v_part[i].p_tag = (pTag)Swapping.Swap((ushort)vtoc.v_part[i].p_tag);
|
||||
@@ -231,52 +260,70 @@ namespace Aaru.Partitions
|
||||
if(!magicFound)
|
||||
{
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "Cannot find VTOC.");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if(useOld)
|
||||
{
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_sanity = 0x{0:X8} (should be 0x{1:X8})",
|
||||
vtocOld.v_sanity, VTOC_SANE);
|
||||
vtocOld.v_sanity, VTOC_SANE);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_version = {0}", vtocOld.v_version);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_volume = \"{0}\"",
|
||||
StringHandlers.CToString(vtocOld.v_volume));
|
||||
StringHandlers.CToString(vtocOld.v_volume));
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_sectorsz = {0}", vtocOld.v_sectorsz);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_nparts = {0}", vtocOld.v_nparts);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_nparts = {0}", vtocOld.v_nparts);
|
||||
|
||||
for(int i = 0; i < V_NUMPAR; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_part[{0}].p_tag = {1} ({2})", i,
|
||||
vtocOld.v_part[i].p_tag, (ushort)vtocOld.v_part[i].p_tag);
|
||||
vtocOld.v_part[i].p_tag, (ushort)vtocOld.v_part[i].p_tag);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_part[{0}].p_flag = {1} ({2})", i,
|
||||
vtocOld.v_part[i].p_flag, (ushort)vtocOld.v_part[i].p_flag);
|
||||
vtocOld.v_part[i].p_flag, (ushort)vtocOld.v_part[i].p_flag);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_part[{0}].p_start = {1}", i,
|
||||
vtocOld.v_part[i].p_start);
|
||||
vtocOld.v_part[i].p_start);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.v_part[{0}].p_size = {1}", i,
|
||||
vtocOld.v_part[i].p_size);
|
||||
vtocOld.v_part[i].p_size);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtocOld.timestamp[{0}] = {1}", i,
|
||||
DateHandlers.UnixToDateTime(vtocOld.timestamp[i]));
|
||||
DateHandlers.UnixToDateTime(vtocOld.timestamp[i]));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_sanity = 0x{0:X8} (should be 0x{1:X8})", vtoc.v_sanity,
|
||||
VTOC_SANE);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_sanity = 0x{0:X8} (should be 0x{1:X8})",
|
||||
vtoc.v_sanity, VTOC_SANE);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_version = {0}", vtoc.v_version);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_volume = \"{0}\"",
|
||||
StringHandlers.CToString(vtoc.v_volume));
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_pad = {0}", vtoc.v_pad);
|
||||
StringHandlers.CToString(vtoc.v_volume));
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_pad = {0}", vtoc.v_pad);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_nparts = {0}", vtoc.v_nparts);
|
||||
|
||||
for(int i = 0; i < V_NUMPAR; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_part[{0}].p_tag = {1} ({2})", i,
|
||||
vtoc.v_part[i].p_tag, (ushort)vtoc.v_part[i].p_tag);
|
||||
vtoc.v_part[i].p_tag, (ushort)vtoc.v_part[i].p_tag);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_part[{0}].p_flag = {1} ({2})", i,
|
||||
vtoc.v_part[i].p_flag, (ushort)vtoc.v_part[i].p_flag);
|
||||
vtoc.v_part[i].p_flag, (ushort)vtoc.v_part[i].p_flag);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_part[{0}].p_start = {1}", i,
|
||||
vtoc.v_part[i].p_start);
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_part[{0}].p_size = {1}", i, vtoc.v_part[i].p_size);
|
||||
vtoc.v_part[i].p_start);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.v_part[{0}].p_size = {1}", i,
|
||||
vtoc.v_part[i].p_size);
|
||||
|
||||
AaruConsole.DebugWriteLine("VTOC plugin", "vtoc.timestamp[{0}] = {1}", i,
|
||||
DateHandlers.UnixToDateTime(vtoc.timestamp[i]));
|
||||
DateHandlers.UnixToDateTime(vtoc.timestamp[i]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -300,45 +347,58 @@ namespace Aaru.Partitions
|
||||
// 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++)
|
||||
if(parts[i].p_tag == pTag.V_BACKUP && (ulong)parts[i].p_start == sectorOffset)
|
||||
if(parts[i].p_tag == pTag.V_BACKUP &&
|
||||
(ulong)parts[i].p_start == sectorOffset)
|
||||
{
|
||||
absolute = true;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
for(int i = 0; i < V_NUMPAR; i++)
|
||||
if(parts[i].p_tag != pTag.V_UNUSED)
|
||||
{
|
||||
Partition part = new Partition
|
||||
var part = new Partition
|
||||
{
|
||||
Start = (ulong)(parts[i].p_start * bps) / imagePlugin.Info.SectorSize,
|
||||
Length = (ulong)(parts[i].p_size * bps) / imagePlugin.Info.SectorSize,
|
||||
Offset = (ulong)(parts[i].p_start * bps),
|
||||
Size = (ulong)(parts[i].p_size * bps),
|
||||
Offset = (ulong)(parts[i].p_start * bps), Size = (ulong)(parts[i].p_size * bps),
|
||||
Sequence = (ulong)i,
|
||||
Type = $"UNIX: {decodeUNIXTAG(parts[i].p_tag, !useOld)}",
|
||||
Scheme = Name
|
||||
Type = $"UNIX: {decodeUNIXTAG(parts[i].p_tag, !useOld)}", Scheme = Name
|
||||
};
|
||||
|
||||
string info = "";
|
||||
|
||||
// Apparently old ones are absolute :?
|
||||
if(!useOld && !absolute)
|
||||
if(!useOld &&
|
||||
!absolute)
|
||||
{
|
||||
part.Start += sectorOffset;
|
||||
part.Offset += sectorOffset * imagePlugin.Info.SectorSize;
|
||||
}
|
||||
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_VALID)) info += " (valid)";
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_UNMNT)) info += " (unmountable)";
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_OPEN)) info += " (open)";
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_REMAP)) info += " (alternate sector mapping)";
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_RONLY)) info += " (read-only)";
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_VALID))
|
||||
info += " (valid)";
|
||||
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_UNMNT))
|
||||
info += " (unmountable)";
|
||||
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_OPEN))
|
||||
info += " (open)";
|
||||
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_REMAP))
|
||||
info += " (alternate sector mapping)";
|
||||
|
||||
if(parts[i].p_flag.HasFlag(pFlag.V_RONLY))
|
||||
info += " (read-only)";
|
||||
|
||||
if(timestamps[i] != 0)
|
||||
info += $" created on {DateHandlers.UnixToDateTime(timestamps[i])}";
|
||||
|
||||
part.Description = "UNIX slice" + info + ".";
|
||||
|
||||
if(part.End < imagePlugin.Info.Sectors) partitions.Add(part);
|
||||
if(part.End < imagePlugin.Info.Sectors)
|
||||
partitions.Add(part);
|
||||
}
|
||||
|
||||
return partitions.Count > 0;
|
||||
@@ -371,106 +431,106 @@ namespace Aaru.Partitions
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct PDInfo
|
||||
{
|
||||
public uint driveid; /*identifies the device type*/
|
||||
public uint sanity; /*verifies device sanity*/
|
||||
public uint version; /*version number*/
|
||||
public readonly uint driveid; /*identifies the device type*/
|
||||
public readonly uint sanity; /*verifies device sanity*/
|
||||
public readonly uint version; /*version number*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] serial; /*serial number of the device*/
|
||||
public uint cyls; /*number of cylinders per drive*/
|
||||
public uint tracks; /*number tracks per cylinder*/
|
||||
public uint sectors; /*number sectors per track*/
|
||||
public uint bytes; /*number of bytes per sector*/
|
||||
public uint logicalst; /*sector address of logical sector 0*/
|
||||
public uint errlogst; /*sector address of error log area*/
|
||||
public uint errlogsz; /*size in bytes of error log area*/
|
||||
public uint mfgst; /*sector address of mfg. defect info*/
|
||||
public uint mfgsz; /*size in bytes of mfg. defect info*/
|
||||
public uint defectst; /*sector address of the defect map*/
|
||||
public uint defectsz; /*size in bytes of defect map*/
|
||||
public uint relno; /*number of relocation areas*/
|
||||
public uint relst; /*sector address of relocation area*/
|
||||
public uint relsz; /*size in sectors of relocation area*/
|
||||
public uint relnext; /*address of next avail reloc sector*/
|
||||
public readonly byte[] serial; /*serial number of the device*/
|
||||
public readonly uint cyls; /*number of cylinders per drive*/
|
||||
public readonly uint tracks; /*number tracks per cylinder*/
|
||||
public readonly uint sectors; /*number sectors per track*/
|
||||
public readonly uint bytes; /*number of bytes per sector*/
|
||||
public readonly uint logicalst; /*sector address of logical sector 0*/
|
||||
public readonly uint errlogst; /*sector address of error log area*/
|
||||
public readonly uint errlogsz; /*size in bytes of error log area*/
|
||||
public readonly uint mfgst; /*sector address of mfg. defect info*/
|
||||
public readonly uint mfgsz; /*size in bytes of mfg. defect info*/
|
||||
public readonly uint defectst; /*sector address of the defect map*/
|
||||
public readonly uint defectsz; /*size in bytes of defect map*/
|
||||
public readonly uint relno; /*number of relocation areas*/
|
||||
public readonly uint relst; /*sector address of relocation area*/
|
||||
public readonly uint relsz; /*size in sectors of relocation area*/
|
||||
public readonly uint relnext; /*address of next avail reloc sector*/
|
||||
/* the previous items are left intact from AT&T's 3b2 pdinfo. Following
|
||||
are added for the 80386 port */
|
||||
public uint vtoc_ptr; /*byte offset of vtoc block*/
|
||||
public ushort vtoc_len; /*byte length of vtoc block*/
|
||||
public ushort vtoc_pad; /* pad for 16-bit machine alignment */
|
||||
public uint alt_ptr; /*byte offset of alternates table*/
|
||||
public ushort alt_len; /*byte length of alternates table*/
|
||||
public readonly uint vtoc_ptr; /*byte offset of vtoc block*/
|
||||
public readonly ushort vtoc_len; /*byte length of vtoc block*/
|
||||
public readonly ushort vtoc_pad; /* pad for 16-bit machine alignment */
|
||||
public readonly uint alt_ptr; /*byte offset of alternates table*/
|
||||
public readonly ushort alt_len; /*byte length of alternates table*/
|
||||
/* new in version 3 */
|
||||
public uint pcyls; /*physical cylinders per drive*/
|
||||
public uint ptracks; /*physical tracks per cylinder*/
|
||||
public uint psectors; /*physical sectors per track*/
|
||||
public uint pbytes; /*physical bytes per sector*/
|
||||
public uint secovhd; /*sector overhead bytes per sector*/
|
||||
public ushort interleave; /*interleave factor*/
|
||||
public ushort skew; /*skew factor*/
|
||||
public readonly uint pcyls; /*physical cylinders per drive*/
|
||||
public readonly uint ptracks; /*physical tracks per cylinder*/
|
||||
public readonly uint psectors; /*physical sectors per track*/
|
||||
public readonly uint pbytes; /*physical bytes per sector*/
|
||||
public readonly uint secovhd; /*sector overhead bytes per sector*/
|
||||
public readonly ushort interleave; /*interleave factor*/
|
||||
public readonly ushort skew; /*skew factor*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public uint[] pad; /*space for more stuff*/
|
||||
public readonly uint[] pad; /*space for more stuff*/
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct PDInfoOld
|
||||
{
|
||||
public uint driveid; /*identifies the device type*/
|
||||
public uint sanity; /*verifies device sanity*/
|
||||
public uint version; /*version number*/
|
||||
public readonly uint driveid; /*identifies the device type*/
|
||||
public readonly uint sanity; /*verifies device sanity*/
|
||||
public readonly uint version; /*version number*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] serial; /*serial number of the device*/
|
||||
public uint cyls; /*number of cylinders per drive*/
|
||||
public uint tracks; /*number tracks per cylinder*/
|
||||
public uint sectors; /*number sectors per track*/
|
||||
public uint bytes; /*number of bytes per sector*/
|
||||
public uint logicalst; /*sector address of logical sector 0*/
|
||||
public uint errlogst; /*sector address of error log area*/
|
||||
public uint errlogsz; /*size in bytes of error log area*/
|
||||
public uint mfgst; /*sector address of mfg. defect info*/
|
||||
public uint mfgsz; /*size in bytes of mfg. defect info*/
|
||||
public uint defectst; /*sector address of the defect map*/
|
||||
public uint defectsz; /*size in bytes of defect map*/
|
||||
public uint relno; /*number of relocation areas*/
|
||||
public uint relst; /*sector address of relocation area*/
|
||||
public uint relsz; /*size in sectors of relocation area*/
|
||||
public uint relnext; /*address of next avail reloc sector*/
|
||||
public uint allcstrt; /*start of the allocatable disk*/
|
||||
public uint allcend; /*end of allocatable disk*/
|
||||
public readonly byte[] serial; /*serial number of the device*/
|
||||
public readonly uint cyls; /*number of cylinders per drive*/
|
||||
public readonly uint tracks; /*number tracks per cylinder*/
|
||||
public readonly uint sectors; /*number sectors per track*/
|
||||
public readonly uint bytes; /*number of bytes per sector*/
|
||||
public readonly uint logicalst; /*sector address of logical sector 0*/
|
||||
public readonly uint errlogst; /*sector address of error log area*/
|
||||
public readonly uint errlogsz; /*size in bytes of error log area*/
|
||||
public readonly uint mfgst; /*sector address of mfg. defect info*/
|
||||
public readonly uint mfgsz; /*size in bytes of mfg. defect info*/
|
||||
public readonly uint defectst; /*sector address of the defect map*/
|
||||
public readonly uint defectsz; /*size in bytes of defect map*/
|
||||
public readonly uint relno; /*number of relocation areas*/
|
||||
public readonly uint relst; /*sector address of relocation area*/
|
||||
public readonly uint relsz; /*size in sectors of relocation area*/
|
||||
public readonly uint relnext; /*address of next avail reloc sector*/
|
||||
public readonly uint allcstrt; /*start of the allocatable disk*/
|
||||
public readonly uint allcend; /*end of allocatable disk*/
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct vtocold
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public uint[] v_bootinfo; /*info needed by mboot*/
|
||||
public uint v_sanity; /*to verify vtoc sanity*/
|
||||
public uint v_version; /*layout version*/
|
||||
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 byte[] v_volume; /*volume name*/
|
||||
public ushort v_sectorsz; /*sector size in bytes*/
|
||||
public ushort v_nparts; /*number of partitions*/
|
||||
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 uint[] v_reserved; /*free space*/
|
||||
public readonly uint[] v_reserved; /*free space*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public partition[] v_part; /*partition headers*/
|
||||
public readonly partition[] v_part; /*partition headers*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public int[] timestamp; /* SCSI time stamp */
|
||||
public readonly int[] timestamp; /* SCSI time stamp */
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
struct vtoc
|
||||
{
|
||||
public uint v_sanity; /*to verify vtoc sanity*/
|
||||
public uint v_version; /*layout version*/
|
||||
public readonly uint v_sanity; /*to verify vtoc sanity*/
|
||||
public readonly uint v_version; /*layout version*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] v_volume; /*volume name*/
|
||||
public ushort v_nparts; /*number of partitions*/
|
||||
public ushort v_pad; /*pad for 286 compiler*/
|
||||
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 uint[] v_reserved; /*free space*/
|
||||
public readonly uint[] v_reserved; /*free space*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public partition[] v_part; /*partition headers*/
|
||||
public readonly partition[] v_part; /*partition headers*/
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = V_NUMPAR)]
|
||||
public int[] timestamp; /* SCSI time stamp */
|
||||
public readonly int[] timestamp; /* SCSI time stamp */
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -533,13 +593,12 @@ namespace Aaru.Partitions
|
||||
[Flags]
|
||||
enum pFlag : ushort
|
||||
{
|
||||
/* 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 */
|
||||
/* 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 */
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user