mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Checksum tape images.
This commit is contained in:
@@ -182,8 +182,101 @@ namespace DiscImageChef.Commands
|
|||||||
|
|
||||||
Checksum mediaChecksum = null;
|
Checksum mediaChecksum = null;
|
||||||
|
|
||||||
if(inputFormat is IOpticalMediaImage opticalInput)
|
switch(inputFormat)
|
||||||
try
|
{
|
||||||
|
case IOpticalMediaImage opticalInput when opticalInput.Tracks != null:
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Checksum trackChecksum = null;
|
||||||
|
|
||||||
|
if(wholeDisc) mediaChecksum = new Checksum(enabledChecksums);
|
||||||
|
|
||||||
|
ulong previousTrackEnd = 0;
|
||||||
|
|
||||||
|
List<Track> inputTracks = opticalInput.Tracks;
|
||||||
|
foreach(Track currentTrack in inputTracks)
|
||||||
|
{
|
||||||
|
if(currentTrack.TrackStartSector - previousTrackEnd != 0 && wholeDisc)
|
||||||
|
for(ulong i = previousTrackEnd + 1; i < currentTrack.TrackStartSector; i++)
|
||||||
|
{
|
||||||
|
DicConsole.Write("\rHashing track-less sector {0}", i);
|
||||||
|
|
||||||
|
byte[] hiddenSector = inputFormat.ReadSector(i);
|
||||||
|
|
||||||
|
mediaChecksum?.Update(hiddenSector);
|
||||||
|
}
|
||||||
|
|
||||||
|
DicConsole.DebugWriteLine("Checksum command",
|
||||||
|
"Track {0} starts at sector {1} and ends at sector {2}",
|
||||||
|
currentTrack.TrackSequence, currentTrack.TrackStartSector,
|
||||||
|
currentTrack.TrackEndSector);
|
||||||
|
|
||||||
|
if(separatedTracks) trackChecksum = new Checksum(enabledChecksums);
|
||||||
|
|
||||||
|
ulong sectors = currentTrack.TrackEndSector - currentTrack.TrackStartSector + 1;
|
||||||
|
ulong doneSectors = 0;
|
||||||
|
DicConsole.WriteLine("Track {0} has {1} sectors", currentTrack.TrackSequence, sectors);
|
||||||
|
|
||||||
|
while(doneSectors < sectors)
|
||||||
|
{
|
||||||
|
byte[] sector;
|
||||||
|
|
||||||
|
if(sectors - doneSectors >= SECTORS_TO_READ)
|
||||||
|
{
|
||||||
|
sector = opticalInput.ReadSectors(doneSectors, SECTORS_TO_READ,
|
||||||
|
currentTrack.TrackSequence);
|
||||||
|
DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
|
||||||
|
currentTrack.TrackSequence, doneSectors + SECTORS_TO_READ);
|
||||||
|
doneSectors += SECTORS_TO_READ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sector = opticalInput.ReadSectors(doneSectors, (uint)(sectors - doneSectors),
|
||||||
|
currentTrack.TrackSequence);
|
||||||
|
DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
|
||||||
|
currentTrack.TrackSequence, doneSectors + (sectors - doneSectors));
|
||||||
|
doneSectors += sectors - doneSectors;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(wholeDisc) mediaChecksum?.Update(sector);
|
||||||
|
|
||||||
|
if(separatedTracks) trackChecksum?.Update(sector);
|
||||||
|
}
|
||||||
|
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
|
||||||
|
if(separatedTracks)
|
||||||
|
if(trackChecksum != null)
|
||||||
|
foreach(ChecksumType chk in trackChecksum.End())
|
||||||
|
DicConsole.WriteLine("Track {0}'s {1}: {2}", currentTrack.TrackSequence,
|
||||||
|
chk.type, chk.Value);
|
||||||
|
|
||||||
|
previousTrackEnd = currentTrack.TrackEndSector;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(opticalInput.Info.Sectors - previousTrackEnd != 0 && wholeDisc)
|
||||||
|
for(ulong i = previousTrackEnd + 1; i < opticalInput.Info.Sectors; i++)
|
||||||
|
{
|
||||||
|
DicConsole.Write("\rHashing track-less sector {0}", i);
|
||||||
|
|
||||||
|
byte[] hiddenSector = inputFormat.ReadSector(i);
|
||||||
|
mediaChecksum?.Update(hiddenSector);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(wholeDisc)
|
||||||
|
if(mediaChecksum != null)
|
||||||
|
foreach(ChecksumType chk in mediaChecksum.End())
|
||||||
|
DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
if(MainClass.Debug) DicConsole.DebugWriteLine("Could not get tracks because {0}", ex.Message);
|
||||||
|
else DicConsole.WriteLine("Unable to get separate tracks, not checksumming them");
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ITapeImage tapeImage when tapeImage.IsTape && tapeImage.Files?.Count > 0:
|
||||||
{
|
{
|
||||||
Checksum trackChecksum = null;
|
Checksum trackChecksum = null;
|
||||||
|
|
||||||
@@ -191,11 +284,10 @@ namespace DiscImageChef.Commands
|
|||||||
|
|
||||||
ulong previousTrackEnd = 0;
|
ulong previousTrackEnd = 0;
|
||||||
|
|
||||||
List<Track> inputTracks = opticalInput.Tracks;
|
foreach(TapeFile currentFile in tapeImage.Files)
|
||||||
foreach(Track currentTrack in inputTracks)
|
|
||||||
{
|
{
|
||||||
if(currentTrack.TrackStartSector - previousTrackEnd != 0 && wholeDisc)
|
if(currentFile.FirstBlock - previousTrackEnd != 0 && wholeDisc)
|
||||||
for(ulong i = previousTrackEnd + 1; i < currentTrack.TrackStartSector; i++)
|
for(ulong i = previousTrackEnd + 1; i < currentFile.FirstBlock; i++)
|
||||||
{
|
{
|
||||||
DicConsole.Write("\rHashing track-less sector {0}", i);
|
DicConsole.Write("\rHashing track-less sector {0}", i);
|
||||||
|
|
||||||
@@ -206,14 +298,13 @@ namespace DiscImageChef.Commands
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("Checksum command",
|
DicConsole.DebugWriteLine("Checksum command",
|
||||||
"Track {0} starts at sector {1} and ends at sector {2}",
|
"Track {0} starts at sector {1} and ends at sector {2}",
|
||||||
currentTrack.TrackSequence, currentTrack.TrackStartSector,
|
currentFile.File, currentFile.FirstBlock, currentFile.LastBlock);
|
||||||
currentTrack.TrackEndSector);
|
|
||||||
|
|
||||||
if(separatedTracks) trackChecksum = new Checksum(enabledChecksums);
|
if(separatedTracks) trackChecksum = new Checksum(enabledChecksums);
|
||||||
|
|
||||||
ulong sectors = currentTrack.TrackEndSector - currentTrack.TrackStartSector + 1;
|
ulong sectors = currentFile.LastBlock - currentFile.FirstBlock + 1;
|
||||||
ulong doneSectors = 0;
|
ulong doneSectors = 0;
|
||||||
DicConsole.WriteLine("Track {0} has {1} sectors", currentTrack.TrackSequence, sectors);
|
DicConsole.WriteLine("File {0} has {1} sectors", currentFile.File, sectors);
|
||||||
|
|
||||||
while(doneSectors < sectors)
|
while(doneSectors < sectors)
|
||||||
{
|
{
|
||||||
@@ -221,18 +312,17 @@ namespace DiscImageChef.Commands
|
|||||||
|
|
||||||
if(sectors - doneSectors >= SECTORS_TO_READ)
|
if(sectors - doneSectors >= SECTORS_TO_READ)
|
||||||
{
|
{
|
||||||
sector = opticalInput.ReadSectors(doneSectors, SECTORS_TO_READ,
|
sector = tapeImage.ReadSectors(doneSectors + currentFile.FirstBlock, SECTORS_TO_READ);
|
||||||
currentTrack.TrackSequence);
|
DicConsole.Write("\rHashings sectors {0} to {2} of file {1}", doneSectors,
|
||||||
DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
|
currentFile.File, doneSectors + SECTORS_TO_READ);
|
||||||
currentTrack.TrackSequence, doneSectors + SECTORS_TO_READ);
|
|
||||||
doneSectors += SECTORS_TO_READ;
|
doneSectors += SECTORS_TO_READ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sector = opticalInput.ReadSectors(doneSectors, (uint)(sectors - doneSectors),
|
sector = tapeImage.ReadSectors(doneSectors + currentFile.FirstBlock,
|
||||||
currentTrack.TrackSequence);
|
(uint)(sectors - doneSectors));
|
||||||
DicConsole.Write("\rHashings sectors {0} to {2} of track {1}", doneSectors,
|
DicConsole.Write("\rHashings sectors {0} to {2} of file {1}", doneSectors,
|
||||||
currentTrack.TrackSequence, doneSectors + (sectors - doneSectors));
|
currentFile.File, doneSectors + (sectors - doneSectors));
|
||||||
doneSectors += sectors - doneSectors;
|
doneSectors += sectors - doneSectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,16 +336,15 @@ namespace DiscImageChef.Commands
|
|||||||
if(separatedTracks)
|
if(separatedTracks)
|
||||||
if(trackChecksum != null)
|
if(trackChecksum != null)
|
||||||
foreach(ChecksumType chk in trackChecksum.End())
|
foreach(ChecksumType chk in trackChecksum.End())
|
||||||
DicConsole.WriteLine("Track {0}'s {1}: {2}", currentTrack.TrackSequence, chk.type,
|
DicConsole.WriteLine("File {0}'s {1}: {2}", currentFile.File, chk.type, chk.Value);
|
||||||
chk.Value);
|
|
||||||
|
|
||||||
previousTrackEnd = currentTrack.TrackEndSector;
|
previousTrackEnd = currentFile.LastBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(opticalInput.Info.Sectors - previousTrackEnd != 0 && wholeDisc)
|
if(tapeImage.Info.Sectors - previousTrackEnd != 0 && wholeDisc)
|
||||||
for(ulong i = previousTrackEnd + 1; i < opticalInput.Info.Sectors; i++)
|
for(ulong i = previousTrackEnd + 1; i < tapeImage.Info.Sectors; i++)
|
||||||
{
|
{
|
||||||
DicConsole.Write("\rHashing track-less sector {0}", i);
|
DicConsole.Write("\rHashing file-less sector {0}", i);
|
||||||
|
|
||||||
byte[] hiddenSector = inputFormat.ReadSector(i);
|
byte[] hiddenSector = inputFormat.ReadSector(i);
|
||||||
mediaChecksum?.Update(hiddenSector);
|
mediaChecksum?.Update(hiddenSector);
|
||||||
@@ -264,46 +353,46 @@ namespace DiscImageChef.Commands
|
|||||||
if(wholeDisc)
|
if(wholeDisc)
|
||||||
if(mediaChecksum != null)
|
if(mediaChecksum != null)
|
||||||
foreach(ChecksumType chk in mediaChecksum.End())
|
foreach(ChecksumType chk in mediaChecksum.End())
|
||||||
DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
|
DicConsole.WriteLine("Tape's {0}: {1}", chk.type, chk.Value);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
|
||||||
|
default:
|
||||||
{
|
{
|
||||||
if(MainClass.Debug) DicConsole.DebugWriteLine("Could not get tracks because {0}", ex.Message);
|
mediaChecksum = new Checksum(enabledChecksums);
|
||||||
else DicConsole.WriteLine("Unable to get separate tracks, not checksumming them");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mediaChecksum = new Checksum(enabledChecksums);
|
|
||||||
|
|
||||||
ulong sectors = inputFormat.Info.Sectors;
|
ulong sectors = inputFormat.Info.Sectors;
|
||||||
DicConsole.WriteLine("Sectors {0}", sectors);
|
DicConsole.WriteLine("Sectors {0}", sectors);
|
||||||
ulong doneSectors = 0;
|
ulong doneSectors = 0;
|
||||||
|
|
||||||
while(doneSectors < sectors)
|
while(doneSectors < sectors)
|
||||||
{
|
|
||||||
byte[] sector;
|
|
||||||
|
|
||||||
if(sectors - doneSectors >= SECTORS_TO_READ)
|
|
||||||
{
|
{
|
||||||
sector = inputFormat.ReadSectors(doneSectors, SECTORS_TO_READ);
|
byte[] sector;
|
||||||
DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors, doneSectors + SECTORS_TO_READ);
|
|
||||||
doneSectors += SECTORS_TO_READ;
|
if(sectors - doneSectors >= SECTORS_TO_READ)
|
||||||
}
|
{
|
||||||
else
|
sector = inputFormat.ReadSectors(doneSectors, SECTORS_TO_READ);
|
||||||
{
|
DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors,
|
||||||
sector = inputFormat.ReadSectors(doneSectors, (uint)(sectors - doneSectors));
|
doneSectors + SECTORS_TO_READ);
|
||||||
DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors,
|
doneSectors += SECTORS_TO_READ;
|
||||||
doneSectors + (sectors - doneSectors));
|
}
|
||||||
doneSectors += sectors - doneSectors;
|
else
|
||||||
|
{
|
||||||
|
sector = inputFormat.ReadSectors(doneSectors, (uint)(sectors - doneSectors));
|
||||||
|
DicConsole.Write("\rHashings sectors {0} to {1}", doneSectors,
|
||||||
|
doneSectors + (sectors - doneSectors));
|
||||||
|
doneSectors += sectors - doneSectors;
|
||||||
|
}
|
||||||
|
|
||||||
|
mediaChecksum.Update(sector);
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaChecksum.Update(sector);
|
DicConsole.WriteLine();
|
||||||
|
|
||||||
|
foreach(ChecksumType chk in mediaChecksum.End())
|
||||||
|
DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine();
|
|
||||||
|
|
||||||
foreach(ChecksumType chk in mediaChecksum.End())
|
|
||||||
DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (int)ErrorNumber.NoError;
|
return (int)ErrorNumber.NoError;
|
||||||
|
|||||||
Reference in New Issue
Block a user