From bb190c9b40625e4cfc793af2aa499645c518037d Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 5 Dec 2022 21:29:04 +0000 Subject: [PATCH] Create media graph when dumping or verifying any kind of media (except SSC). --- Aaru.Core/Devices/Dumping/ATA.cs | 37 +++++++++++++++ Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs | 7 +-- .../Devices/Dumping/LinearMemory/Retrode.cs | 5 +++ Aaru.Core/Devices/Dumping/MiniDisc.cs | 20 +++++++++ .../PlayStationPortable/MemoryStick.cs | 20 +++++++++ .../Dumping/PlayStationPortable/UMD.cs | 20 +++++++++ Aaru.Core/Devices/Dumping/Sbc/Dump.cs | 9 ++-- Aaru.Core/Devices/Dumping/SecureDigital.cs | 22 +++++++++ Aaru.Core/Devices/Dumping/XGD.cs | 22 +++++++++ Aaru/Commands/Image/Verify.cs | 45 ++++++++++++++----- 10 files changed, 188 insertions(+), 19 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/ATA.cs b/Aaru.Core/Devices/Dumping/ATA.cs index 8fc85abb3..34af45c9f 100644 --- a/Aaru.Core/Devices/Dumping/ATA.cs +++ b/Aaru.Core/Devices/Dumping/ATA.cs @@ -40,6 +40,7 @@ using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Interfaces; using Aaru.Core.Devices.Report; +using Aaru.Core.Graphics; using Aaru.Core.Logging; using Aaru.Decoders.ATA; using Aaru.Decoders.PCMCIA; @@ -276,6 +277,22 @@ public partial class Dump _dumpLog.WriteLine(Localization.Core.Resuming_from_block_0, _resume.NextBlock); } + if(_createGraph) + { + Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(mediaType); + + if(discSpiralParameters is not null) + _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + + if(_mediaGraph is not null) + foreach(Tuple e in extents.ToArray()) + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); + + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); + } + bool newTrim = false; start = DateTime.UtcNow; @@ -319,6 +336,7 @@ public partial class Dump outputFormat.WriteSectors(cmdBuf, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); + _mediaGraph?.PaintSectorsGood(i, blocksToRead); } else { @@ -416,6 +434,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(cmdBuf, badSector); + _mediaGraph?.PaintSectorGood(badSector); } EndProgress?.Invoke(); @@ -479,6 +498,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(cmdBuf, badSector); + _mediaGraph?.PaintSectorGood(badSector); UpdateStatus?. Invoke(string.Format(Localization.Core.Correctly_retried_block_0_in_pass_1, @@ -518,6 +538,22 @@ public partial class Dump ibgLog = new IbgLog(_outputPrefix + ".ibg", ataProfile); + if(_createGraph) + { + Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(mediaType); + + if(discSpiralParameters is not null) + _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + + if(_mediaGraph is not null) + foreach(Tuple e in extents.ToArray()) + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); + + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); + } + ulong currentBlock = 0; blocks = (ulong)(cylinders * heads * sectors); start = DateTime.UtcNow; @@ -568,6 +604,7 @@ public partial class Dump imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(currentBlock); + _mediaGraph?.PaintSectorGood((ulong)((((cy * heads) + hd) * sectors) + (sc - 1))); _dumpLog.WriteLine(Localization.Core.Error_reading_cylinder_0_head_1_sector_2, cy, hd, sc); diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs index d100ede26..bcbf7e95b 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs @@ -1120,14 +1120,15 @@ sealed partial class Dump Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(dskType); if(discSpiralParameters is not null) - { _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + if(_mediaGraph is not null) foreach(Tuple e in extents.ToArray()) _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); - _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); - } + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); } audioExtents = new ExtentsULong(); diff --git a/Aaru.Core/Devices/Dumping/LinearMemory/Retrode.cs b/Aaru.Core/Devices/Dumping/LinearMemory/Retrode.cs index a5fcf0426..4a9da8025 100644 --- a/Aaru.Core/Devices/Dumping/LinearMemory/Retrode.cs +++ b/Aaru.Core/Devices/Dumping/LinearMemory/Retrode.cs @@ -35,6 +35,7 @@ using System.Linq; using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; +using Aaru.Core.Graphics; using Version = Aaru.CommonTypes.Interop.Version; namespace Aaru.Core.Devices.Dumping; @@ -285,6 +286,9 @@ public partial class Dump return; } + if(_createGraph) + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, romSectors); + DateTime start = DateTime.UtcNow; double imageWriteDuration = 0; @@ -328,6 +332,7 @@ public partial class Dump DateTime writeStart = DateTime.Now; outputBai.WriteBytes(readBuffer, 0, readBuffer.Length, out _); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; + _mediaGraph.PaintSectorsGood(i, blocksToRead); } else { diff --git a/Aaru.Core/Devices/Dumping/MiniDisc.cs b/Aaru.Core/Devices/Dumping/MiniDisc.cs index 7c0a0853e..4574096ec 100644 --- a/Aaru.Core/Devices/Dumping/MiniDisc.cs +++ b/Aaru.Core/Devices/Dumping/MiniDisc.cs @@ -43,6 +43,7 @@ using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Metadata; using Aaru.Console; +using Aaru.Core.Graphics; using Aaru.Core.Logging; using Aaru.Decoders.SCSI; using Aaru.Devices; @@ -362,6 +363,22 @@ partial class Dump _dumpLog.WriteLine(Localization.Core.Resuming_from_block_0, _resume.NextBlock); } + if(_createGraph) + { + Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(dskType); + + if(discSpiralParameters is not null) + _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + + if(_mediaGraph is not null) + foreach(Tuple e in extents.ToArray()) + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); + + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); + } + bool newTrim = false; DateTime timeSpeedStart = DateTime.UtcNow; ulong sectorSpeedStart = 0; @@ -407,6 +424,7 @@ partial class Dump outputFormat.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); + _mediaGraph?.PaintSectorsGood(i, blocksToRead); } else { @@ -505,6 +523,7 @@ partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); } EndProgress?.Invoke(); @@ -659,6 +678,7 @@ partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); UpdateStatus?.Invoke(string.Format(Localization.Core.Correctly_retried_block_0_in_pass_1, badSector, pass)); diff --git a/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs b/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs index c2a9dcd6d..a165600d0 100644 --- a/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs +++ b/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs @@ -43,6 +43,7 @@ using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Metadata; using Aaru.Console; +using Aaru.Core.Graphics; using Aaru.Core.Logging; using Aaru.Decoders.SCSI; using Aaru.Devices; @@ -194,6 +195,22 @@ public partial class Dump if(_resume.NextBlock > 0) _dumpLog.WriteLine(Localization.Core.Resuming_from_block_0, _resume.NextBlock); + if(_createGraph) + { + Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(dskType); + + if(discSpiralParameters is not null) + _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + + if(_mediaGraph is not null) + foreach(Tuple e in extents.ToArray()) + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); + + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); + } + bool newTrim = false; DateTime timeSpeedStart = DateTime.UtcNow; @@ -240,6 +257,7 @@ public partial class Dump outputFormat.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); + _mediaGraph?.PaintSectorsGood(i, blocksToRead); } else { @@ -345,6 +363,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); } EndProgress?.Invoke(); @@ -512,6 +531,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); UpdateStatus?.Invoke(string.Format(Localization.Core.Correctly_retried_block_0_in_pass_1, badSector, pass)); diff --git a/Aaru.Core/Devices/Dumping/PlayStationPortable/UMD.cs b/Aaru.Core/Devices/Dumping/PlayStationPortable/UMD.cs index 1dc281b5d..d05baa238 100644 --- a/Aaru.Core/Devices/Dumping/PlayStationPortable/UMD.cs +++ b/Aaru.Core/Devices/Dumping/PlayStationPortable/UMD.cs @@ -41,6 +41,7 @@ using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.Console; +using Aaru.Core.Graphics; using Aaru.Core.Logging; using Aaru.Decoders.SCSI; using Aaru.Devices; @@ -208,6 +209,22 @@ public partial class Dump if(_resume.NextBlock > 0) _dumpLog.WriteLine(Localization.Core.Resuming_from_block_0, _resume.NextBlock); + if(_createGraph) + { + Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(dskType); + + if(discSpiralParameters is not null) + _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + + if(_mediaGraph is not null) + foreach(Tuple e in extents.ToArray()) + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); + + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); + } + bool newTrim = false; DateTime timeSpeedStart = DateTime.UtcNow; @@ -254,6 +271,7 @@ public partial class Dump outputOptical.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); + _mediaGraph?.PaintSectorsGood(i, blocksToRead); } else { @@ -357,6 +375,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputOptical.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); } EndProgress?.Invoke(); @@ -509,6 +528,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputOptical.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); UpdateStatus?.Invoke(string.Format(Localization.Core.Correctly_retried_block_0_in_pass_1, badSector, pass)); diff --git a/Aaru.Core/Devices/Dumping/Sbc/Dump.cs b/Aaru.Core/Devices/Dumping/Sbc/Dump.cs index ea2bda299..512e65b2f 100644 --- a/Aaru.Core/Devices/Dumping/Sbc/Dump.cs +++ b/Aaru.Core/Devices/Dumping/Sbc/Dump.cs @@ -715,14 +715,15 @@ partial class Dump Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(dskType, discIs80Mm); if(discSpiralParameters is not null) - { _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + if(_mediaGraph is not null) foreach(Tuple e in extents.ToArray()) - _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 1)); + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); - _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); - } + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); } if(currentTry == null || diff --git a/Aaru.Core/Devices/Dumping/SecureDigital.cs b/Aaru.Core/Devices/Dumping/SecureDigital.cs index 331a43ab0..56dcc979d 100644 --- a/Aaru.Core/Devices/Dumping/SecureDigital.cs +++ b/Aaru.Core/Devices/Dumping/SecureDigital.cs @@ -42,6 +42,7 @@ using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Extents; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Metadata; +using Aaru.Core.Graphics; using Aaru.Core.Logging; using Aaru.Decoders.MMC; using Aaru.Decoders.SecureDigital; @@ -598,6 +599,24 @@ public partial class Dump _dumpLog.WriteLine(Localization.Core.Resuming_from_block_0, _resume.NextBlock); } + if(_createGraph) + { + Spiral.DiscParameters discSpiralParameters = + Spiral.DiscParametersFromMediaType(_dev.Type == DeviceType.SecureDigital ? MediaType.SecureDigital + : MediaType.MMC); + + if(discSpiralParameters is not null) + _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + + if(_mediaGraph is not null) + foreach(Tuple e in extents.ToArray()) + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); + + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); + } + start = DateTime.UtcNow; double imageWriteDuration = 0; bool newTrim = false; @@ -652,6 +671,7 @@ public partial class Dump outputFormat.WriteSectors(cmdBuf, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); + _mediaGraph?.PaintSectorsGood(i, blocksToRead); } else { @@ -753,6 +773,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(cmdBuf, badSector); + _mediaGraph?.PaintSectorGood(badSector); } EndProgress?.Invoke(); @@ -809,6 +830,7 @@ public partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(cmdBuf, badSector); + _mediaGraph?.PaintSectorGood(badSector); UpdateStatus?.Invoke(string.Format(Localization.Core.Correctly_retried_block_0_in_pass_1, badSector, pass)); diff --git a/Aaru.Core/Devices/Dumping/XGD.cs b/Aaru.Core/Devices/Dumping/XGD.cs index f14ab5fbe..403a7626d 100644 --- a/Aaru.Core/Devices/Dumping/XGD.cs +++ b/Aaru.Core/Devices/Dumping/XGD.cs @@ -43,6 +43,7 @@ using Aaru.CommonTypes.Interop; using Aaru.CommonTypes.Structs; using Aaru.CommonTypes.Structs.Devices.SCSI; using Aaru.Console; +using Aaru.Core.Graphics; using Aaru.Core.Logging; using Aaru.Decoders.DVD; using Aaru.Decoders.SCSI; @@ -528,6 +529,22 @@ partial class Dump extents == null) StoppingErrorMessage?.Invoke(Localization.Core.Could_not_process_resume_file_not_continuing); + if(_createGraph) + { + Spiral.DiscParameters discSpiralParameters = Spiral.DiscParametersFromMediaType(dskType); + + if(discSpiralParameters is not null) + _mediaGraph = new Spiral((int)_dimensions, (int)_dimensions, discSpiralParameters, blocks); + else + _mediaGraph = new BlockMap((int)_dimensions, (int)_dimensions, blocks); + + if(_mediaGraph is not null) + foreach(Tuple e in extents.ToArray()) + _mediaGraph?.PaintSectorsGood(e.Item1, (uint)(e.Item2 - e.Item1 + 2)); + + _mediaGraph?.PaintSectorsBad(_resume.BadBlocks); + } + (outputFormat as IWritableOpticalImage).SetTracks(new List { new() @@ -643,6 +660,7 @@ partial class Dump outputFormat.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); + _mediaGraph?.PaintSectorsGood(i, blocksToRead); } else { @@ -726,6 +744,7 @@ partial class Dump extents.Add(i, blocksToRead, true); currentSector = i + 1; _resume.NextBlock = currentSector; + _mediaGraph?.PaintSectorsGood(i, blocksToRead); } if(!_aborted) @@ -842,6 +861,7 @@ partial class Dump outputFormat.WriteSectors(readBuffer, currentSector, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(currentSector, blocksToRead, true); + _mediaGraph?.PaintSectorsGood(currentSector, blocksToRead); } else { @@ -976,6 +996,7 @@ partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); } EndProgress?.Invoke(); @@ -1149,6 +1170,7 @@ partial class Dump _resume.BadBlocks.Remove(badSector); extents.Add(badSector); outputFormat.WriteSector(readBuffer, badSector); + _mediaGraph?.PaintSectorGood(badSector); UpdateStatus?.Invoke(string.Format(Localization.Core.Correctly_retried_block_0_in_pass_1, badSector, pass)); diff --git a/Aaru/Commands/Image/Verify.cs b/Aaru/Commands/Image/Verify.cs index d83e3c466..cf5d0209c 100644 --- a/Aaru/Commands/Image/Verify.cs +++ b/Aaru/Commands/Image/Verify.cs @@ -235,7 +235,7 @@ sealed class VerifyCommand : Command DateTime endCheck = startCheck; List failingLbas = new(); List unknownLbas = new(); - Spiral spiral = null; + IMediaGraph mediaGraph = null; if(verifiableSectorsImage is IOpticalMediaImage { Tracks: {} } opticalMediaImage) { @@ -245,7 +245,10 @@ sealed class VerifyCommand : Command spiralParameters = Spiral.DiscParametersFromMediaType(opticalMediaImage.Info.MediaType); if(spiralParameters is not null) - spiral = new Spiral((int)dimensions, (int)dimensions, spiralParameters, opticalMediaImage.Info.Sectors); + mediaGraph = new Spiral((int)dimensions, (int)dimensions, spiralParameters, + opticalMediaImage.Info.Sectors); + else if(createGraph) + mediaGraph = new BlockMap((int)dimensions, (int)dimensions, opticalMediaImage.Info.Sectors); List inputTracks = opticalMediaImage.Tracks; ulong currentSectorAll = 0; @@ -288,27 +291,27 @@ sealed class VerifyCommand : Command opticalMediaImage.VerifySectors(currentSector, 512, currentTrack.Sequence, out tempFailingLbas, out tempUnknownLbas); - List tempCorrectLbas = new(); - - for(ulong l = 0; l < (remainingSectors < 512 ? remainingSectors : 512); l++) - tempCorrectLbas.Add(currentSector + l); - - if(spiral != null) + if(mediaGraph != null) { + List tempCorrectLbas = new(); + + for(ulong l = 0; l < (remainingSectors < 512 ? remainingSectors : 512); l++) + tempCorrectLbas.Add(currentSector + l); + foreach(ulong f in tempFailingLbas) tempCorrectLbas.Remove(f); foreach(ulong u in tempUnknownLbas) { tempCorrectLbas.Remove(u); - spiral.PaintSectorUnknown(currentTrack.StartSector + u); + mediaGraph.PaintSectorUnknown(currentTrack.StartSector + u); } foreach(ulong lba in tempCorrectLbas) - spiral.PaintSectorGood(currentTrack.StartSector + lba); + mediaGraph.PaintSectorGood(currentTrack.StartSector + lba); foreach(ulong f in tempFailingLbas) - spiral.PaintSectorBad(currentTrack.StartSector + f); + mediaGraph.PaintSectorBad(currentTrack.StartSector + f); } failingLbas.AddRange(tempFailingLbas); @@ -371,6 +374,24 @@ sealed class VerifyCommand : Command unknownLbas.AddRange(tempUnknownLbas); + if(mediaGraph != null) + { + List tempCorrectLbas = new(); + + for(ulong l = 0; l < (remainingSectors < 512 ? remainingSectors : 512); l++) + tempCorrectLbas.Add(currentSector + l); + + foreach(ulong f in tempFailingLbas) + tempCorrectLbas.Remove(f); + + foreach(ulong u in tempUnknownLbas) + tempCorrectLbas.Remove(u); + + mediaGraph.PaintSectorsUnknown(tempUnknownLbas); + mediaGraph.PaintSectorsGood(tempCorrectLbas); + mediaGraph.PaintSectorsBad(tempFailingLbas); + } + if(remainingSectors < 512) { currentSector += remainingSectors; @@ -428,7 +449,7 @@ sealed class VerifyCommand : Command AaruConsole.WriteLine($"[italic]{UI.Total_unknowns}[/] {unknownLbas.Count}"); AaruConsole.WriteLine($"[italic]{UI.Total_errors_plus_unknowns}[/] {failingLbas.Count + unknownLbas.Count}"); - spiral?.WriteTo($"{Path.GetFileNameWithoutExtension(inputFilter.Filename)}.verify.png"); + mediaGraph?.WriteTo($"{Path.GetFileNameWithoutExtension(inputFilter.Filename)}.verify.png"); if(failingLbas.Count > 0) correctSectors = false;