mirror of
https://github.com/aaru-dps/Aaru.Server.git
synced 2025-12-16 19:24:27 +00:00
Add interface to pass dump hardware list and CICM XML metadata to/from images.
This commit is contained in:
@@ -417,6 +417,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
||||
(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000));
|
||||
}
|
||||
|
||||
outputPlugin.SetDumpHardware(resume.Tries);
|
||||
dumpLog.WriteLine("Closing output file.");
|
||||
DicConsole.WriteLine("Closing output file.");
|
||||
outputPlugin.Close();
|
||||
|
||||
@@ -886,6 +886,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
||||
throw new ArgumentException(outputPlugin.ErrorMessage);
|
||||
}
|
||||
|
||||
outputPlugin.SetDumpHardware(resume.Tries);
|
||||
dumpLog.WriteLine("Closing output file.");
|
||||
DicConsole.WriteLine("Closing output file.");
|
||||
outputPlugin.Close();
|
||||
|
||||
@@ -645,6 +645,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
||||
}
|
||||
}
|
||||
|
||||
outputPlugin.SetDumpHardware(resume.Tries);
|
||||
dumpLog.WriteLine("Closing output file.");
|
||||
DicConsole.WriteLine("Closing output file.");
|
||||
outputPlugin.Close();
|
||||
|
||||
@@ -390,6 +390,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
||||
|
||||
currentTry.Extents = ExtentsConverter.ToMetadata(extents);
|
||||
|
||||
outputPlugin.SetDumpHardware(resume.Tries);
|
||||
dumpLog.WriteLine("Closing output file.");
|
||||
DicConsole.WriteLine("Closing output file.");
|
||||
outputPlugin.Close();
|
||||
|
||||
@@ -770,6 +770,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
||||
throw new ArgumentException(outputPlugin.ErrorMessage);
|
||||
}
|
||||
|
||||
outputPlugin.SetDumpHardware(resume.Tries);
|
||||
dumpLog.WriteLine("Closing output file.");
|
||||
DicConsole.WriteLine("Closing output file.");
|
||||
outputPlugin.Close();
|
||||
|
||||
@@ -61,7 +61,8 @@ namespace DiscImageChef.Core
|
||||
/// <param name="plugins">Image plugins</param>
|
||||
/// <param name="imgChecksums">List of image checksums</param>
|
||||
/// <param name="sidecar">Metadata sidecar</param>
|
||||
static void BlockMedia(IMediaImage image, Guid filterId, string imagePath, FileInfo fi, PluginBase plugins,
|
||||
static void BlockMedia(IMediaImage image, Guid filterId, string imagePath,
|
||||
FileInfo fi, PluginBase plugins,
|
||||
List<ChecksumType> imgChecksums, ref CICMMetadataType sidecar, Encoding encoding)
|
||||
{
|
||||
sidecar.BlockMedia = new[]
|
||||
@@ -69,14 +70,14 @@ namespace DiscImageChef.Core
|
||||
new BlockMediaType
|
||||
{
|
||||
Checksums = imgChecksums.ToArray(),
|
||||
Image = new ImageType
|
||||
Image = new ImageType
|
||||
{
|
||||
format = image.Format,
|
||||
offset = 0,
|
||||
format = image.Format,
|
||||
offset = 0,
|
||||
offsetSpecified = true,
|
||||
Value = Path.GetFileName(imagePath)
|
||||
Value = Path.GetFileName(imagePath)
|
||||
},
|
||||
Size = fi.Length,
|
||||
Size = fi.Length,
|
||||
Sequence = new SequenceType {MediaTitle = image.Info.MediaTitle}
|
||||
}
|
||||
};
|
||||
@@ -84,12 +85,12 @@ namespace DiscImageChef.Core
|
||||
if(image.Info.MediaSequence != 0 && image.Info.LastMediaSequence != 0)
|
||||
{
|
||||
sidecar.BlockMedia[0].Sequence.MediaSequence = image.Info.MediaSequence;
|
||||
sidecar.BlockMedia[0].Sequence.TotalMedia = image.Info.LastMediaSequence;
|
||||
sidecar.BlockMedia[0].Sequence.TotalMedia = image.Info.LastMediaSequence;
|
||||
}
|
||||
else
|
||||
{
|
||||
sidecar.BlockMedia[0].Sequence.MediaSequence = 1;
|
||||
sidecar.BlockMedia[0].Sequence.TotalMedia = 1;
|
||||
sidecar.BlockMedia[0].Sequence.TotalMedia = 1;
|
||||
}
|
||||
|
||||
foreach(MediaTagType tagType in image.Info.ReadableMediaTags)
|
||||
@@ -118,7 +119,7 @@ namespace DiscImageChef.Core
|
||||
};
|
||||
break;
|
||||
case MediaTagType.PCMCIA_CIS:
|
||||
byte[] cis = image.ReadDiskTag(MediaTagType.PCMCIA_CIS);
|
||||
byte[] cis = image.ReadDiskTag(MediaTagType.PCMCIA_CIS);
|
||||
sidecar.BlockMedia[0].PCMCIA = new PCMCIAType
|
||||
{
|
||||
CIS = new DumpType {Checksums = Checksum.GetChecksums(cis).ToArray(), Size = cis.Length}
|
||||
@@ -134,11 +135,13 @@ namespace DiscImageChef.Core
|
||||
|
||||
if(manfid != null)
|
||||
{
|
||||
sidecar.BlockMedia[0].PCMCIA.ManufacturerCode = manfid.ManufacturerID;
|
||||
sidecar.BlockMedia[0].PCMCIA.CardCode = manfid.CardID;
|
||||
sidecar.BlockMedia[0].PCMCIA.ManufacturerCode =
|
||||
manfid.ManufacturerID;
|
||||
sidecar.BlockMedia[0].PCMCIA.CardCode = manfid.CardID;
|
||||
sidecar.BlockMedia[0].PCMCIA.ManufacturerCodeSpecified = true;
|
||||
sidecar.BlockMedia[0].PCMCIA.CardCodeSpecified = true;
|
||||
sidecar.BlockMedia[0].PCMCIA.CardCodeSpecified = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case TupleCodes.CISTPL_VERS_1:
|
||||
Level1VersionTuple vers = CIS.DecodeLevel1VersionTuple(tuple);
|
||||
@@ -146,12 +149,13 @@ namespace DiscImageChef.Core
|
||||
if(vers != null)
|
||||
{
|
||||
sidecar.BlockMedia[0].PCMCIA.Manufacturer = vers.Manufacturer;
|
||||
sidecar.BlockMedia[0].PCMCIA.ProductName = vers.Product;
|
||||
sidecar.BlockMedia[0].PCMCIA.Compliance =
|
||||
sidecar.BlockMedia[0].PCMCIA.ProductName = vers.Product;
|
||||
sidecar.BlockMedia[0].PCMCIA.Compliance =
|
||||
$"{vers.MajorVersion}.{vers.MinorVersion}";
|
||||
sidecar.BlockMedia[0].PCMCIA.AdditionalInformation =
|
||||
vers.AdditionalInformation;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -173,7 +177,7 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].SecureDigital.CID = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.SD_CID)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CID).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CID).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.SD_CSD:
|
||||
@@ -182,7 +186,7 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].SecureDigital.CSD = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.SD_CSD)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CSD).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CSD).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.SD_SCR:
|
||||
@@ -191,7 +195,7 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].SecureDigital.SCR = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.SD_SCR)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_SCR).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_SCR).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.SD_OCR:
|
||||
@@ -200,7 +204,7 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].SecureDigital.OCR = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.SD_OCR)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_OCR).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_OCR).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.MMC_CID:
|
||||
@@ -209,7 +213,7 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].MultiMediaCard.CID = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.SD_CID)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CID).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CID).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.MMC_CSD:
|
||||
@@ -218,7 +222,7 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].MultiMediaCard.CSD = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.SD_CSD)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CSD).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_CSD).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.MMC_OCR:
|
||||
@@ -227,12 +231,12 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].MultiMediaCard.OCR = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.SD_OCR)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_OCR).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.SD_OCR).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.MMC_ExtendedCSD:
|
||||
if(sidecar.BlockMedia[0].MultiMediaCard == null)
|
||||
sidecar.BlockMedia[0].MultiMediaCard = new MultiMediaCardType();
|
||||
sidecar.BlockMedia[0].MultiMediaCard = new MultiMediaCardType();
|
||||
sidecar.BlockMedia[0].MultiMediaCard.ExtendedCSD = new DumpType
|
||||
{
|
||||
Checksums =
|
||||
@@ -253,9 +257,9 @@ namespace DiscImageChef.Core
|
||||
// For fast debugging, skip checksum
|
||||
//goto skipImageChecksum;
|
||||
|
||||
uint sectorsToRead = 512;
|
||||
ulong sectors = image.Info.Sectors;
|
||||
ulong doneSectors = 0;
|
||||
uint sectorsToRead = 512;
|
||||
ulong sectors = image.Info.Sectors;
|
||||
ulong doneSectors = 0;
|
||||
|
||||
InitProgress2();
|
||||
while(doneSectors < sectors)
|
||||
@@ -289,13 +293,13 @@ namespace DiscImageChef.Core
|
||||
}
|
||||
|
||||
MediaType.MediaTypeToString(image.Info.MediaType, out string dskType, out string dskSubType);
|
||||
sidecar.BlockMedia[0].DiskType = dskType;
|
||||
sidecar.BlockMedia[0].DiskType = dskType;
|
||||
sidecar.BlockMedia[0].DiskSubType = dskSubType;
|
||||
Statistics.AddMedia(image.Info.MediaType, false);
|
||||
|
||||
sidecar.BlockMedia[0].Dimensions = Dimensions.DimensionsFromMediaType(image.Info.MediaType);
|
||||
|
||||
sidecar.BlockMedia[0].LogicalBlocks = (long)image.Info.Sectors;
|
||||
sidecar.BlockMedia[0].LogicalBlocks = (long)image.Info.Sectors;
|
||||
sidecar.BlockMedia[0].LogicalBlockSize = (int)image.Info.SectorSize;
|
||||
// TODO: Detect it
|
||||
sidecar.BlockMedia[0].PhysicalBlockSize = (int)image.Info.SectorSize;
|
||||
@@ -314,11 +318,11 @@ namespace DiscImageChef.Core
|
||||
sidecar.BlockMedia[0].FileSystemInformation[i] = new PartitionType
|
||||
{
|
||||
Description = partitions[i].Description,
|
||||
EndSector = (int)partitions[i].End,
|
||||
Name = partitions[i].Name,
|
||||
Sequence = (int)partitions[i].Sequence,
|
||||
EndSector = (int)partitions[i].End,
|
||||
Name = partitions[i].Name,
|
||||
Sequence = (int)partitions[i].Sequence,
|
||||
StartSector = (int)partitions[i].Start,
|
||||
Type = partitions[i].Type
|
||||
Type = partitions[i].Type
|
||||
};
|
||||
List<FileSystemType> lstFs = new List<FileSystemType>();
|
||||
|
||||
@@ -331,9 +335,9 @@ namespace DiscImageChef.Core
|
||||
lstFs.Add(plugin.XmlFsType);
|
||||
Statistics.AddFilesystem(plugin.XmlFsType.Type);
|
||||
}
|
||||
#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
|
||||
#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
|
||||
{
|
||||
//DicConsole.DebugWriteLine("Create-sidecar command", "Plugin {0} crashed", _plugin.Name);
|
||||
}
|
||||
@@ -343,17 +347,14 @@ namespace DiscImageChef.Core
|
||||
}
|
||||
else
|
||||
{
|
||||
sidecar.BlockMedia[0].FileSystemInformation[0] = new PartitionType
|
||||
{
|
||||
StartSector = 0,
|
||||
EndSector = (int)(image.Info.Sectors - 1)
|
||||
};
|
||||
sidecar.BlockMedia[0].FileSystemInformation[0] =
|
||||
new PartitionType {StartSector = 0, EndSector = (int)(image.Info.Sectors - 1)};
|
||||
|
||||
Partition wholePart = new Partition
|
||||
{
|
||||
Name = "Whole device",
|
||||
Name = "Whole device",
|
||||
Length = image.Info.Sectors,
|
||||
Size = image.Info.Sectors * image.Info.SectorSize
|
||||
Size = image.Info.Sectors * image.Info.SectorSize
|
||||
};
|
||||
|
||||
List<FileSystemType> lstFs = new List<FileSystemType>();
|
||||
@@ -367,9 +368,9 @@ namespace DiscImageChef.Core
|
||||
lstFs.Add(plugin.XmlFsType);
|
||||
Statistics.AddFilesystem(plugin.XmlFsType.Type);
|
||||
}
|
||||
#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
|
||||
#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
|
||||
{
|
||||
//DicConsole.DebugWriteLine("Create-sidecar command", "Plugin {0} crashed", _plugin.Name);
|
||||
}
|
||||
@@ -379,39 +380,41 @@ namespace DiscImageChef.Core
|
||||
|
||||
if(image.Info.Cylinders > 0 && image.Info.Heads > 0 && image.Info.SectorsPerTrack > 0)
|
||||
{
|
||||
sidecar.BlockMedia[0].CylindersSpecified = true;
|
||||
sidecar.BlockMedia[0].HeadsSpecified = true;
|
||||
sidecar.BlockMedia[0].CylindersSpecified = true;
|
||||
sidecar.BlockMedia[0].HeadsSpecified = true;
|
||||
sidecar.BlockMedia[0].SectorsPerTrackSpecified = true;
|
||||
sidecar.BlockMedia[0].Cylinders = image.Info.Cylinders;
|
||||
sidecar.BlockMedia[0].Heads = image.Info.Heads;
|
||||
sidecar.BlockMedia[0].SectorsPerTrack = image.Info.SectorsPerTrack;
|
||||
sidecar.BlockMedia[0].Cylinders = image.Info.Cylinders;
|
||||
sidecar.BlockMedia[0].Heads = image.Info.Heads;
|
||||
sidecar.BlockMedia[0].SectorsPerTrack = image.Info.SectorsPerTrack;
|
||||
}
|
||||
|
||||
if(image.Info.ReadableMediaTags.Contains(MediaTagType.ATA_IDENTIFY))
|
||||
{
|
||||
Identify.IdentifyDevice? ataId = Identify.Decode(image.ReadDiskTag(MediaTagType.ATA_IDENTIFY));
|
||||
if(ataId.HasValue)
|
||||
if(ataId.Value.CurrentCylinders > 0 && ataId.Value.CurrentHeads > 0 &&
|
||||
if(ataId.Value.CurrentCylinders > 0 && ataId.Value.CurrentHeads > 0 &&
|
||||
ataId.Value.CurrentSectorsPerTrack > 0)
|
||||
{
|
||||
sidecar.BlockMedia[0].CylindersSpecified = true;
|
||||
sidecar.BlockMedia[0].HeadsSpecified = true;
|
||||
sidecar.BlockMedia[0].CylindersSpecified = true;
|
||||
sidecar.BlockMedia[0].HeadsSpecified = true;
|
||||
sidecar.BlockMedia[0].SectorsPerTrackSpecified = true;
|
||||
sidecar.BlockMedia[0].Cylinders = ataId.Value.CurrentCylinders;
|
||||
sidecar.BlockMedia[0].Heads = ataId.Value.CurrentHeads;
|
||||
sidecar.BlockMedia[0].SectorsPerTrack = ataId.Value.CurrentSectorsPerTrack;
|
||||
sidecar.BlockMedia[0].Cylinders = ataId.Value.CurrentCylinders;
|
||||
sidecar.BlockMedia[0].Heads = ataId.Value.CurrentHeads;
|
||||
sidecar.BlockMedia[0].SectorsPerTrack = ataId.Value.CurrentSectorsPerTrack;
|
||||
}
|
||||
else if(ataId.Value.Cylinders > 0 && ataId.Value.Heads > 0 && ataId.Value.SectorsPerTrack > 0)
|
||||
{
|
||||
sidecar.BlockMedia[0].CylindersSpecified = true;
|
||||
sidecar.BlockMedia[0].HeadsSpecified = true;
|
||||
sidecar.BlockMedia[0].CylindersSpecified = true;
|
||||
sidecar.BlockMedia[0].HeadsSpecified = true;
|
||||
sidecar.BlockMedia[0].SectorsPerTrackSpecified = true;
|
||||
sidecar.BlockMedia[0].Cylinders = ataId.Value.Cylinders;
|
||||
sidecar.BlockMedia[0].Heads = ataId.Value.Heads;
|
||||
sidecar.BlockMedia[0].SectorsPerTrack = ataId.Value.SectorsPerTrack;
|
||||
sidecar.BlockMedia[0].Cylinders = ataId.Value.Cylinders;
|
||||
sidecar.BlockMedia[0].Heads = ataId.Value.Heads;
|
||||
sidecar.BlockMedia[0].SectorsPerTrack = ataId.Value.SectorsPerTrack;
|
||||
}
|
||||
}
|
||||
|
||||
if(image.DumpHardware != null) sidecar.BlockMedia[0].DumpHardwareArray = image.DumpHardware.ToArray();
|
||||
|
||||
// TODO: This is more of a hack, redo it planned for >4.0
|
||||
string trkFormat = null;
|
||||
|
||||
@@ -533,8 +536,8 @@ namespace DiscImageChef.Core
|
||||
|
||||
if(File.Exists(scpFilePath))
|
||||
{
|
||||
SuperCardPro scpImage = new SuperCardPro();
|
||||
ZZZNoFilter scpFilter = new ZZZNoFilter();
|
||||
SuperCardPro scpImage = new SuperCardPro();
|
||||
ZZZNoFilter scpFilter = new ZZZNoFilter();
|
||||
scpFilter.Open(scpFilePath);
|
||||
|
||||
if(image.Info.Heads <= 2 && scpImage.Identify(scpFilter))
|
||||
@@ -542,46 +545,46 @@ namespace DiscImageChef.Core
|
||||
try { scpImage.Open(scpFilter); }
|
||||
catch(NotImplementedException) { }
|
||||
|
||||
if(image.Info.Heads == 2 && scpImage.Header.heads == 0 || image.Info.Heads == 1 &&
|
||||
(scpImage.Header.heads == 1 || scpImage.Header.heads == 2))
|
||||
if(image.Info.Heads == 2 && scpImage.Header.heads == 0 || image.Info.Heads == 1 &&
|
||||
(scpImage.Header.heads == 1 || scpImage.Header.heads == 2))
|
||||
if(scpImage.Header.end + 1 >= image.Info.Cylinders)
|
||||
{
|
||||
List<BlockTrackType> scpBlockTrackTypes = new List<BlockTrackType>();
|
||||
long currentSector = 0;
|
||||
Stream scpStream = scpFilter.GetDataForkStream();
|
||||
long currentSector = 0;
|
||||
Stream scpStream = scpFilter.GetDataForkStream();
|
||||
|
||||
for(byte t = scpImage.Header.start; t <= scpImage.Header.end; t++)
|
||||
{
|
||||
BlockTrackType scpBlockTrackType = new BlockTrackType
|
||||
{
|
||||
Cylinder = t / image.Info.Heads,
|
||||
Head = t % image.Info.Heads,
|
||||
Image = new ImageType
|
||||
Head = t % image.Info.Heads,
|
||||
Image = new ImageType
|
||||
{
|
||||
format = scpImage.Format,
|
||||
Value = Path.GetFileName(scpFilePath),
|
||||
Value = Path.GetFileName(scpFilePath),
|
||||
offset = scpImage.Header.offsets[t]
|
||||
}
|
||||
};
|
||||
|
||||
if(scpBlockTrackType.Cylinder < image.Info.Cylinders)
|
||||
{
|
||||
scpBlockTrackType.StartSector = currentSector;
|
||||
currentSector += image.Info.SectorsPerTrack;
|
||||
scpBlockTrackType.EndSector = currentSector - 1;
|
||||
scpBlockTrackType.Sectors = image.Info.SectorsPerTrack;
|
||||
scpBlockTrackType.BytesPerSector = (int)image.Info.SectorSize;
|
||||
scpBlockTrackType.Format = trkFormat;
|
||||
scpBlockTrackType.StartSector = currentSector;
|
||||
currentSector += image.Info.SectorsPerTrack;
|
||||
scpBlockTrackType.EndSector = currentSector - 1;
|
||||
scpBlockTrackType.Sectors = image.Info.SectorsPerTrack;
|
||||
scpBlockTrackType.BytesPerSector = (int)image.Info.SectorSize;
|
||||
scpBlockTrackType.Format = trkFormat;
|
||||
}
|
||||
|
||||
if(scpImage.ScpTracks.TryGetValue(t, out SuperCardPro.TrackHeader scpTrack))
|
||||
{
|
||||
byte[] trackContents =
|
||||
new byte[scpTrack.Entries.Last().dataOffset +
|
||||
new byte[scpTrack.Entries.Last().dataOffset +
|
||||
scpTrack.Entries.Last().trackLength - scpImage.Header.offsets[t] + 1];
|
||||
scpStream.Position = scpImage.Header.offsets[t];
|
||||
scpStream.Read(trackContents, 0, trackContents.Length);
|
||||
scpBlockTrackType.Size = trackContents.Length;
|
||||
scpBlockTrackType.Size = trackContents.Length;
|
||||
scpBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray();
|
||||
}
|
||||
|
||||
@@ -593,18 +596,18 @@ namespace DiscImageChef.Core
|
||||
}
|
||||
else
|
||||
DicConsole
|
||||
.ErrorWriteLine("SuperCardPro image do not contain same number of tracks ({0}) than disk image ({1}), ignoring...",
|
||||
scpImage.Header.end + 1, image.Info.Cylinders);
|
||||
.ErrorWriteLine("SuperCardPro image do not contain same number of tracks ({0}) than disk image ({1}), ignoring...",
|
||||
scpImage.Header.end + 1, image.Info.Cylinders);
|
||||
else
|
||||
DicConsole
|
||||
.ErrorWriteLine("SuperCardPro image do not contain same number of heads ({0}) than disk image ({1}), ignoring...",
|
||||
2, image.Info.Heads);
|
||||
.ErrorWriteLine("SuperCardPro image do not contain same number of heads ({0}) than disk image ({1}), ignoring...",
|
||||
2, image.Info.Heads);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region KryoFlux
|
||||
string kfFile = null;
|
||||
string kfFile = null;
|
||||
string basename = Path.Combine(Path.GetDirectoryName(imagePath),
|
||||
Path.GetFileNameWithoutExtension(imagePath));
|
||||
bool kfDir = false;
|
||||
@@ -615,15 +618,17 @@ namespace DiscImageChef.Core
|
||||
if(possibleKfStarts.Length > 0)
|
||||
{
|
||||
kfFile = possibleKfStarts[0];
|
||||
kfDir = true;
|
||||
kfDir = true;
|
||||
}
|
||||
}
|
||||
else if(File.Exists(basename + "00.0.raw")) kfFile = basename + "00.0.raw";
|
||||
else if(File.Exists(basename + "00.1.raw")) kfFile = basename + "00.1.raw";
|
||||
else if(File.Exists(basename + "00.0.raw"))
|
||||
kfFile = basename + "00.0.raw";
|
||||
else if(File.Exists(basename + "00.1.raw"))
|
||||
kfFile = basename + "00.1.raw";
|
||||
|
||||
if(kfFile != null)
|
||||
{
|
||||
KryoFlux kfImage = new KryoFlux();
|
||||
KryoFlux kfImage = new KryoFlux();
|
||||
ZZZNoFilter kfFilter = new ZZZNoFilter();
|
||||
kfFilter.Open(kfFile);
|
||||
if(image.Info.Heads <= 2 && kfImage.Identify(kfFilter))
|
||||
@@ -631,7 +636,7 @@ namespace DiscImageChef.Core
|
||||
try { kfImage.Open(kfFilter); }
|
||||
catch(NotImplementedException) { }
|
||||
|
||||
if(kfImage.Info.Heads == image.Info.Heads)
|
||||
if(kfImage.Info.Heads == image.Info.Heads)
|
||||
if(kfImage.Info.Cylinders >= image.Info.Cylinders)
|
||||
{
|
||||
List<BlockTrackType> kfBlockTrackTypes = new List<BlockTrackType>();
|
||||
@@ -643,34 +648,34 @@ namespace DiscImageChef.Core
|
||||
BlockTrackType kfBlockTrackType = new BlockTrackType
|
||||
{
|
||||
Cylinder = kvp.Key / image.Info.Heads,
|
||||
Head = kvp.Key % image.Info.Heads,
|
||||
Image = new ImageType
|
||||
Head = kvp.Key % image.Info.Heads,
|
||||
Image = new ImageType
|
||||
{
|
||||
format = kfImage.Format,
|
||||
Value = kfDir
|
||||
? Path
|
||||
Value = kfDir
|
||||
? Path
|
||||
.Combine(Path.GetFileName(Path.GetDirectoryName(kvp.Value.GetBasePath())),
|
||||
kvp.Value.GetFilename())
|
||||
: kvp.Value.GetFilename(),
|
||||
: kvp.Value.GetFilename(),
|
||||
offset = 0
|
||||
}
|
||||
};
|
||||
|
||||
if(kfBlockTrackType.Cylinder < image.Info.Cylinders)
|
||||
{
|
||||
kfBlockTrackType.StartSector = currentSector;
|
||||
currentSector += image.Info.SectorsPerTrack;
|
||||
kfBlockTrackType.EndSector = currentSector - 1;
|
||||
kfBlockTrackType.Sectors = image.Info.SectorsPerTrack;
|
||||
kfBlockTrackType.BytesPerSector = (int)image.Info.SectorSize;
|
||||
kfBlockTrackType.Format = trkFormat;
|
||||
kfBlockTrackType.StartSector = currentSector;
|
||||
currentSector += image.Info.SectorsPerTrack;
|
||||
kfBlockTrackType.EndSector = currentSector - 1;
|
||||
kfBlockTrackType.Sectors = image.Info.SectorsPerTrack;
|
||||
kfBlockTrackType.BytesPerSector = (int)image.Info.SectorSize;
|
||||
kfBlockTrackType.Format = trkFormat;
|
||||
}
|
||||
|
||||
Stream kfStream = kvp.Value.GetDataForkStream();
|
||||
Stream kfStream = kvp.Value.GetDataForkStream();
|
||||
byte[] trackContents = new byte[kfStream.Length];
|
||||
kfStream.Position = 0;
|
||||
kfStream.Position = 0;
|
||||
kfStream.Read(trackContents, 0, trackContents.Length);
|
||||
kfBlockTrackType.Size = trackContents.Length;
|
||||
kfBlockTrackType.Size = trackContents.Length;
|
||||
kfBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray();
|
||||
|
||||
kfBlockTrackTypes.Add(kfBlockTrackType);
|
||||
@@ -681,12 +686,12 @@ namespace DiscImageChef.Core
|
||||
}
|
||||
else
|
||||
DicConsole
|
||||
.ErrorWriteLine("KryoFlux image do not contain same number of tracks ({0}) than disk image ({1}), ignoring...",
|
||||
kfImage.Info.Cylinders, image.Info.Cylinders);
|
||||
.ErrorWriteLine("KryoFlux image do not contain same number of tracks ({0}) than disk image ({1}), ignoring...",
|
||||
kfImage.Info.Cylinders, image.Info.Cylinders);
|
||||
else
|
||||
DicConsole
|
||||
.ErrorWriteLine("KryoFluximage do not contain same number of heads ({0}) than disk image ({1}), ignoring...",
|
||||
kfImage.Info.Heads, image.Info.Heads);
|
||||
.ErrorWriteLine("KryoFluximage do not contain same number of heads ({0}) than disk image ({1}), ignoring...",
|
||||
kfImage.Info.Heads, image.Info.Heads);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
@@ -697,7 +702,7 @@ namespace DiscImageChef.Core
|
||||
|
||||
if(!File.Exists(dfiFilePath)) return;
|
||||
|
||||
DiscFerret dfiImage = new DiscFerret();
|
||||
DiscFerret dfiImage = new DiscFerret();
|
||||
ZZZNoFilter dfiFilter = new ZZZNoFilter();
|
||||
dfiFilter.Open(dfiFilePath);
|
||||
|
||||
@@ -706,40 +711,40 @@ namespace DiscImageChef.Core
|
||||
try { dfiImage.Open(dfiFilter); }
|
||||
catch(NotImplementedException) { }
|
||||
|
||||
if(image.Info.Heads == dfiImage.Info.Heads)
|
||||
if(image.Info.Heads == dfiImage.Info.Heads)
|
||||
if(dfiImage.Info.Cylinders >= image.Info.Cylinders)
|
||||
{
|
||||
List<BlockTrackType> dfiBlockTrackTypes = new List<BlockTrackType>();
|
||||
long currentSector = 0;
|
||||
Stream dfiStream = dfiFilter.GetDataForkStream();
|
||||
long currentSector = 0;
|
||||
Stream dfiStream = dfiFilter.GetDataForkStream();
|
||||
|
||||
foreach(int t in dfiImage.TrackOffsets.Keys)
|
||||
{
|
||||
BlockTrackType dfiBlockTrackType = new BlockTrackType
|
||||
{
|
||||
Cylinder = t / image.Info.Heads,
|
||||
Head = t % image.Info.Heads,
|
||||
Image = new ImageType {format = dfiImage.Format, Value = Path.GetFileName(dfiFilePath)}
|
||||
Head = t % image.Info.Heads,
|
||||
Image = new ImageType {format = dfiImage.Format, Value = Path.GetFileName(dfiFilePath)}
|
||||
};
|
||||
|
||||
if(dfiBlockTrackType.Cylinder < image.Info.Cylinders)
|
||||
{
|
||||
dfiBlockTrackType.StartSector = currentSector;
|
||||
currentSector += image.Info.SectorsPerTrack;
|
||||
dfiBlockTrackType.EndSector = currentSector - 1;
|
||||
dfiBlockTrackType.Sectors = image.Info.SectorsPerTrack;
|
||||
dfiBlockTrackType.BytesPerSector = (int)image.Info.SectorSize;
|
||||
dfiBlockTrackType.Format = trkFormat;
|
||||
dfiBlockTrackType.StartSector = currentSector;
|
||||
currentSector += image.Info.SectorsPerTrack;
|
||||
dfiBlockTrackType.EndSector = currentSector - 1;
|
||||
dfiBlockTrackType.Sectors = image.Info.SectorsPerTrack;
|
||||
dfiBlockTrackType.BytesPerSector = (int)image.Info.SectorSize;
|
||||
dfiBlockTrackType.Format = trkFormat;
|
||||
}
|
||||
|
||||
if(dfiImage.TrackOffsets.TryGetValue(t, out long offset) &&
|
||||
dfiImage.TrackLengths.TryGetValue(t, out long length))
|
||||
{
|
||||
dfiBlockTrackType.Image.offset = offset;
|
||||
byte[] trackContents = new byte[length];
|
||||
dfiStream.Position = offset;
|
||||
byte[] trackContents = new byte[length];
|
||||
dfiStream.Position = offset;
|
||||
dfiStream.Read(trackContents, 0, trackContents.Length);
|
||||
dfiBlockTrackType.Size = trackContents.Length;
|
||||
dfiBlockTrackType.Size = trackContents.Length;
|
||||
dfiBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray();
|
||||
}
|
||||
|
||||
@@ -751,12 +756,12 @@ namespace DiscImageChef.Core
|
||||
}
|
||||
else
|
||||
DicConsole
|
||||
.ErrorWriteLine("DiscFerret image do not contain same number of tracks ({0}) than disk image ({1}), ignoring...",
|
||||
dfiImage.Info.Cylinders, image.Info.Cylinders);
|
||||
.ErrorWriteLine("DiscFerret image do not contain same number of tracks ({0}) than disk image ({1}), ignoring...",
|
||||
dfiImage.Info.Cylinders, image.Info.Cylinders);
|
||||
else
|
||||
DicConsole
|
||||
.ErrorWriteLine("DiscFerret image do not contain same number of heads ({0}) than disk image ({1}), ignoring...",
|
||||
dfiImage.Info.Heads, image.Info.Heads);
|
||||
.ErrorWriteLine("DiscFerret image do not contain same number of heads ({0}) than disk image ({1}), ignoring...",
|
||||
dfiImage.Info.Heads, image.Info.Heads);
|
||||
#endregion
|
||||
|
||||
// TODO: Implement support for getting CHS from SCSI mode pages
|
||||
|
||||
@@ -58,7 +58,8 @@ namespace DiscImageChef.Core
|
||||
/// <param name="plugins">Image plugins</param>
|
||||
/// <param name="imgChecksums">List of image checksums</param>
|
||||
/// <param name="sidecar">Metadata sidecar</param>
|
||||
static void OpticalDisc(IMediaImage image, Guid filterId, string imagePath, FileInfo fi, PluginBase plugins,
|
||||
static void OpticalDisc(IMediaImage image, Guid filterId, string imagePath,
|
||||
FileInfo fi, PluginBase plugins,
|
||||
List<ChecksumType> imgChecksums, ref CICMMetadataType sidecar, Encoding encoding)
|
||||
{
|
||||
sidecar.OpticalDisc = new[]
|
||||
@@ -66,14 +67,14 @@ namespace DiscImageChef.Core
|
||||
new OpticalDiscType
|
||||
{
|
||||
Checksums = imgChecksums.ToArray(),
|
||||
Image = new ImageType
|
||||
Image = new ImageType
|
||||
{
|
||||
format = image.Format,
|
||||
offset = 0,
|
||||
format = image.Format,
|
||||
offset = 0,
|
||||
offsetSpecified = true,
|
||||
Value = Path.GetFileName(imagePath)
|
||||
Value = Path.GetFileName(imagePath)
|
||||
},
|
||||
Size = fi.Length,
|
||||
Size = fi.Length,
|
||||
Sequence = new SequenceType {MediaTitle = image.Info.MediaTitle}
|
||||
}
|
||||
};
|
||||
@@ -81,12 +82,12 @@ namespace DiscImageChef.Core
|
||||
if(image.Info.MediaSequence != 0 && image.Info.LastMediaSequence != 0)
|
||||
{
|
||||
sidecar.OpticalDisc[0].Sequence.MediaSequence = image.Info.MediaSequence;
|
||||
sidecar.OpticalDisc[0].Sequence.TotalMedia = image.Info.LastMediaSequence;
|
||||
sidecar.OpticalDisc[0].Sequence.TotalMedia = image.Info.LastMediaSequence;
|
||||
}
|
||||
else
|
||||
{
|
||||
sidecar.OpticalDisc[0].Sequence.MediaSequence = 1;
|
||||
sidecar.OpticalDisc[0].Sequence.TotalMedia = 1;
|
||||
sidecar.OpticalDisc[0].Sequence.TotalMedia = 1;
|
||||
}
|
||||
|
||||
MediaType dskType = image.Info.MediaType;
|
||||
@@ -98,32 +99,34 @@ namespace DiscImageChef.Core
|
||||
sidecar.OpticalDisc[0].ATIP = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.CD_ATIP)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.CD_ATIP).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.CD_ATIP).Length
|
||||
};
|
||||
ATIP.CDATIP? atip = ATIP.Decode(image.ReadDiskTag(MediaTagType.CD_ATIP));
|
||||
if(atip.HasValue)
|
||||
if(atip.Value.DDCD) dskType = atip.Value.DiscType ? MediaType.DDCDRW : MediaType.DDCDR;
|
||||
else dskType = atip.Value.DiscType ? MediaType.CDRW : MediaType.CDR;
|
||||
if(atip.Value.DDCD)
|
||||
dskType = atip.Value.DiscType ? MediaType.DDCDRW : MediaType.DDCDR;
|
||||
else
|
||||
dskType = atip.Value.DiscType ? MediaType.CDRW : MediaType.CDR;
|
||||
break;
|
||||
case MediaTagType.DVD_BCA:
|
||||
sidecar.OpticalDisc[0].BCA = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.DVD_BCA)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_BCA).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_BCA).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.BD_BCA:
|
||||
sidecar.OpticalDisc[0].BCA = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.BD_BCA)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.BD_BCA).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.BD_BCA).Length
|
||||
};
|
||||
break;
|
||||
case MediaTagType.DVD_CMI:
|
||||
sidecar.OpticalDisc[0].CMI = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.DVD_CMI)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_CMI).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_CMI).Length
|
||||
};
|
||||
CSS_CPRM.LeadInCopyright? cmi =
|
||||
CSS_CPRM.DecodeLeadInCopyright(image.ReadDiskTag(MediaTagType.DVD_CMI));
|
||||
@@ -146,24 +149,25 @@ namespace DiscImageChef.Core
|
||||
sidecar.OpticalDisc[0].DMI = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.DVD_DMI)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_DMI).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_DMI).Length
|
||||
};
|
||||
if(DMI.IsXbox(image.ReadDiskTag(MediaTagType.DVD_DMI)))
|
||||
{
|
||||
dskType = MediaType.XGD;
|
||||
dskType = MediaType.XGD;
|
||||
sidecar.OpticalDisc[0].Dimensions = new DimensionsType {Diameter = 120};
|
||||
}
|
||||
else if(DMI.IsXbox360(image.ReadDiskTag(MediaTagType.DVD_DMI)))
|
||||
{
|
||||
dskType = MediaType.XGD2;
|
||||
dskType = MediaType.XGD2;
|
||||
sidecar.OpticalDisc[0].Dimensions = new DimensionsType {Diameter = 120};
|
||||
}
|
||||
|
||||
break;
|
||||
case MediaTagType.DVD_PFI:
|
||||
sidecar.OpticalDisc[0].PFI = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.DVD_PFI)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_PFI).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.DVD_PFI).Length
|
||||
};
|
||||
PFI.PhysicalFormatInformation? pfi = PFI.Decode(image.ReadDiskTag(MediaTagType.DVD_PFI));
|
||||
if(pfi.HasValue)
|
||||
@@ -215,13 +219,14 @@ namespace DiscImageChef.Core
|
||||
break;
|
||||
}
|
||||
|
||||
if(dskType == MediaType.DVDR && pfi.Value.PartVersion == 6) dskType = MediaType.DVDRDL;
|
||||
if(dskType == MediaType.DVDR && pfi.Value.PartVersion == 6) dskType = MediaType.DVDRDL;
|
||||
if(dskType == MediaType.DVDRW && pfi.Value.PartVersion == 3)
|
||||
dskType = MediaType.DVDRWDL;
|
||||
if(dskType == MediaType.GOD && pfi.Value.DiscSize == DVDSize.OneTwenty)
|
||||
dskType = MediaType.WOD;
|
||||
|
||||
sidecar.OpticalDisc[0].Dimensions = new DimensionsType();
|
||||
sidecar.OpticalDisc[0].Dimensions =
|
||||
new DimensionsType();
|
||||
if(dskType == MediaType.UMD) sidecar.OpticalDisc[0].Dimensions.Diameter = 60;
|
||||
else
|
||||
switch(pfi.Value.DiscSize)
|
||||
@@ -240,25 +245,25 @@ namespace DiscImageChef.Core
|
||||
sidecar.OpticalDisc[0].PMA = new DumpType
|
||||
{
|
||||
Checksums = Checksum.GetChecksums(image.ReadDiskTag(MediaTagType.CD_PMA)).ToArray(),
|
||||
Size = image.ReadDiskTag(MediaTagType.CD_PMA).Length
|
||||
Size = image.ReadDiskTag(MediaTagType.CD_PMA).Length
|
||||
};
|
||||
break;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
List<Session> sessions = image.Sessions;
|
||||
List<Session> sessions = image.Sessions;
|
||||
sidecar.OpticalDisc[0].Sessions = sessions?.Count ?? 1;
|
||||
}
|
||||
catch { sidecar.OpticalDisc[0].Sessions = 1; }
|
||||
|
||||
List<Track> tracks = image.Tracks;
|
||||
List<Track> tracks = image.Tracks;
|
||||
List<TrackType> trksLst = null;
|
||||
if(tracks != null)
|
||||
{
|
||||
sidecar.OpticalDisc[0].Tracks = new int[1];
|
||||
sidecar.OpticalDisc[0].Tracks = new int[1];
|
||||
sidecar.OpticalDisc[0].Tracks[0] = tracks.Count;
|
||||
trksLst = new List<TrackType>();
|
||||
trksLst = new List<TrackType>();
|
||||
}
|
||||
|
||||
InitProgress();
|
||||
@@ -305,24 +310,25 @@ namespace DiscImageChef.Core
|
||||
break;
|
||||
}
|
||||
|
||||
xmlTrk.Sequence =
|
||||
xmlTrk.Sequence =
|
||||
new TrackSequenceType {Session = trk.TrackSession, TrackNumber = (int)trk.TrackSequence};
|
||||
xmlTrk.StartSector = (long)trk.TrackStartSector;
|
||||
xmlTrk.EndSector = (long)trk.TrackEndSector;
|
||||
xmlTrk.StartSector = (long)trk.TrackStartSector;
|
||||
xmlTrk.EndSector = (long)trk.TrackEndSector;
|
||||
|
||||
if(trk.Indexes != null && trk.Indexes.ContainsKey(0))
|
||||
if(trk.Indexes.TryGetValue(0, out ulong idx0)) xmlTrk.StartSector = (long)idx0;
|
||||
if(trk.Indexes.TryGetValue(0, out ulong idx0))
|
||||
xmlTrk.StartSector = (long)idx0;
|
||||
|
||||
switch(sidecar.OpticalDisc[0].DiscType)
|
||||
{
|
||||
case "CD":
|
||||
case "GD":
|
||||
xmlTrk.StartMSF = LbaToMsf(xmlTrk.StartSector);
|
||||
xmlTrk.EndMSF = LbaToMsf(xmlTrk.EndSector);
|
||||
xmlTrk.EndMSF = LbaToMsf(xmlTrk.EndSector);
|
||||
break;
|
||||
case "DDCD":
|
||||
xmlTrk.StartMSF = DdcdLbaToMsf(xmlTrk.StartSector);
|
||||
xmlTrk.EndMSF = DdcdLbaToMsf(xmlTrk.EndSector);
|
||||
xmlTrk.EndMSF = DdcdLbaToMsf(xmlTrk.EndSector);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -330,16 +336,16 @@ namespace DiscImageChef.Core
|
||||
|
||||
if(trk.TrackFileOffset > 0)
|
||||
{
|
||||
xmlTrk.Image.offset = (long)trk.TrackFileOffset;
|
||||
xmlTrk.Image.offset = (long)trk.TrackFileOffset;
|
||||
xmlTrk.Image.offsetSpecified = true;
|
||||
}
|
||||
|
||||
xmlTrk.Size = (xmlTrk.EndSector - xmlTrk.StartSector + 1) * trk.TrackRawBytesPerSector;
|
||||
xmlTrk.Size = (xmlTrk.EndSector - xmlTrk.StartSector + 1) * trk.TrackRawBytesPerSector;
|
||||
xmlTrk.BytesPerSector = trk.TrackBytesPerSector;
|
||||
|
||||
uint sectorsToRead = 512;
|
||||
ulong sectors = (ulong)(xmlTrk.EndSector - xmlTrk.StartSector + 1);
|
||||
ulong doneSectors = 0;
|
||||
uint sectorsToRead = 512;
|
||||
ulong sectors = (ulong)(xmlTrk.EndSector - xmlTrk.StartSector + 1);
|
||||
ulong doneSectors = 0;
|
||||
|
||||
// If there is only one track, and it's the same as the image file (e.g. ".iso" files), don't re-checksum.
|
||||
if(image.Id == new Guid("12345678-AAAA-BBBB-CCCC-123456789000") &&
|
||||
@@ -376,7 +382,7 @@ namespace DiscImageChef.Core
|
||||
(uint)xmlTrk.Sequence.TrackNumber);
|
||||
UpdateProgress2("Hashings sector {0} of {1}", (long)doneSectors,
|
||||
(long)(trk.TrackEndSector - trk.TrackStartSector + 1));
|
||||
doneSectors += sectors - doneSectors;
|
||||
doneSectors += sectors - doneSectors;
|
||||
}
|
||||
|
||||
trkChkWorker.Update(sector);
|
||||
@@ -416,13 +422,13 @@ namespace DiscImageChef.Core
|
||||
|
||||
if(trk.TrackFileOffset > 0)
|
||||
{
|
||||
xmlTrk.SubChannel.Image.offset = (long)trk.TrackSubchannelOffset;
|
||||
xmlTrk.SubChannel.Image.offset = (long)trk.TrackSubchannelOffset;
|
||||
xmlTrk.SubChannel.Image.offsetSpecified = true;
|
||||
}
|
||||
|
||||
Checksum subChkWorker = new Checksum();
|
||||
|
||||
sectors = (ulong)(xmlTrk.EndSector - xmlTrk.StartSector + 1);
|
||||
sectors = (ulong)(xmlTrk.EndSector - xmlTrk.StartSector + 1);
|
||||
doneSectors = 0;
|
||||
|
||||
InitProgress2();
|
||||
@@ -445,7 +451,7 @@ namespace DiscImageChef.Core
|
||||
SectorTagType.CdSectorSubchannel);
|
||||
UpdateProgress2("Hashings subchannel sector {0} of {1}", (long)doneSectors,
|
||||
(long)(trk.TrackEndSector - trk.TrackStartSector + 1));
|
||||
doneSectors += sectors - doneSectors;
|
||||
doneSectors += sectors - doneSectors;
|
||||
}
|
||||
|
||||
subChkWorker.Update(sector);
|
||||
@@ -462,7 +468,7 @@ namespace DiscImageChef.Core
|
||||
//skipChecksum:
|
||||
|
||||
UpdateStatus("Checking filesystems on track {0} from sector {1} to {2}", xmlTrk.Sequence.TrackNumber,
|
||||
xmlTrk.StartSector, xmlTrk.EndSector);
|
||||
xmlTrk.StartSector, xmlTrk.EndSector);
|
||||
|
||||
List<Partition> partitions = Partitions.GetAll(image);
|
||||
Partitions.AddSchemesToStats(partitions);
|
||||
@@ -476,11 +482,11 @@ namespace DiscImageChef.Core
|
||||
xmlTrk.FileSystemInformation[i] = new PartitionType
|
||||
{
|
||||
Description = partitions[i].Description,
|
||||
EndSector = (int)partitions[i].End,
|
||||
Name = partitions[i].Name,
|
||||
Sequence = (int)partitions[i].Sequence,
|
||||
EndSector = (int)partitions[i].End,
|
||||
Name = partitions[i].Name,
|
||||
Sequence = (int)partitions[i].Sequence,
|
||||
StartSector = (int)partitions[i].Start,
|
||||
Type = partitions[i].Type
|
||||
Type = partitions[i].Type
|
||||
};
|
||||
List<FileSystemType> lstFs = new List<FileSystemType>();
|
||||
|
||||
@@ -509,9 +515,9 @@ namespace DiscImageChef.Core
|
||||
break;
|
||||
}
|
||||
}
|
||||
#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
|
||||
#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
|
||||
{
|
||||
//DicConsole.DebugWriteLine("Create-sidecar command", "Plugin {0} crashed", _plugin.Name);
|
||||
}
|
||||
@@ -523,17 +529,17 @@ namespace DiscImageChef.Core
|
||||
{
|
||||
xmlTrk.FileSystemInformation[0] = new PartitionType
|
||||
{
|
||||
EndSector = (int)xmlTrk.EndSector,
|
||||
EndSector = (int)xmlTrk.EndSector,
|
||||
StartSector = (int)xmlTrk.StartSector
|
||||
};
|
||||
List<FileSystemType> lstFs = new List<FileSystemType>();
|
||||
|
||||
Partition xmlPart = new Partition
|
||||
{
|
||||
Start = (ulong)xmlTrk.StartSector,
|
||||
Length = (ulong)(xmlTrk.EndSector - xmlTrk.StartSector + 1),
|
||||
Type = xmlTrk.TrackType1.ToString(),
|
||||
Size = (ulong)xmlTrk.Size,
|
||||
Start = (ulong)xmlTrk.StartSector,
|
||||
Length = (ulong)(xmlTrk.EndSector - xmlTrk.StartSector + 1),
|
||||
Type = xmlTrk.TrackType1.ToString(),
|
||||
Size = (ulong)xmlTrk.Size,
|
||||
Sequence = (ulong)xmlTrk.Sequence.TrackNumber
|
||||
};
|
||||
foreach(IFilesystem plugin in plugins.PluginsList.Values)
|
||||
@@ -561,9 +567,9 @@ namespace DiscImageChef.Core
|
||||
break;
|
||||
}
|
||||
}
|
||||
#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
|
||||
#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
|
||||
{
|
||||
//DicConsole.DebugWriteLine("Create-sidecar command", "Plugin {0} crashed", _plugin.Name);
|
||||
}
|
||||
@@ -581,35 +587,36 @@ namespace DiscImageChef.Core
|
||||
// All XGD3 all have the same number of blocks
|
||||
if(dskType == MediaType.XGD2 && sidecar.OpticalDisc[0].Track.Length == 1)
|
||||
{
|
||||
ulong blocks = (ulong)(sidecar.OpticalDisc[0].Track[0].EndSector -
|
||||
ulong blocks = (ulong)(sidecar.OpticalDisc[0].Track[0].EndSector -
|
||||
sidecar.OpticalDisc[0].Track[0].StartSector + 1);
|
||||
if(blocks == 25063 || // Locked (or non compatible drive)
|
||||
if(blocks == 25063 || // Locked (or non compatible drive)
|
||||
blocks == 4229664 || // Xtreme unlock
|
||||
blocks == 4246304) // Wxripper unlock
|
||||
blocks == 4246304) // Wxripper unlock
|
||||
dskType = MediaType.XGD3;
|
||||
}
|
||||
|
||||
Metadata.MediaType.MediaTypeToString(dskType, out string dscType, out string dscSubType);
|
||||
sidecar.OpticalDisc[0].DiscType = dscType;
|
||||
sidecar.OpticalDisc[0].DiscType = dscType;
|
||||
sidecar.OpticalDisc[0].DiscSubType = dscSubType;
|
||||
Statistics.AddMedia(dskType, false);
|
||||
|
||||
if(!string.IsNullOrEmpty(image.Info.DriveManufacturer) ||
|
||||
!string.IsNullOrEmpty(image.Info.DriveModel) ||
|
||||
!string.IsNullOrEmpty(image.Info.DriveFirmwareRevision) ||
|
||||
!string.IsNullOrEmpty(image.Info.DriveSerialNumber))
|
||||
if(image.DumpHardware != null) sidecar.OpticalDisc[0].DumpHardwareArray = image.DumpHardware.ToArray();
|
||||
else if(!string.IsNullOrEmpty(image.Info.DriveManufacturer) ||
|
||||
!string.IsNullOrEmpty(image.Info.DriveModel) ||
|
||||
!string.IsNullOrEmpty(image.Info.DriveFirmwareRevision) ||
|
||||
!string.IsNullOrEmpty(image.Info.DriveSerialNumber))
|
||||
sidecar.OpticalDisc[0].DumpHardwareArray = new[]
|
||||
{
|
||||
new DumpHardwareType
|
||||
{
|
||||
Extents = new[] {new ExtentType {Start = 0, End = image.Info.Sectors}},
|
||||
Extents = new[] {new ExtentType {Start = 0, End = image.Info.Sectors}},
|
||||
Manufacturer = image.Info.DriveManufacturer,
|
||||
Model = image.Info.DriveModel,
|
||||
Firmware = image.Info.DriveFirmwareRevision,
|
||||
Serial = image.Info.DriveSerialNumber,
|
||||
Software = new SoftwareType
|
||||
Model = image.Info.DriveModel,
|
||||
Firmware = image.Info.DriveFirmwareRevision,
|
||||
Serial = image.Info.DriveSerialNumber,
|
||||
Software = new SoftwareType
|
||||
{
|
||||
Name = image.Info.Application,
|
||||
Name = image.Info.Application,
|
||||
Version = image.Info.ApplicationVersion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,10 +51,10 @@ namespace DiscImageChef.Core
|
||||
/// <returns>The metadata sidecar</returns>
|
||||
public static CICMMetadataType Create(IMediaImage image, string imagePath, Guid filterId, Encoding encoding)
|
||||
{
|
||||
CICMMetadataType sidecar = new CICMMetadataType();
|
||||
PluginBase plugins = new PluginBase();
|
||||
CICMMetadataType sidecar = image.CicmMetadata ?? new CICMMetadataType();
|
||||
PluginBase plugins = new PluginBase();
|
||||
|
||||
FileInfo fi = new FileInfo(imagePath);
|
||||
FileInfo fi = new FileInfo(imagePath);
|
||||
FileStream fs = new FileStream(imagePath, FileMode.Open, FileAccess.Read);
|
||||
|
||||
Checksum imgChkWorker = new Checksum();
|
||||
@@ -63,7 +63,7 @@ namespace DiscImageChef.Core
|
||||
//goto skipImageChecksum;
|
||||
|
||||
byte[] data;
|
||||
long position = 0;
|
||||
long position = 0;
|
||||
InitProgress();
|
||||
while(position < fi.Length - 1048576)
|
||||
{
|
||||
@@ -77,7 +77,7 @@ namespace DiscImageChef.Core
|
||||
position += 1048576;
|
||||
}
|
||||
|
||||
data = new byte[fi.Length - position];
|
||||
data = new byte[fi.Length - position];
|
||||
fs.Read(data, 0, (int)(fi.Length - position));
|
||||
|
||||
UpdateProgress("Hashing image file byte {0} of {1}", position, fi.Length);
|
||||
@@ -92,6 +92,11 @@ namespace DiscImageChef.Core
|
||||
|
||||
List<ChecksumType> imgChecksums = imgChkWorker.End();
|
||||
|
||||
sidecar.OpticalDisc = null;
|
||||
sidecar.BlockMedia = null;
|
||||
sidecar.AudioMedia = null;
|
||||
sidecar.LinearMedia = null;
|
||||
|
||||
switch(image.Info.XmlMediaType)
|
||||
{
|
||||
case XmlMediaType.OpticalDisc:
|
||||
|
||||
Reference in New Issue
Block a user