From 8827dd189503e3904bb8d8e34b343a639fae62a4 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 26 Oct 2019 02:21:41 +0100 Subject: [PATCH] Protect against null mode pages. Fixes #243 --- .../Devices/Dumping/CompactDisc.cs | 1164 +++++++++-------- DiscImageChef.Core/Devices/Dumping/SBC.cs | 6 +- DiscImageChef.DiscImages/ZZZRawImage/Read.cs | 817 ++++++------ DiscImageChef.Gui/Tabs/tabScsiInfo.xeto.cs | 798 +++++------ 4 files changed, 1437 insertions(+), 1348 deletions(-) diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs index d39e7a932..6b5c6f9fe 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs @@ -69,22 +69,22 @@ namespace DiscImageChef.Core.Devices.Dumping /// Disc type as detected in MMC layer internal void CompactDisc(ref MediaType dskType) { - uint subSize; - DateTime start; - DateTime end; - bool readcd; - bool read6 = false, read10 = false, read12 = false, read16 = false; - bool sense = false; - const uint SECTOR_SIZE = 2352; - FullTOC.CDFullTOC? toc = null; - double totalDuration = 0; - double currentSpeed = 0; - double maxSpeed = double.MinValue; - double minSpeed = double.MaxValue; - uint blocksToRead = 64; - Dictionary mediaTags = new Dictionary(); + uint subSize; + DateTime start; + DateTime end; + bool readcd; + bool read6 = false, read10 = false, read12 = false, read16 = false; + var sense = false; + const uint SECTOR_SIZE = 2352; + FullTOC.CDFullTOC? toc = null; + double totalDuration = 0; + double currentSpeed = 0; + var maxSpeed = double.MinValue; + var minSpeed = double.MaxValue; + uint blocksToRead = 64; + var mediaTags = new Dictionary(); - if(dumpRaw) + if (dumpRaw) { dumpLog.WriteLine("Raw CD dumping not yet implemented"); StoppingErrorMessage?.Invoke("Raw CD dumping not yet implemented"); @@ -92,19 +92,19 @@ namespace DiscImageChef.Core.Devices.Dumping } dskType = MediaType.CD; - int sessions = 1; + var sessions = 1; // We discarded all discs that falsify a TOC before requesting a real TOC // No TOC, no CD (or an empty one) dumpLog.WriteLine("Reading full TOC"); UpdateStatus?.Invoke("Reading full TOC"); - bool tocSense = dev.ReadRawToc(out byte[] cmdBuf, out byte[] senseBuf, 0, dev.Timeout, out _); - if(!tocSense) + var tocSense = dev.ReadRawToc(out var cmdBuf, out var senseBuf, 0, dev.Timeout, out _); + if (!tocSense) { toc = FullTOC.Decode(cmdBuf); - if(toc.HasValue) + if (toc.HasValue) { - byte[] tmpBuf = new byte[cmdBuf.Length - 2]; + var tmpBuf = new byte[cmdBuf.Length - 2]; Array.Copy(cmdBuf, 2, tmpBuf, 0, cmdBuf.Length - 2); mediaTags.Add(MediaTagType.CD_FullTOC, tmpBuf); @@ -112,10 +112,10 @@ namespace DiscImageChef.Core.Devices.Dumping dumpLog.WriteLine("Reading ATIP"); UpdateStatus?.Invoke("Reading ATIP"); sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out _); - if(!sense) + if (!sense) { - ATIP.CDATIP? atip = ATIP.Decode(cmdBuf); - if(atip.HasValue) + var atip = ATIP.Decode(cmdBuf); + if (atip.HasValue) { // Only CD-R and CD-RW have ATIP dskType = atip.Value.DiscType ? MediaType.CDRW : MediaType.CDR; @@ -129,13 +129,13 @@ namespace DiscImageChef.Core.Devices.Dumping dumpLog.WriteLine("Reading Disc Information"); UpdateStatus?.Invoke("Reading Disc Information"); sense = dev.ReadDiscInformation(out cmdBuf, out senseBuf, - MmcDiscInformationDataTypes.DiscInformation, dev.Timeout, out _); - if(!sense) + MmcDiscInformationDataTypes.DiscInformation, dev.Timeout, out _); + if (!sense) { - DiscInformation.StandardDiscInformation? discInfo = DiscInformation.Decode000b(cmdBuf); - if(discInfo.HasValue) - if(dskType == MediaType.CD) - switch(discInfo.Value.DiscType) + var discInfo = DiscInformation.Decode000b(cmdBuf); + if (discInfo.HasValue) + if (dskType == MediaType.CD) + switch (discInfo.Value.DiscType) { case 0x10: dskType = MediaType.CDI; @@ -146,57 +146,61 @@ namespace DiscImageChef.Core.Devices.Dumping } } - int firstTrackLastSession = 0; + var firstTrackLastSession = 0; dumpLog.WriteLine("Reading Session Information"); UpdateStatus?.Invoke("Reading Session Information"); sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out _); - if(!sense) + if (!sense) { - Session.CDSessionInfo? session = Session.Decode(cmdBuf); - if(session.HasValue) + var session = Session.Decode(cmdBuf); + if (session.HasValue) { - sessions = session.Value.LastCompleteSession; + sessions = session.Value.LastCompleteSession; firstTrackLastSession = session.Value.TrackDescriptors[0].TrackNumber; } } - if(dskType == MediaType.CD || dskType == MediaType.CDROMXA) + if (dskType == MediaType.CD || dskType == MediaType.CDROMXA) { - bool hasDataTrack = false; - bool hasAudioTrack = false; - bool allFirstSessionTracksAreAudio = true; - bool hasVideoTrack = false; + var hasDataTrack = false; + var hasAudioTrack = false; + var allFirstSessionTracksAreAudio = true; + var hasVideoTrack = false; - foreach(FullTOC.TrackDataDescriptor track in toc.Value.TrackDescriptors) + foreach (var track in toc.Value.TrackDescriptors) { - if(track.TNO == 1 && ((TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrack || - (TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrackIncremental) + if (track.TNO == 1 && ((TocControl) (track.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl) (track.CONTROL & 0x0D) == + TocControl.DataTrackIncremental) ) allFirstSessionTracksAreAudio &= firstTrackLastSession != 1; - if((TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrack || - (TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrackIncremental) + if ((TocControl) (track.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl) (track.CONTROL & 0x0D) == TocControl.DataTrackIncremental) { - hasDataTrack = true; + hasDataTrack = true; allFirstSessionTracksAreAudio &= track.POINT >= firstTrackLastSession; } - else hasAudioTrack = true; + else + { + hasAudioTrack = true; + } hasVideoTrack |= track.ADR == 4; } - if(hasDataTrack && hasAudioTrack && allFirstSessionTracksAreAudio && sessions == 2) + if (hasDataTrack && hasAudioTrack && allFirstSessionTracksAreAudio && sessions == 2) dskType = MediaType.CDPLUS; - if(!hasDataTrack && hasAudioTrack && sessions == 1) dskType = MediaType.CDDA; - if(hasDataTrack && !hasAudioTrack && sessions == 1) dskType = MediaType.CDROM; - if(hasVideoTrack && !hasDataTrack && sessions == 1) dskType = MediaType.CDV; + if (!hasDataTrack && hasAudioTrack && sessions == 1) dskType = MediaType.CDDA; + if (hasDataTrack && !hasAudioTrack && sessions == 1) dskType = MediaType.CDROM; + if (hasVideoTrack && !hasDataTrack && sessions == 1) dskType = MediaType.CDV; } dumpLog.WriteLine("Reading PMA"); UpdateStatus?.Invoke("Reading PMA"); sense = dev.ReadPma(out cmdBuf, out senseBuf, dev.Timeout, out _); - if(!sense) - if(PMA.Decode(cmdBuf).HasValue) + if (!sense) + if (PMA.Decode(cmdBuf).HasValue) { tmpBuf = new byte[cmdBuf.Length - 4]; Array.Copy(cmdBuf, 4, tmpBuf, 0, cmdBuf.Length - 4); @@ -206,8 +210,8 @@ namespace DiscImageChef.Core.Devices.Dumping dumpLog.WriteLine("Reading CD-Text from Lead-In"); UpdateStatus?.Invoke("Reading CD-Text from Lead-In"); sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out _); - if(!sense) - if(CDTextOnLeadIn.Decode(cmdBuf).HasValue) + if (!sense) + if (CDTextOnLeadIn.Decode(cmdBuf).HasValue) { tmpBuf = new byte[cmdBuf.Length - 4]; Array.Copy(cmdBuf, 4, tmpBuf, 0, cmdBuf.Length - 4); @@ -219,20 +223,20 @@ namespace DiscImageChef.Core.Devices.Dumping // TODO: Add other detectors here dumpLog.WriteLine("Detecting disc type..."); UpdateStatus?.Invoke("Detecting disc type..."); - byte[] videoNowColorFrame = new byte[9 * 2352]; - for(int i = 0; i < 9; i++) + var videoNowColorFrame = new byte[9 * 2352]; + for (var i = 0; i < 9; i++) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.AllTypes, false, false, - true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, MmcSubchannel.None, - dev.Timeout, out _); + sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint) i, 2352, 1, MmcSectorTypes.AllTypes, false, false, + true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, MmcSubchannel.None, + dev.Timeout, out _); - if(sense || dev.Error) + if (sense || dev.Error) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.Cdda, false, false, - true, MmcHeaderCodes.None, true, true, MmcErrorField.None, MmcSubchannel.None, - dev.Timeout, out _); + sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint) i, 2352, 1, MmcSectorTypes.Cdda, false, false, + true, MmcHeaderCodes.None, true, true, MmcErrorField.None, MmcSubchannel.None, + dev.Timeout, out _); - if(sense || !dev.Error) + if (sense || !dev.Error) { videoNowColorFrame = null; break; @@ -242,15 +246,15 @@ namespace DiscImageChef.Core.Devices.Dumping Array.Copy(cmdBuf, 0, videoNowColorFrame, i * 2352, 2352); } - if(MMC.IsVideoNowColor(videoNowColorFrame)) dskType = MediaType.VideoNowColor; + if (MMC.IsVideoNowColor(videoNowColorFrame)) dskType = MediaType.VideoNowColor; - MmcSubchannel supportedSubchannel = MmcSubchannel.Raw; + var supportedSubchannel = MmcSubchannel.Raw; dumpLog.WriteLine("Checking if drive supports full raw subchannel reading..."); UpdateStatus?.Invoke("Checking if drive supports full raw subchannel reading..."); - readcd = !dev.ReadCd(out byte[] readBuffer, out senseBuf, 0, SECTOR_SIZE + 96, 1, MmcSectorTypes.AllTypes, - false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out _); - if(readcd) + readcd = !dev.ReadCd(out var readBuffer, out senseBuf, 0, SECTOR_SIZE + 96, 1, MmcSectorTypes.AllTypes, + false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, dev.Timeout, out _); + if (readcd) { dumpLog.WriteLine("Full raw subchannel reading supported..."); UpdateStatus?.Invoke("Full raw subchannel reading supported..."); @@ -262,16 +266,18 @@ namespace DiscImageChef.Core.Devices.Dumping dumpLog.WriteLine("Checking if drive supports PQ subchannel reading..."); UpdateStatus?.Invoke("Checking if drive supports PQ subchannel reading..."); readcd = !dev.ReadCd(out readBuffer, out senseBuf, 0, SECTOR_SIZE + 16, 1, MmcSectorTypes.AllTypes, - false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out _); + false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, dev.Timeout, out _); - if(readcd) + if (readcd) { dumpLog.WriteLine("PQ subchannel reading supported..."); - dumpLog.WriteLine("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); + dumpLog.WriteLine( + "WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); UpdateStatus?.Invoke("PQ subchannel reading supported..."); UpdateStatus - ?.Invoke("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); + ?.Invoke( + "WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); subSize = 16; } else @@ -280,10 +286,10 @@ namespace DiscImageChef.Core.Devices.Dumping dumpLog.WriteLine("Checking if drive supports reading without subchannel..."); UpdateStatus?.Invoke("Checking if drive supports reading without subchannel..."); readcd = !dev.ReadCd(out readBuffer, out senseBuf, 0, SECTOR_SIZE, 1, MmcSectorTypes.AllTypes, - false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out _); + false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, dev.Timeout, out _); - if(!readcd) + if (!readcd) { dumpLog.WriteLine("Drive does not support READ CD, trying SCSI READ commands..."); ErrorMessage?.Invoke("Drive does not support READ CD, trying SCSI READ commands..."); @@ -294,42 +300,42 @@ namespace DiscImageChef.Core.Devices.Dumping dumpLog.WriteLine("Checking if drive supports READ(10)..."); UpdateStatus?.Invoke("Checking if drive supports READ(10)..."); read10 = !dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, 2048, 0, 1, - dev.Timeout, out _); + dev.Timeout, out _); dumpLog.WriteLine("Checking if drive supports READ(12)..."); UpdateStatus?.Invoke("Checking if drive supports READ(12)..."); read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, 2048, 0, 1, - false, dev.Timeout, out _); + false, dev.Timeout, out _); dumpLog.WriteLine("Checking if drive supports READ(16)..."); UpdateStatus?.Invoke("Checking if drive supports READ(16)..."); read16 = !dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, 2048, 0, 1, false, - dev.Timeout, out _); + dev.Timeout, out _); - if(!read6 && !read10 && !read12 && !read16) + if (!read6 && !read10 && !read12 && !read16) { dumpLog.WriteLine("Cannot read from disc, not continuing..."); StoppingErrorMessage?.Invoke("Cannot read from disc, not continuing..."); return; } - if(read6) + if (read6) { dumpLog.WriteLine("Drive supports READ(6)..."); UpdateStatus?.Invoke("Drive supports READ(6)..."); } - if(read10) + if (read10) { dumpLog.WriteLine("Drive supports READ(10)..."); UpdateStatus?.Invoke("Drive supports READ(10)..."); } - if(read12) + if (read12) { dumpLog.WriteLine("Drive supports READ(12)..."); UpdateStatus?.Invoke("Drive supports READ(12)..."); } - if(read16) + if (read16) { dumpLog.WriteLine("Drive supports READ(16)..."); UpdateStatus?.Invoke("Drive supports READ(16)..."); @@ -337,19 +343,21 @@ namespace DiscImageChef.Core.Devices.Dumping } dumpLog.WriteLine("Drive can only read without subchannel..."); - dumpLog.WriteLine("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); + dumpLog.WriteLine( + "WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); UpdateStatus?.Invoke("Drive can only read without subchannel..."); UpdateStatus - ?.Invoke("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); + ?.Invoke( + "WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); subSize = 0; } } // Check if output format supports subchannels - if(!outputPlugin.SupportedSectorTags.Contains(SectorTagType.CdSectorSubchannel) && - supportedSubchannel != MmcSubchannel.None) + if (!outputPlugin.SupportedSectorTags.Contains(SectorTagType.CdSectorSubchannel) && + supportedSubchannel != MmcSubchannel.None) { - if(!force) + if (!force) { dumpLog.WriteLine("Output format does not support subchannels, continuing..."); UpdateStatus?.Invoke("Output format does not support subchannels, continuing..."); @@ -362,12 +370,12 @@ namespace DiscImageChef.Core.Devices.Dumping } supportedSubchannel = MmcSubchannel.None; - subSize = 0; + subSize = 0; } TrackSubchannelType subType; - switch(supportedSubchannel) + switch (supportedSubchannel) { case MmcSubchannel.None: subType = TrackSubchannelType.None; @@ -381,102 +389,102 @@ namespace DiscImageChef.Core.Devices.Dumping default: dumpLog.WriteLine("Handling subchannel type {0} not supported, exiting...", supportedSubchannel); StoppingErrorMessage - ?.Invoke($"Handling subchannel type {supportedSubchannel} not supported, exiting..."); + ?.Invoke($"Handling subchannel type {supportedSubchannel} not supported, exiting..."); return; } - uint blockSize = SECTOR_SIZE + subSize; + var blockSize = SECTOR_SIZE + subSize; UpdateStatus?.Invoke("Building track map..."); dumpLog.WriteLine("Building track map..."); - List trackList = new List(); - long lastSector = 0; - Dictionary trackFlags = new Dictionary(); - TrackType firstTrackType = TrackType.Audio; - Dictionary leadOutStarts = new Dictionary(); + var trackList = new List(); + long lastSector = 0; + var trackFlags = new Dictionary(); + var firstTrackType = TrackType.Audio; + var leadOutStarts = new Dictionary(); - if(toc.HasValue) + if (toc.HasValue) { - FullTOC.TrackDataDescriptor[] sortedTracks = + var sortedTracks = toc.Value.TrackDescriptors.OrderBy(track => track.POINT).ToArray(); - foreach(FullTOC.TrackDataDescriptor trk in sortedTracks.Where(trk => trk.ADR == 1 || trk.ADR == 4)) - if(trk.POINT >= 0x01 && trk.POINT <= 0x63) + foreach (var trk in sortedTracks.Where(trk => trk.ADR == 1 || trk.ADR == 4)) + if (trk.POINT >= 0x01 && trk.POINT <= 0x63) { trackList.Add(new Track { TrackSequence = trk.POINT, - TrackSession = trk.SessionNumber, + TrackSession = trk.SessionNumber, TrackType = - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrack || - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental ? TrackType.Data : TrackType.Audio, TrackStartSector = - (ulong)(trk.PHOUR * 3600 * 75 + trk.PMIN * 60 * 75 + trk.PSEC * 75 + - trk.PFRAME - 150), - TrackBytesPerSector = (int)SECTOR_SIZE, - TrackRawBytesPerSector = (int)SECTOR_SIZE, - TrackSubchannelType = subType + (ulong) (trk.PHOUR * 3600 * 75 + trk.PMIN * 60 * 75 + trk.PSEC * 75 + + trk.PFRAME - 150), + TrackBytesPerSector = (int) SECTOR_SIZE, + TrackRawBytesPerSector = (int) SECTOR_SIZE, + TrackSubchannelType = subType }); trackFlags.Add(trk.POINT, trk.CONTROL); } - else if(trk.POINT == 0xA2) + else if (trk.POINT == 0xA2) { int phour, pmin, psec, pframe; - if(trk.PFRAME == 0) + if (trk.PFRAME == 0) { pframe = 74; - if(trk.PSEC == 0) + if (trk.PSEC == 0) { psec = 59; - if(trk.PMIN == 0) + if (trk.PMIN == 0) { - pmin = 59; + pmin = 59; phour = trk.PHOUR - 1; } else { - pmin = trk.PMIN - 1; + pmin = trk.PMIN - 1; phour = trk.PHOUR; } } else { - psec = trk.PSEC - 1; - pmin = trk.PMIN; + psec = trk.PSEC - 1; + pmin = trk.PMIN; phour = trk.PHOUR; } } else { pframe = trk.PFRAME - 1; - psec = trk.PSEC; - pmin = trk.PMIN; - phour = trk.PHOUR; + psec = trk.PSEC; + pmin = trk.PMIN; + phour = trk.PHOUR; } lastSector = phour * 3600 * 75 + pmin * 60 * 75 + psec * 75 + pframe - 150; leadOutStarts.Add(trk.SessionNumber, lastSector + 1); } - else if(trk.POINT == 0xA0 && trk.ADR == 1) + else if (trk.POINT == 0xA0 && trk.ADR == 1) { - switch(trk.PSEC) + switch (trk.PSEC) { case 0x10: dskType = MediaType.CDI; break; case 0x20: - if(dskType == MediaType.CD || dskType == MediaType.CDROM) dskType = MediaType.CDROMXA; + if (dskType == MediaType.CD || dskType == MediaType.CDROM) dskType = MediaType.CDROMXA; break; } firstTrackType = - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrack || - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental ? TrackType.Data : TrackType.Audio; } @@ -487,144 +495,150 @@ namespace DiscImageChef.Core.Devices.Dumping dumpLog.WriteLine("Cannot read RAW TOC, requesting processed one..."); tocSense = dev.ReadToc(out cmdBuf, out senseBuf, false, 0, dev.Timeout, out _); - TOC.CDTOC? oldToc = TOC.Decode(cmdBuf); - if((tocSense || !oldToc.HasValue) && !force) + var oldToc = TOC.Decode(cmdBuf); + if ((tocSense || !oldToc.HasValue) && !force) { - dumpLog.WriteLine("Could not read TOC, if you want to continue, use force, and will try from LBA 0 to 360000..."); + dumpLog.WriteLine( + "Could not read TOC, if you want to continue, use force, and will try from LBA 0 to 360000..."); StoppingErrorMessage - ?.Invoke("Could not read TOC, if you want to continue, use force, and will try from LBA 0 to 360000..."); + ?.Invoke( + "Could not read TOC, if you want to continue, use force, and will try from LBA 0 to 360000..."); return; } - foreach(TOC.CDTOCTrackDataDescriptor trk in oldToc - .Value.TrackDescriptors.OrderBy(t => t.TrackNumber) - .Where(trk => trk.ADR == 1 || trk.ADR == 4)) - if(trk.TrackNumber >= 0x01 && trk.TrackNumber <= 0x63) + foreach (var trk in oldToc + .Value.TrackDescriptors.OrderBy(t => t.TrackNumber) + .Where(trk => trk.ADR == 1 || trk.ADR == 4)) + if (trk.TrackNumber >= 0x01 && trk.TrackNumber <= 0x63) { trackList.Add(new Track { TrackSequence = trk.TrackNumber, - TrackSession = 1, + TrackSession = 1, TrackType = - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrack || - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental ? TrackType.Data : TrackType.Audio, - TrackStartSector = trk.TrackStartAddress, - TrackBytesPerSector = (int)SECTOR_SIZE, - TrackRawBytesPerSector = (int)SECTOR_SIZE, - TrackSubchannelType = subType + TrackStartSector = trk.TrackStartAddress, + TrackBytesPerSector = (int) SECTOR_SIZE, + TrackRawBytesPerSector = (int) SECTOR_SIZE, + TrackSubchannelType = subType }); trackFlags.Add(trk.TrackNumber, trk.CONTROL); } - else if(trk.TrackNumber == 0xAA) + else if (trk.TrackNumber == 0xAA) { firstTrackType = - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrack || - (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl) (trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental ? TrackType.Data : TrackType.Audio; lastSector = trk.TrackStartAddress - 1; } } - if(trackList.Count == 0) + if (trackList.Count == 0) { UpdateStatus?.Invoke("No tracks found, adding a single track from 0 to Lead-Out"); dumpLog.WriteLine("No tracks found, adding a single track from 0 to Lead-Out"); trackList.Add(new Track { - TrackSequence = 1, - TrackSession = 1, - TrackType = firstTrackType, - TrackStartSector = 0, - TrackBytesPerSector = (int)SECTOR_SIZE, - TrackRawBytesPerSector = (int)SECTOR_SIZE, - TrackSubchannelType = subType + TrackSequence = 1, + TrackSession = 1, + TrackType = firstTrackType, + TrackStartSector = 0, + TrackBytesPerSector = (int) SECTOR_SIZE, + TrackRawBytesPerSector = (int) SECTOR_SIZE, + TrackSubchannelType = subType }); - trackFlags.Add(1, (byte)(firstTrackType == TrackType.Audio ? 0 : 4)); + trackFlags.Add(1, (byte) (firstTrackType == TrackType.Audio ? 0 : 4)); } - if(lastSector == 0) + if (lastSector == 0) { sense = dev.ReadCapacity16(out readBuffer, out senseBuf, dev.Timeout, out _); - if(!sense) + if (!sense) { - byte[] temp = new byte[8]; + var temp = new byte[8]; Array.Copy(cmdBuf, 0, temp, 0, 8); Array.Reverse(temp); - lastSector = (long)BitConverter.ToUInt64(temp, 0); - blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]); + lastSector = (long) BitConverter.ToUInt64(temp, 0); + blockSize = (uint) ((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]); } else { sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _); - if(!sense) + if (!sense) { lastSector = (cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]; - blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]); + blockSize = (uint) ((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]); } } - if(lastSector <= 0) + if (lastSector <= 0) { - if(!force) + if (!force) { StoppingErrorMessage - ?.Invoke("Could not find Lead-Out, if you want to continue use force option and will continue until 360000 sectors..."); - dumpLog.WriteLine("Could not find Lead-Out, if you want to continue use force option and will continue until 360000 sectors..."); + ?.Invoke( + "Could not find Lead-Out, if you want to continue use force option and will continue until 360000 sectors..."); + dumpLog.WriteLine( + "Could not find Lead-Out, if you want to continue use force option and will continue until 360000 sectors..."); return; } UpdateStatus - ?.Invoke("WARNING: Could not find Lead-Out start, will try to read up to 360000 sectors, probably will fail before..."); - dumpLog.WriteLine("WARNING: Could not find Lead-Out start, will try to read up to 360000 sectors, probably will fail before..."); + ?.Invoke( + "WARNING: Could not find Lead-Out start, will try to read up to 360000 sectors, probably will fail before..."); + dumpLog.WriteLine( + "WARNING: Could not find Lead-Out start, will try to read up to 360000 sectors, probably will fail before..."); lastSector = 360000; } } - Track[] tracks = trackList.ToArray(); - for(int t = 1; t < tracks.Length; t++) tracks[t - 1].TrackEndSector = tracks[t].TrackStartSector - 1; + var tracks = trackList.ToArray(); + for (var t = 1; t < tracks.Length; t++) tracks[t - 1].TrackEndSector = tracks[t].TrackStartSector - 1; - tracks[tracks.Length - 1].TrackEndSector = (ulong)lastSector; - ulong blocks = (ulong)(lastSector + 1); + tracks[tracks.Length - 1].TrackEndSector = (ulong) lastSector; + var blocks = (ulong) (lastSector + 1); - if(blocks == 0) + if (blocks == 0) { StoppingErrorMessage?.Invoke("Cannot dump blank media."); return; } - ExtentsULong leadOutExtents = new ExtentsULong(); + var leadOutExtents = new ExtentsULong(); - if(leadOutStarts.Any()) + if (leadOutStarts.Any()) { UpdateStatus?.Invoke("Solving lead-outs..."); - foreach(KeyValuePair leadOuts in leadOutStarts) - for(int i = 0; i < tracks.Length; i++) + foreach (var leadOuts in leadOutStarts) + for (var i = 0; i < tracks.Length; i++) { - if(tracks[i].TrackSession != leadOuts.Key) continue; + if (tracks[i].TrackSession != leadOuts.Key) continue; - if(tracks[i].TrackEndSector >= (ulong)leadOuts.Value) - tracks[i].TrackEndSector = (ulong)leadOuts.Value - 1; + if (tracks[i].TrackEndSector >= (ulong) leadOuts.Value) + tracks[i].TrackEndSector = (ulong) leadOuts.Value - 1; } - ExtentsULong dataExtents = new ExtentsULong(); - foreach(Track trk in tracks) dataExtents.Add(trk.TrackStartSector, trk.TrackEndSector); + var dataExtents = new ExtentsULong(); + foreach (var trk in tracks) dataExtents.Add(trk.TrackStartSector, trk.TrackEndSector); - Tuple[] dataExtentsArray = dataExtents.ToArray(); - for(int i = 0; i < dataExtentsArray.Length - 1; i++) + var dataExtentsArray = dataExtents.ToArray(); + for (var i = 0; i < dataExtentsArray.Length - 1; i++) leadOutExtents.Add(dataExtentsArray[i].Item2 + 1, dataExtentsArray[i + 1].Item1 - 1); } // Check if output format supports all disc tags we have retrieved so far - foreach(MediaTagType tag in mediaTags.Keys) + foreach (var tag in mediaTags.Keys) { - if(outputPlugin.SupportedMediaTags.Contains(tag)) continue; + if (outputPlugin.SupportedMediaTags.Contains(tag)) continue; - if(!force) + if (!force) { dumpLog.WriteLine("Output format does not support {0}, continuing...", tag); ErrorMessage?.Invoke($"Output format does not support {tag}, continuing..."); @@ -638,16 +652,16 @@ namespace DiscImageChef.Core.Devices.Dumping } // Check for hidden data before start of track 1 - if(tracks.First(t => t.TrackSequence == 1).TrackStartSector > 0 && readcd) + if (tracks.First(t => t.TrackSequence == 1).TrackStartSector > 0 && readcd) { dumpLog.WriteLine("First track starts after sector 0, checking for a hidden track..."); UpdateStatus?.Invoke("First track starts after sector 0, checking for a hidden track..."); sense = dev.ReadCd(out readBuffer, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false, - true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, - dev.Timeout, out _); + true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, + dev.Timeout, out _); - if(dev.Error || sense) + if (dev.Error || sense) { dumpLog.WriteLine("Could not read sector 0, continuing..."); UpdateStatus?.Invoke("Could not read sector 0, continuing..."); @@ -655,38 +669,38 @@ namespace DiscImageChef.Core.Devices.Dumping else { byte[] syncMark = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00}; - byte[] cdiMark = {0x01, 0x43, 0x44, 0x2D}; - byte[] testMark = new byte[12]; + byte[] cdiMark = {0x01, 0x43, 0x44, 0x2D}; + var testMark = new byte[12]; Array.Copy(readBuffer, 0, testMark, 0, 12); - bool hiddenData = syncMark.SequenceEqual(testMark) && - (readBuffer[0xF] == 0 || readBuffer[0xF] == 1 || readBuffer[0xF] == 2); + var hiddenData = syncMark.SequenceEqual(testMark) && + (readBuffer[0xF] == 0 || readBuffer[0xF] == 1 || readBuffer[0xF] == 2); - if(hiddenData && readBuffer[0xF] == 2) + if (hiddenData && readBuffer[0xF] == 2) { sense = dev.ReadCd(out readBuffer, out senseBuf, 16, blockSize, 1, MmcSectorTypes.AllTypes, - false, false, true, MmcHeaderCodes.AllHeaders, true, true, - MmcErrorField.None, supportedSubchannel, dev.Timeout, out _); + false, false, true, MmcHeaderCodes.AllHeaders, true, true, + MmcErrorField.None, supportedSubchannel, dev.Timeout, out _); - if(!dev.Error && !sense) + if (!dev.Error && !sense) { testMark = new byte[4]; Array.Copy(readBuffer, 24, testMark, 0, 4); - if(cdiMark.SequenceEqual(testMark)) dskType = MediaType.CDIREADY; + if (cdiMark.SequenceEqual(testMark)) dskType = MediaType.CDIREADY; } - List trkList = new List + var trkList = new List { new Track { - TrackSequence = 0, - TrackSession = 1, - TrackType = hiddenData ? TrackType.Data : TrackType.Audio, - TrackStartSector = 0, - TrackBytesPerSector = (int)SECTOR_SIZE, - TrackRawBytesPerSector = (int)SECTOR_SIZE, - TrackSubchannelType = subType, - TrackEndSector = tracks.First(t => t.TrackSequence == 1).TrackStartSector - 1 + TrackSequence = 0, + TrackSession = 1, + TrackType = hiddenData ? TrackType.Data : TrackType.Audio, + TrackStartSector = 0, + TrackBytesPerSector = (int) SECTOR_SIZE, + TrackRawBytesPerSector = (int) SECTOR_SIZE, + TrackSubchannelType = subType, + TrackEndSector = tracks.First(t => t.TrackSequence == 1).TrackStartSector - 1 } }; @@ -697,31 +711,31 @@ namespace DiscImageChef.Core.Devices.Dumping } // Check mode for tracks - for(int t = 0; t < tracks.Length; t++) + for (var t = 0; t < tracks.Length; t++) { - if(!readcd) + if (!readcd) { tracks[t].TrackType = TrackType.CdMode1; continue; } - if(tracks[t].TrackType == TrackType.Audio) continue; + if (tracks[t].TrackType == TrackType.Audio) continue; dumpLog.WriteLine("Checking mode for track {0}...", tracks[t].TrackSequence); UpdateStatus?.Invoke($"Checking mode for track {tracks[t].TrackSequence}..."); - readcd = !dev.ReadCd(out readBuffer, out senseBuf, (uint)tracks[t].TrackStartSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, - MmcErrorField.None, supportedSubchannel, dev.Timeout, out _); + readcd = !dev.ReadCd(out readBuffer, out senseBuf, (uint) tracks[t].TrackStartSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, + MmcErrorField.None, supportedSubchannel, dev.Timeout, out _); - if(!readcd) + if (!readcd) { dumpLog.WriteLine("Unable to guess mode for track {0}, continuing...", tracks[t].TrackSequence); UpdateStatus?.Invoke($"Unable to guess mode for track {tracks[t].TrackSequence}, continuing..."); continue; } - switch(readBuffer[15]) + switch (readBuffer[15]) { case 1: UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is MODE1"); @@ -729,7 +743,7 @@ namespace DiscImageChef.Core.Devices.Dumping tracks[t].TrackType = TrackType.CdMode1; break; case 2: - if(dskType == MediaType.CDI || dskType == MediaType.CDIREADY) + if (dskType == MediaType.CDI || dskType == MediaType.CDIREADY) { UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is MODE2"); dumpLog.WriteLine("Track {0} is MODE2", tracks[t].TrackSequence); @@ -737,7 +751,7 @@ namespace DiscImageChef.Core.Devices.Dumping break; } - if((readBuffer[0x012] & 0x20) == 0x20) // mode 2 form 2 + if ((readBuffer[0x012] & 0x20) == 0x20) // mode 2 form 2 { UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is MODE2 FORM 2"); dumpLog.WriteLine("Track {0} is MODE2 FORM 2", tracks[t].TrackSequence); @@ -750,7 +764,7 @@ namespace DiscImageChef.Core.Devices.Dumping tracks[t].TrackType = TrackType.CdMode2Form1; // These media type specifications do not legally allow mode 2 tracks to be present - if(dskType == MediaType.CDROM || dskType == MediaType.CDPLUS || dskType == MediaType.CDV) + if (dskType == MediaType.CDROM || dskType == MediaType.CDPLUS || dskType == MediaType.CDV) dskType = MediaType.CD; break; @@ -761,25 +775,25 @@ namespace DiscImageChef.Core.Devices.Dumping } } - bool supportsLongSectors = true; + var supportsLongSectors = true; - if(outputPlugin.Id == new Guid("12345678-AAAA-BBBB-CCCC-123456789000")) + if (outputPlugin.Id == new Guid("12345678-AAAA-BBBB-CCCC-123456789000")) { - if(tracks.Length > 1) + if (tracks.Length > 1) { StoppingErrorMessage?.Invoke("Output format does not support more than 1 track, not continuing..."); dumpLog.WriteLine("Output format does not support more than 1 track, not continuing..."); return; } - if(tracks.Any(t => t.TrackType == TrackType.Audio)) + if (tracks.Any(t => t.TrackType == TrackType.Audio)) { StoppingErrorMessage?.Invoke("Output format does not support audio tracks, not continuing..."); dumpLog.WriteLine("Output format does not support audio tracks, not continuing..."); return; } - if(tracks.Any(t => t.TrackType != TrackType.CdMode1)) + if (tracks.Any(t => t.TrackType != TrackType.CdMode1)) { StoppingErrorMessage?.Invoke("Output format only supports MODE 1 tracks, not continuing..."); dumpLog.WriteLine("Output format only supports MODE 1 tracks, not continuing..."); @@ -790,30 +804,34 @@ namespace DiscImageChef.Core.Devices.Dumping } // Check if something prevents from dumping the first track pregap - if(dumpFirstTrackPregap && readcd) + if (dumpFirstTrackPregap && readcd) { - if(dev.PlatformId == PlatformID.FreeBSD) + if (dev.PlatformId == PlatformID.FreeBSD) { - if(force) + if (force) { - dumpLog.WriteLine("FreeBSD panics when reading CD first track pregap, see upstream bug #224253. continuing"); + dumpLog.WriteLine( + "FreeBSD panics when reading CD first track pregap, see upstream bug #224253. continuing"); ErrorMessage - ?.Invoke("FreeBSD panics when reading CD first track pregap, see upstream bug #224253. continuing"); + ?.Invoke( + "FreeBSD panics when reading CD first track pregap, see upstream bug #224253. continuing"); } else { - dumpLog.WriteLine("FreeBSD panics when reading CD first track pregap, see upstream bug #224253. Not continuing"); + dumpLog.WriteLine( + "FreeBSD panics when reading CD first track pregap, see upstream bug #224253. Not continuing"); StoppingErrorMessage - ?.Invoke("FreeBSD panics when reading CD first track pregap, see upstream bug #224253. Not continuing"); + ?.Invoke( + "FreeBSD panics when reading CD first track pregap, see upstream bug #224253. Not continuing"); return; } dumpFirstTrackPregap = false; } - if(!outputPlugin.SupportedMediaTags.Contains(MediaTagType.CD_FirstTrackPregap)) + if (!outputPlugin.SupportedMediaTags.Contains(MediaTagType.CD_FirstTrackPregap)) { - if(force) + if (force) { dumpLog.WriteLine("Output format does not support CD first track pregap, continuing..."); ErrorMessage?.Invoke("Output format does not support CD first track pregap, continuing..."); @@ -822,7 +840,7 @@ namespace DiscImageChef.Core.Devices.Dumping { dumpLog.WriteLine("Output format does not support CD first track pregap, not continuing..."); StoppingErrorMessage - ?.Invoke("Output format does not support CD first track pregap, not continuing..."); + ?.Invoke("Output format does not support CD first track pregap, not continuing..."); return; } @@ -831,34 +849,35 @@ namespace DiscImageChef.Core.Devices.Dumping } DumpHardwareType currentTry = null; - ExtentsULong extents = null; + ExtentsULong extents = null; ResumeSupport.Process(true, true, blocks, dev.Manufacturer, dev.Model, dev.Serial, dev.PlatformId, - ref resume, ref currentTry, ref extents); - if(currentTry == null || extents == null) + ref resume, ref currentTry, ref extents); + if (currentTry == null || extents == null) { StoppingErrorMessage?.Invoke("Could not process resume file, not continuing..."); return; } - DateTime timeSpeedStart = DateTime.UtcNow; - ulong sectorSpeedStart = 0; + var timeSpeedStart = DateTime.UtcNow; + ulong sectorSpeedStart = 0; // Try to read the first track pregap - if(dumpFirstTrackPregap && readcd) + if (dumpFirstTrackPregap && readcd) { - bool gotFirstTrackPregap = false; - int firstTrackPregapSectorsGood = 0; - MemoryStream firstTrackPregapMs = new MemoryStream(); + var gotFirstTrackPregap = false; + var firstTrackPregapSectorsGood = 0; + var firstTrackPregapMs = new MemoryStream(); readBuffer = null; dumpLog.WriteLine("Reading first track pregap"); UpdateStatus?.Invoke("Reading first track pregap"); InitProgress?.Invoke(); - for(int firstTrackPregapBlock = -150; firstTrackPregapBlock < 0 && resume.NextBlock == 0; + for (var firstTrackPregapBlock = -150; + firstTrackPregapBlock < 0 && resume.NextBlock == 0; firstTrackPregapBlock++) { - if(aborted) + if (aborted) { dumpLog.WriteLine("Aborted!"); UpdateStatus?.Invoke("Aborted!"); @@ -866,36 +885,37 @@ namespace DiscImageChef.Core.Devices.Dumping } PulseProgress - ?.Invoke($"Trying to read first track pregap sector {firstTrackPregapBlock} ({currentSpeed:F3} MiB/sec.)"); + ?.Invoke( + $"Trying to read first track pregap sector {firstTrackPregapBlock} ({currentSpeed:F3} MiB/sec.)"); - sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)firstTrackPregapBlock, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, - out double cmdDuration); + sense = dev.ReadCd(out readBuffer, out senseBuf, (uint) firstTrackPregapBlock, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, + true, MmcErrorField.None, supportedSubchannel, dev.Timeout, + out var cmdDuration); - if(!sense && !dev.Error) + if (!sense && !dev.Error) { - firstTrackPregapMs.Write(readBuffer, 0, (int)blockSize); + firstTrackPregapMs.Write(readBuffer, 0, (int) blockSize); gotFirstTrackPregap = true; firstTrackPregapSectorsGood++; } else { // Write empty data - if(gotFirstTrackPregap) firstTrackPregapMs.Write(new byte[blockSize], 0, (int)blockSize); + if (gotFirstTrackPregap) firstTrackPregapMs.Write(new byte[blockSize], 0, (int) blockSize); } sectorSpeedStart++; - double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; - if(elapsed < 1) continue; + var elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; + if (elapsed < 1) continue; - currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); + currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); sectorSpeedStart = 0; - timeSpeedStart = DateTime.UtcNow; + timeSpeedStart = DateTime.UtcNow; } - if(firstTrackPregapSectorsGood > 0) + if (firstTrackPregapSectorsGood > 0) mediaTags.Add(MediaTagType.CD_FirstTrackPregap, firstTrackPregapMs.ToArray()); EndProgress?.Invoke(); @@ -906,56 +926,56 @@ namespace DiscImageChef.Core.Devices.Dumping } // Try how many blocks are readable at once - while(true) + while (true) { - if(readcd) + if (readcd) { sense = dev.ReadCd(out readBuffer, out senseBuf, 0, blockSize, blocksToRead, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out _); - if(dev.Error || sense) blocksToRead /= 2; + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, + true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out _); + if (dev.Error || sense) blocksToRead /= 2; } - else if(read16) + else if (read16) { sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, blockSize, 0, - blocksToRead, false, dev.Timeout, out _); - if(dev.Error || sense) blocksToRead /= 2; + blocksToRead, false, dev.Timeout, out _); + if (dev.Error || sense) blocksToRead /= 2; } - else if(read12) + else if (read12) { sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, - blocksToRead, false, dev.Timeout, out _); - if(dev.Error || sense) blocksToRead /= 2; + blocksToRead, false, dev.Timeout, out _); + if (dev.Error || sense) blocksToRead /= 2; } - else if(read10) + else if (read10) { sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, - (ushort)blocksToRead, dev.Timeout, out _); - if(dev.Error || sense) blocksToRead /= 2; + (ushort) blocksToRead, dev.Timeout, out _); + if (dev.Error || sense) blocksToRead /= 2; } - else if(read6) + else if (read6) { - sense = dev.Read6(out readBuffer, out senseBuf, 0, blockSize, (byte)blocksToRead, dev.Timeout, - out _); - if(dev.Error || sense) blocksToRead /= 2; + sense = dev.Read6(out readBuffer, out senseBuf, 0, blockSize, (byte) blocksToRead, dev.Timeout, + out _); + if (dev.Error || sense) blocksToRead /= 2; } - if(!dev.Error || blocksToRead == 1) break; + if (!dev.Error || blocksToRead == 1) break; } - if(dev.Error || sense) + if (dev.Error || sense) { dumpLog.WriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError); StoppingErrorMessage?.Invoke($"Device error {dev.LastError} trying to guess ideal transfer length."); return; } - dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); - dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); - dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); + dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); + dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); + dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize); - dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType); - dumpLog.WriteLine("Media identified as {0}.", dskType); + dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType); + dumpLog.WriteLine("Media identified as {0}.", dskType); UpdateStatus?.Invoke($"Reading {blocksToRead} sectors at a time."); UpdateStatus?.Invoke($"Device reports {blocks} blocks ({blocks * blockSize} bytes)."); @@ -964,13 +984,13 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"SCSI device type: {dev.ScsiType}."); UpdateStatus?.Invoke($"Media identified as {dskType}."); - MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); - IbgLog ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008); - bool ret = outputPlugin.Create(outputPath, dskType, formatOptions, blocks, - supportsLongSectors ? blockSize : 2048); + var mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); + var ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008); + var ret = outputPlugin.Create(outputPath, dskType, formatOptions, blocks, + supportsLongSectors ? blockSize : 2048); // Cannot create image - if(!ret) + if (!ret) { dumpLog.WriteLine("Error creating output image, not continuing."); dumpLog.WriteLine(outputPlugin.ErrorMessage); @@ -981,58 +1001,58 @@ namespace DiscImageChef.Core.Devices.Dumping // Send tracklist to output plugin. This may fail if subchannel is set but unsupported. ret = (outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); - if(!ret && supportedSubchannel == MmcSubchannel.None) + if (!ret && supportedSubchannel == MmcSubchannel.None) { dumpLog.WriteLine("Error sending tracks to output image, not continuing."); dumpLog.WriteLine(outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error sending tracks to output image, not continuing." + - Environment.NewLine + + Environment.NewLine + outputPlugin.ErrorMessage); return; } // If a subchannel is supported, check if output plugin allows us to write it. - if(supportedSubchannel != MmcSubchannel.None) + if (supportedSubchannel != MmcSubchannel.None) { dev.ReadCd(out readBuffer, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false, true, - MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, dev.Timeout, - out _); + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, dev.Timeout, + out _); - byte[] tmpBuf = new byte[subSize]; + var tmpBuf = new byte[subSize]; Array.Copy(readBuffer, SECTOR_SIZE, tmpBuf, 0, subSize); ret = outputPlugin.WriteSectorTag(tmpBuf, 0, SectorTagType.CdSectorSubchannel); - if(!ret) + if (!ret) { - if(force) + if (force) { dumpLog.WriteLine("Error writing subchannel to output image, {0}continuing...", - force ? "" : "not "); + force ? "" : "not "); dumpLog.WriteLine(outputPlugin.ErrorMessage); ErrorMessage?.Invoke("Error writing subchannel to output image, continuing..." + - Environment.NewLine + + Environment.NewLine + outputPlugin.ErrorMessage); } else { StoppingErrorMessage?.Invoke("Error writing subchannel to output image, not continuing..." + - Environment.NewLine + + Environment.NewLine + outputPlugin.ErrorMessage); return; } supportedSubchannel = MmcSubchannel.None; - subSize = 0; - blockSize = SECTOR_SIZE + subSize; - for(int t = 0; t < tracks.Length; t++) tracks[t].TrackSubchannelType = TrackSubchannelType.None; + subSize = 0; + blockSize = SECTOR_SIZE + subSize; + for (var t = 0; t < tracks.Length; t++) tracks[t].TrackSubchannelType = TrackSubchannelType.None; ret = (outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); - if(!ret) + if (!ret) { dumpLog.WriteLine("Error sending tracks to output image, not continuing."); dumpLog.WriteLine(outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error sending tracks to output image, not continuing..." + - Environment.NewLine + + Environment.NewLine + outputPlugin.ErrorMessage); return; } @@ -1040,11 +1060,11 @@ namespace DiscImageChef.Core.Devices.Dumping } // Set track flags - foreach(KeyValuePair kvp in trackFlags) + foreach (var kvp in trackFlags) { - Track track = tracks.FirstOrDefault(t => t.TrackSequence == kvp.Key); + var track = tracks.FirstOrDefault(t => t.TrackSequence == kvp.Key); - if(track.TrackSequence == 0) continue; + if (track.TrackSequence == 0) continue; dumpLog.WriteLine("Setting flags for track {0}...", track.TrackSequence); UpdateStatus?.Invoke($"Setting flags for track {track.TrackSequence}..."); @@ -1052,28 +1072,28 @@ namespace DiscImageChef.Core.Devices.Dumping } // Set MCN - sense = dev.ReadMcn(out string mcn, out _, out _, dev.Timeout, out _); - if(!sense && mcn != null && mcn != "0000000000000") - if(outputPlugin.WriteMediaTag(Encoding.ASCII.GetBytes(mcn), MediaTagType.CD_MCN)) + sense = dev.ReadMcn(out var mcn, out _, out _, dev.Timeout, out _); + if (!sense && mcn != null && mcn != "0000000000000") + if (outputPlugin.WriteMediaTag(Encoding.ASCII.GetBytes(mcn), MediaTagType.CD_MCN)) { UpdateStatus?.Invoke($"Setting disc Media Catalogue Number to {mcn}"); dumpLog.WriteLine("Setting disc Media Catalogue Number to {0}", mcn); } // Set ISRCs - foreach(Track trk in tracks) + foreach (var trk in tracks) { - sense = dev.ReadIsrc((byte)trk.TrackSequence, out string isrc, out _, out _, dev.Timeout, out _); - if(sense || isrc == null || isrc == "000000000000") continue; + sense = dev.ReadIsrc((byte) trk.TrackSequence, out var isrc, out _, out _, dev.Timeout, out _); + if (sense || isrc == null || isrc == "000000000000") continue; - if(!outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc), trk.TrackStartSector, - SectorTagType.CdTrackIsrc)) continue; + if (!outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc), trk.TrackStartSector, + SectorTagType.CdTrackIsrc)) continue; UpdateStatus?.Invoke($"Setting ISRC for track {trk.TrackSequence} to {isrc}"); dumpLog.WriteLine("Setting ISRC for track {0} to {1}", trk.TrackSequence, isrc); } - if(resume.NextBlock > 0) + if (resume.NextBlock > 0) { UpdateStatus?.Invoke($"Resuming from block {resume.NextBlock}."); dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); @@ -1081,36 +1101,39 @@ namespace DiscImageChef.Core.Devices.Dumping double imageWriteDuration = 0; - if(skip < blocksToRead) skip = blocksToRead; - bool newTrim = false; + if (skip < blocksToRead) skip = blocksToRead; + var newTrim = false; - #if DEBUG - foreach(Track trk in tracks) +#if DEBUG + foreach (var trk in tracks) UpdateStatus - ?.Invoke($"Track {trk.TrackSequence} starts at LBA {trk.TrackStartSector} and ends at LBA {trk.TrackEndSector}"); - #endif + ?.Invoke( + $"Track {trk.TrackSequence} starts at LBA {trk.TrackStartSector} and ends at LBA {trk.TrackEndSector}"); +#endif - if(dskType == MediaType.CDIREADY) + if (dskType == MediaType.CDIREADY) { - dumpLog.WriteLine("There will be thousand of errors between track 0 and track 1, that is normal and you can ignore them."); + dumpLog.WriteLine( + "There will be thousand of errors between track 0 and track 1, that is normal and you can ignore them."); UpdateStatus - ?.Invoke("There will be thousand of errors between track 0 and track 1, that is normal and you can ignore them."); + ?.Invoke( + "There will be thousand of errors between track 0 and track 1, that is normal and you can ignore them."); } // Start reading - start = DateTime.UtcNow; - currentSpeed = 0; + start = DateTime.UtcNow; + currentSpeed = 0; sectorSpeedStart = 0; - timeSpeedStart = DateTime.UtcNow; + timeSpeedStart = DateTime.UtcNow; InitProgress?.Invoke(); - for(int t = 0; t < tracks.Length; t++) + for (var t = 0; t < tracks.Length; t++) { dumpLog.WriteLine("Reading track {0}", tracks[t].TrackSequence); - if(resume.NextBlock < tracks[t].TrackStartSector) resume.NextBlock = tracks[t].TrackStartSector; + if (resume.NextBlock < tracks[t].TrackStartSector) resume.NextBlock = tracks[t].TrackStartSector; - for(ulong i = resume.NextBlock; i <= tracks[t].TrackEndSector; i += blocksToRead) + for (var i = resume.NextBlock; i <= tracks[t].TrackEndSector; i += blocksToRead) { - if(aborted) + if (aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); @@ -1120,55 +1143,65 @@ namespace DiscImageChef.Core.Devices.Dumping double cmdDuration = 0; - if(tracks[t].TrackEndSector + 1 - i < blocksToRead) - blocksToRead = (uint)(tracks[t].TrackEndSector + 1 - i); + if (tracks[t].TrackEndSector + 1 - i < blocksToRead) + blocksToRead = (uint) (tracks[t].TrackEndSector + 1 - i); - #pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator - if(currentSpeed > maxSpeed && currentSpeed != 0) maxSpeed = currentSpeed; - if(currentSpeed < minSpeed && currentSpeed != 0) minSpeed = currentSpeed; - #pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator +#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator + if (currentSpeed > maxSpeed && currentSpeed != 0) maxSpeed = currentSpeed; + if (currentSpeed < minSpeed && currentSpeed != 0) minSpeed = currentSpeed; +#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator UpdateProgress - ?.Invoke(string.Format("Reading sector {0} of {1} at track {3} ({2:F3} MiB/sec.)", i, blocks, currentSpeed, tracks[t].TrackSequence), - (long)i, (long)blocks); + ?.Invoke( + string.Format("Reading sector {0} of {1} at track {3} ({2:F3} MiB/sec.)", i, blocks, + currentSpeed, tracks[t].TrackSequence), + (long) i, (long) blocks); - if(readcd) + if (readcd) { - sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)i, blockSize, blocksToRead, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); + sense = dev.ReadCd(out readBuffer, out senseBuf, (uint) i, blockSize, blocksToRead, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, + true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); totalDuration += cmdDuration; } - else if(read16) + else if (read16) + { sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, i, blockSize, 0, - blocksToRead, false, dev.Timeout, out cmdDuration); - else if(read12) - sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)i, - blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration); - else if(read10) - sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)i, - blockSize, 0, (ushort)blocksToRead, dev.Timeout, out cmdDuration); - else if(read6) - sense = dev.Read6(out readBuffer, out senseBuf, (uint)i, blockSize, (byte)blocksToRead, - dev.Timeout, out cmdDuration); + blocksToRead, false, dev.Timeout, out cmdDuration); + } + else if (read12) + { + sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint) i, + blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration); + } + else if (read10) + { + sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint) i, + blockSize, 0, (ushort) blocksToRead, dev.Timeout, out cmdDuration); + } + else if (read6) + { + sense = dev.Read6(out readBuffer, out senseBuf, (uint) i, blockSize, (byte) blocksToRead, + dev.Timeout, out cmdDuration); + } - if(!sense && !dev.Error) + if (!sense && !dev.Error) { mhddLog.Write(i, cmdDuration); ibgLog.Write(i, currentSpeed * 1024); extents.Add(i, blocksToRead, true); - DateTime writeStart = DateTime.Now; - if(supportedSubchannel != MmcSubchannel.None) + var writeStart = DateTime.Now; + if (supportedSubchannel != MmcSubchannel.None) { - byte[] data = new byte[SECTOR_SIZE * blocksToRead]; - byte[] sub = new byte[subSize * blocksToRead]; + var data = new byte[SECTOR_SIZE * blocksToRead]; + var sub = new byte[subSize * blocksToRead]; - for(int b = 0; b < blocksToRead; b++) + for (var b = 0; b < blocksToRead; b++) { - Array.Copy(readBuffer, (int)(0 + b * blockSize), data, SECTOR_SIZE * b, - SECTOR_SIZE); - Array.Copy(readBuffer, (int)(SECTOR_SIZE + b * blockSize), sub, subSize * b, - subSize); + Array.Copy(readBuffer, (int) (0 + b * blockSize), data, SECTOR_SIZE * b, + SECTOR_SIZE); + Array.Copy(readBuffer, (int) (SECTOR_SIZE + b * blockSize), sub, subSize * b, + subSize); } outputPlugin.WriteSectorsLong(data, i, blocksToRead); @@ -1176,19 +1209,25 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - if(supportsLongSectors) outputPlugin.WriteSectorsLong(readBuffer, i, blocksToRead); + if (supportsLongSectors) + { + outputPlugin.WriteSectorsLong(readBuffer, i, blocksToRead); + } else { - if(readBuffer.Length % 2352 == 0) + if (readBuffer.Length % 2352 == 0) { - byte[] data = new byte[2048 * blocksToRead]; + var data = new byte[2048 * blocksToRead]; - for(int b = 0; b < blocksToRead; b++) - Array.Copy(readBuffer, (int)(16 + b * blockSize), data, 2048 * b, 2048); + for (var b = 0; b < blocksToRead; b++) + Array.Copy(readBuffer, (int) (16 + b * blockSize), data, 2048 * b, 2048); outputPlugin.WriteSectors(data, i, blocksToRead); } - else outputPlugin.WriteSectorsLong(readBuffer, i, blocksToRead); + else + { + outputPlugin.WriteSectorsLong(readBuffer, i, blocksToRead); + } } } @@ -1197,52 +1236,55 @@ namespace DiscImageChef.Core.Devices.Dumping else { // TODO: Reset device after X errors - if(stopOnError) return; // TODO: Return more cleanly + if (stopOnError) return; // TODO: Return more cleanly - if(i + skip > blocks) skip = (uint)(blocks - i); + if (i + skip > blocks) skip = (uint) (blocks - i); // Write empty data - DateTime writeStart = DateTime.Now; - if(supportedSubchannel != MmcSubchannel.None) + var writeStart = DateTime.Now; + if (supportedSubchannel != MmcSubchannel.None) { outputPlugin.WriteSectorsLong(new byte[SECTOR_SIZE * skip], i, skip); outputPlugin.WriteSectorsTag(new byte[subSize * skip], i, skip, - SectorTagType.CdSectorSubchannel); + SectorTagType.CdSectorSubchannel); } else { - if(supportsLongSectors) outputPlugin.WriteSectorsLong(new byte[blockSize * skip], i, skip); + if (supportsLongSectors) + { + outputPlugin.WriteSectorsLong(new byte[blockSize * skip], i, skip); + } else { - if(readBuffer.Length % 2352 == 0) - outputPlugin.WriteSectors(new byte[2048 * skip], i, skip); + if (readBuffer.Length % 2352 == 0) + outputPlugin.WriteSectors(new byte[2048 * skip], i, skip); else outputPlugin.WriteSectorsLong(new byte[blockSize * skip], i, skip); } } imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - for(ulong b = i; b < i + skip; b++) resume.BadBlocks.Add(b); + for (var b = i; b < i + skip; b++) resume.BadBlocks.Add(b); DicConsole.DebugWriteLine("Dump-Media", "READ error:\n{0}", Sense.PrettifySense(senseBuf)); mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration); ibgLog.Write(i, 0); dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; - newTrim = true; + i += skip - blocksToRead; + newTrim = true; } sectorSpeedStart += blocksToRead; resume.NextBlock = i + blocksToRead; - double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; - if(elapsed < 1) continue; + var elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; + if (elapsed < 1) continue; - currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); + currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); sectorSpeedStart = 0; - timeSpeedStart = DateTime.UtcNow; + timeSpeedStart = DateTime.UtcNow; } } @@ -1358,31 +1400,34 @@ namespace DiscImageChef.Core.Devices.Dumping end = DateTime.UtcNow; mhddLog.Close(); ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, - blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000), - devicePath); + blockSize * (double) (blocks + 1) / 1024 / (totalDuration / 1000), + devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus - ?.Invoke($"Average dump speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + ?.Invoke( + $"Average dump speed {(double) blockSize * (double) (blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus - ?.Invoke($"Average write speed {(double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + ?.Invoke( + $"Average write speed {(double) blockSize * (double) (blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + (double) blockSize * (double) (blocks + 1) / 1024 / (totalDuration / 1000)); dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration); + (double) blockSize * (double) (blocks + 1) / 1024 / imageWriteDuration); #region Compact Disc Error trimming - if(resume.BadBlocks.Count > 0 && !aborted && !notrim && newTrim) + + if (resume.BadBlocks.Count > 0 && !aborted && !notrim && newTrim) { start = DateTime.UtcNow; UpdateStatus?.Invoke("Trimming bad sectors"); dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + var tmpArray = resume.BadBlocks.ToArray(); InitProgress?.Invoke(); - foreach(ulong badSector in tmpArray) + foreach (var badSector in tmpArray) { - if(aborted) + if (aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); @@ -1394,56 +1439,63 @@ namespace DiscImageChef.Core.Devices.Dumping double cmdDuration = 0; - if(readcd) - sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)badSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); - else if(read16) + if (readcd) + sense = dev.ReadCd(out readBuffer, out senseBuf, (uint) badSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, + true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); + else if (read16) sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, badSector, blockSize, 0, - blocksToRead, false, dev.Timeout, out cmdDuration); - else if(read12) - sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)badSector, - blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration); - else if(read10) - sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)badSector, - blockSize, 0, (ushort)blocksToRead, dev.Timeout, out cmdDuration); - else if(read6) - sense = dev.Read6(out readBuffer, out senseBuf, (uint)badSector, blockSize, (byte)blocksToRead, - dev.Timeout, out cmdDuration); + blocksToRead, false, dev.Timeout, out cmdDuration); + else if (read12) + sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint) badSector, + blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration); + else if (read10) + sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint) badSector, + blockSize, 0, (ushort) blocksToRead, dev.Timeout, out cmdDuration); + else if (read6) + sense = dev.Read6(out readBuffer, out senseBuf, (uint) badSector, blockSize, + (byte) blocksToRead, + dev.Timeout, out cmdDuration); totalDuration += cmdDuration; - if(sense || dev.Error) continue; + if (sense || dev.Error) continue; - if(!sense && !dev.Error) + if (!sense && !dev.Error) { resume.BadBlocks.Remove(badSector); extents.Add(badSector); } - if(supportedSubchannel != MmcSubchannel.None) + if (supportedSubchannel != MmcSubchannel.None) { - byte[] data = new byte[SECTOR_SIZE]; - byte[] sub = new byte[subSize]; - Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE); - Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize); + var data = new byte[SECTOR_SIZE]; + var sub = new byte[subSize]; + Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE); + Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize); outputPlugin.WriteSectorLong(data, badSector); outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); } else { - if(supportsLongSectors) outputPlugin.WriteSectorLong(readBuffer, badSector); + if (supportsLongSectors) + { + outputPlugin.WriteSectorLong(readBuffer, badSector); + } else { - if(readBuffer.Length % 2352 == 0) + if (readBuffer.Length % 2352 == 0) { - byte[] data = new byte[2048]; + var data = new byte[2048]; - for(int b = 0; b < blocksToRead; b++) Array.Copy(readBuffer, 16, data, 0, 2048); + for (var b = 0; b < blocksToRead; b++) Array.Copy(readBuffer, 16, data, 0, 2048); outputPlugin.WriteSector(data, badSector); } - else outputPlugin.WriteSectorLong(readBuffer, badSector); + else + { + outputPlugin.WriteSectorLong(readBuffer, badSector); + } } } } @@ -1453,53 +1505,55 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Trimmming finished in {(end - start).TotalSeconds} seconds."); dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); } + #endregion Compact Disc Error trimming #region Compact Disc Error handling - if(resume.BadBlocks.Count > 0 && !aborted && retryPasses > 0) + + if (resume.BadBlocks.Count > 0 && !aborted && retryPasses > 0) { - int pass = 1; - bool forward = true; - bool runningPersistent = false; + var pass = 1; + var forward = true; + var runningPersistent = false; Modes.ModePage? currentModePage = null; - byte[] md6; - byte[] md10; + byte[] md6; + byte[] md10; - if(persistent) + if (persistent) { Modes.ModePage_01_MMC pgMmc; sense = dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); - if(sense) + dev.Timeout, out _); + if (sense) { sense = dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + dev.Timeout, out _); - if(!sense) + if (!sense) { - Modes.DecodedMode? dcMode10 = + var dcMode10 = Modes.DecodeMode10(readBuffer, PeripheralDeviceTypes.MultiMediaDevice); - if(dcMode10.HasValue) - foreach(Modes.ModePage modePage in dcMode10.Value.Pages) - if(modePage.Page == 0x01 && modePage.Subpage == 0x00) + if (dcMode10.HasValue && dcMode10.Value.Pages != null) + foreach (var modePage in dcMode10.Value.Pages) + if (modePage.Page == 0x01 && modePage.Subpage == 0x00) currentModePage = modePage; } } else { - Modes.DecodedMode? dcMode6 = + var dcMode6 = Modes.DecodeMode6(readBuffer, PeripheralDeviceTypes.MultiMediaDevice); - if(dcMode6.HasValue) - foreach(Modes.ModePage modePage in dcMode6.Value.Pages) - if(modePage.Page == 0x01 && modePage.Subpage == 0x00) + if (dcMode6.HasValue && dcMode6.Value.Pages != null) + foreach (var modePage in dcMode6.Value.Pages) + if (modePage.Page == 0x01 && modePage.Subpage == 0x00) currentModePage = modePage; } - if(currentModePage == null) + if (currentModePage == null) { pgMmc = new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 32, Parameter = 0x00}; currentModePage = new Modes.ModePage @@ -1509,44 +1563,49 @@ namespace DiscImageChef.Core.Devices.Dumping } pgMmc = new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 255, Parameter = 0x20}; - Modes.DecodedMode md = new Modes.DecodedMode + var md = new Modes.DecodedMode { Header = new Modes.ModeHeader(), Pages = new[] { new Modes.ModePage { - Page = 0x01, - Subpage = 0x00, + Page = 0x01, + Subpage = 0x00, PageResponse = Modes.EncodeModePage_01_MMC(pgMmc) } } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, dev.ScsiType); md10 = Modes.EncodeMode10(md, dev.ScsiType); UpdateStatus?.Invoke("Sending MODE SELECT to drive (return damaged blocks)."); dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); - if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + if (sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); - if(sense) + if (sense) { UpdateStatus - ?.Invoke("Drive did not accept MODE SELECT command for persistent error reading, try another drive."); + ?.Invoke( + "Drive did not accept MODE SELECT command for persistent error reading, try another drive."); DicConsole.DebugWriteLine("Error: {0}", Sense.PrettifySense(senseBuf)); - dumpLog.WriteLine("Drive did not accept MODE SELECT command for persistent error reading, try another drive."); + dumpLog.WriteLine( + "Drive did not accept MODE SELECT command for persistent error reading, try another drive."); + } + else + { + runningPersistent = true; } - else runningPersistent = true; } InitProgress?.Invoke(); cdRepeatRetry: - ulong[] tmpArray = resume.BadBlocks.ToArray(); - List sectorsNotEvenPartial = new List(); - foreach(ulong badSector in tmpArray) + var tmpArray = resume.BadBlocks.ToArray(); + var sectorsNotEvenPartial = new List(); + foreach (var badSector in tmpArray) { - if(aborted) + if (aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); dumpLog.WriteLine("Aborted!"); @@ -1554,31 +1613,31 @@ namespace DiscImageChef.Core.Devices.Dumping } PulseProgress?.Invoke(string.Format("Retrying sector {0}, pass {1}, {3}{2}", badSector, pass, - forward ? "forward" : "reverse", - runningPersistent ? "recovering partial data, " : "")); + forward ? "forward" : "reverse", + runningPersistent ? "recovering partial data, " : "")); - if(readcd) + if (readcd) { - sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)badSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, - out double cmdDuration); + sense = dev.ReadCd(out readBuffer, out senseBuf, (uint) badSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, + true, MmcErrorField.None, supportedSubchannel, dev.Timeout, + out var cmdDuration); totalDuration += cmdDuration; } - if(sense || dev.Error) + if (sense || dev.Error) { - if(!runningPersistent) continue; + if (!runningPersistent) continue; - FixedSense? decSense = Sense.DecodeFixed(senseBuf); + var decSense = Sense.DecodeFixed(senseBuf); // MEDIUM ERROR, retry with ignore error below - if(decSense.HasValue && decSense.Value.ASC == 0x11) - if(!sectorsNotEvenPartial.Contains(badSector)) + if (decSense.HasValue && decSense.Value.ASC == 0x11) + if (!sectorsNotEvenPartial.Contains(badSector)) sectorsNotEvenPartial.Add(badSector); } - if(!sense && !dev.Error) + if (!sense && !dev.Error) { resume.BadBlocks.Remove(badSector); extents.Add(badSector); @@ -1587,19 +1646,22 @@ namespace DiscImageChef.Core.Devices.Dumping sectorsNotEvenPartial.Remove(badSector); } - if(supportedSubchannel != MmcSubchannel.None) + if (supportedSubchannel != MmcSubchannel.None) { - byte[] data = new byte[SECTOR_SIZE]; - byte[] sub = new byte[subSize]; - Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE); - Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize); + var data = new byte[SECTOR_SIZE]; + var sub = new byte[subSize]; + Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE); + Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize); outputPlugin.WriteSectorLong(data, badSector); outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); } - else outputPlugin.WriteSectorLong(readBuffer, badSector); + else + { + outputPlugin.WriteSectorLong(readBuffer, badSector); + } } - if(pass < retryPasses && !aborted && resume.BadBlocks.Count > 0) + if (pass < retryPasses && !aborted && resume.BadBlocks.Count > 0) { pass++; forward = !forward; @@ -1611,38 +1673,38 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); // Try to ignore read errors, on some drives this allows to recover partial even if damaged data - if(persistent && sectorsNotEvenPartial.Count > 0) + if (persistent && sectorsNotEvenPartial.Count > 0) { - Modes.ModePage_01_MMC pgMmc = + var pgMmc = new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 255, Parameter = 0x01}; - Modes.DecodedMode md = new Modes.DecodedMode + var md = new Modes.DecodedMode { Header = new Modes.ModeHeader(), Pages = new[] { new Modes.ModePage { - Page = 0x01, - Subpage = 0x00, + Page = 0x01, + Subpage = 0x00, PageResponse = Modes.EncodeModePage_01_MMC(pgMmc) } } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, dev.ScsiType); md10 = Modes.EncodeMode10(md, dev.ScsiType); dumpLog.WriteLine("Sending MODE SELECT to drive (ignore error correction)."); sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); - if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + if (sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); - if(!sense) + if (!sense) { runningPersistent = true; InitProgress?.Invoke(); - foreach(ulong badSector in sectorsNotEvenPartial) + foreach (var badSector in sectorsNotEvenPartial) { - if(aborted) + if (aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); dumpLog.WriteLine("Aborted!"); @@ -1651,36 +1713,39 @@ namespace DiscImageChef.Core.Devices.Dumping PulseProgress?.Invoke($"Trying to get partial data for sector {badSector}"); - if(readcd) + if (readcd) { - sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)badSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, - MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out double cmdDuration); + sense = dev.ReadCd(out readBuffer, out senseBuf, (uint) badSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, dev.Timeout, out var cmdDuration); totalDuration += cmdDuration; } - if(sense || dev.Error) continue; + if (sense || dev.Error) continue; dumpLog.WriteLine("Got partial data for sector {0} in pass {1}.", badSector, pass); - if(supportedSubchannel != MmcSubchannel.None) + if (supportedSubchannel != MmcSubchannel.None) { - byte[] data = new byte[SECTOR_SIZE]; - byte[] sub = new byte[subSize]; - Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE); - Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize); + var data = new byte[SECTOR_SIZE]; + var sub = new byte[subSize]; + Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE); + Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize); outputPlugin.WriteSectorLong(data, badSector); outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); } - else outputPlugin.WriteSectorLong(readBuffer, badSector); + else + { + outputPlugin.WriteSectorLong(readBuffer, badSector); + } } EndProgress?.Invoke(); } } - if(runningPersistent && currentModePage.HasValue) + if (runningPersistent && currentModePage.HasValue) { // TODO: Enable when underlying images support lead-outs /* @@ -1786,27 +1851,28 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); */ - Modes.DecodedMode md = new Modes.DecodedMode + var md = new Modes.DecodedMode { Header = new Modes.ModeHeader(), Pages = new[] {currentModePage.Value} }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, dev.ScsiType); md10 = Modes.EncodeMode10(md, dev.ScsiType); dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); - if(sense) dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + if (sense) dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); } EndProgress?.Invoke(); } + #endregion Compact Disc Error handling // Write media tags to image - if(!aborted) - foreach(KeyValuePair tag in mediaTags) + if (!aborted) + foreach (var tag in mediaTags) { - if(tag.Value is null) + if (tag.Value is null) { DicConsole.ErrorWriteLine("Error: Tag type {0} is null, skipping...", tag.Key); continue; @@ -1814,7 +1880,7 @@ namespace DiscImageChef.Core.Devices.Dumping ret = outputPlugin.WriteMediaTag(tag.Value, tag.Key); - if(ret || force) continue; + if (ret || force) continue; // Cannot write tag to image dumpLog.WriteLine($"Cannot write tag {tag.Key}."); @@ -1823,98 +1889,100 @@ namespace DiscImageChef.Core.Devices.Dumping } resume.BadBlocks.Sort(); - foreach(ulong bad in resume.BadBlocks) dumpLog.WriteLine("Sector {0} could not be read.", bad); + foreach (var bad in resume.BadBlocks) dumpLog.WriteLine("Sector {0} could not be read.", bad); currentTry.Extents = ExtentsConverter.ToMetadata(extents); outputPlugin.SetDumpHardware(resume.Tries); - if(preSidecar != null) outputPlugin.SetCicmMetadata(preSidecar); + if (preSidecar != null) outputPlugin.SetCicmMetadata(preSidecar); dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); - DateTime closeStart = DateTime.Now; + var closeStart = DateTime.Now; outputPlugin.Close(); - DateTime closeEnd = DateTime.Now; + var closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - if(aborted) + if (aborted) { dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if (!nometadata) { dumpLog.WriteLine("Creating sidecar."); - FiltersList filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); - IMediaImage inputPlugin = ImageFormat.Detect(filter); - if(!inputPlugin.Open(filter)) + var filters = new FiltersList(); + var filter = filters.GetFilter(outputPath); + var inputPlugin = ImageFormat.Detect(filter); + if (!inputPlugin.Open(filter)) { StoppingErrorMessage?.Invoke("Could not open created image."); return; } - DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; + var chkStart = DateTime.UtcNow; + sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); + sidecarClass.InitProgressEvent += InitProgress; + sidecarClass.UpdateProgressEvent += UpdateProgress; + sidecarClass.EndProgressEvent += EndProgress; + sidecarClass.InitProgressEvent2 += InitProgress2; sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + sidecarClass.EndProgressEvent2 += EndProgress2; + sidecarClass.UpdateStatusEvent += UpdateStatus; + var sidecar = sidecarClass.Create(); end = DateTime.UtcNow; totalChkDuration = (end - chkStart).TotalMilliseconds; dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + (double) blockSize * (double) (blocks + 1) / 1024 / (totalChkDuration / 1000)); - if(preSidecar != null) + if (preSidecar != null) { preSidecar.OpticalDisc = sidecar.OpticalDisc; - sidecar = preSidecar; + sidecar = preSidecar; } - List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); - if(sidecar.OpticalDisc[0].Track != null) + var filesystems = new List<(ulong start, string type)>(); + if (sidecar.OpticalDisc[0].Track != null) filesystems.AddRange(from xmlTrack in sidecar.OpticalDisc[0].Track - where xmlTrack.FileSystemInformation != null - from partition in xmlTrack.FileSystemInformation - where partition.FileSystems != null - from fileSystem in partition.FileSystems - select (partition.StartSector, fileSystem.Type)); + where xmlTrack.FileSystemInformation != null + from partition in xmlTrack.FileSystemInformation + where partition.FileSystems != null + from fileSystem in partition.FileSystems + select (partition.StartSector, fileSystem.Type)); - if(filesystems.Count > 0) - foreach(var filesystem in filesystems.Select(o => new {o.start, o.type}).Distinct()) + if (filesystems.Count > 0) + foreach (var filesystem in filesystems.Select(o => new {o.start, o.type}).Distinct()) dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); sidecar.OpticalDisc[0].Dimensions = Dimensions.DimensionsFromMediaType(dskType); - CommonTypes.Metadata.MediaType.MediaTypeToString(dskType, out string xmlDskTyp, - out string xmlDskSubTyp); - sidecar.OpticalDisc[0].DiscType = xmlDskTyp; - sidecar.OpticalDisc[0].DiscSubType = xmlDskSubTyp; + CommonTypes.Metadata.MediaType.MediaTypeToString(dskType, out var xmlDskTyp, + out var xmlDskSubTyp); + sidecar.OpticalDisc[0].DiscType = xmlDskTyp; + sidecar.OpticalDisc[0].DiscSubType = xmlDskSubTyp; sidecar.OpticalDisc[0].DumpHardwareArray = resume.Tries.ToArray(); - foreach(KeyValuePair tag in mediaTags) - if(outputPlugin.SupportedMediaTags.Contains(tag.Key)) + foreach (var tag in mediaTags) + if (outputPlugin.SupportedMediaTags.Contains(tag.Key)) AddMediaTagToSidecar(outputPath, tag, ref sidecar); UpdateStatus?.Invoke("Writing metadata sidecar"); - FileStream xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); - XmlSerializer xmlSer = new XmlSerializer(typeof(CICMMetadataType)); + var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); xmlFs.Close(); } UpdateStatus?.Invoke(""); UpdateStatus - ?.Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); + ?.Invoke( + $"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus - ?.Invoke($"Average speed: {(double)blockSize * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + ?.Invoke( + $"Average speed: {(double) blockSize * (double) (blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); diff --git a/DiscImageChef.Core/Devices/Dumping/SBC.cs b/DiscImageChef.Core/Devices/Dumping/SBC.cs index 095fb6814..443bc1d16 100644 --- a/DiscImageChef.Core/Devices/Dumping/SBC.cs +++ b/DiscImageChef.Core/Devices/Dumping/SBC.cs @@ -311,7 +311,7 @@ namespace DiscImageChef.Core.Devices.Dumping return; } } - else if (decMode.HasValue) + else if (decMode?.Pages != null) { var setGeometry = false; @@ -520,7 +520,7 @@ namespace DiscImageChef.Core.Devices.Dumping { var dcMode10 = Modes.DecodeMode10(readBuffer, dev.ScsiType); - if (dcMode10.HasValue) + if (dcMode10.HasValue && dcMode10.Value.Pages != null) foreach (var modePage in dcMode10.Value.Pages) if (modePage.Page == 0x01 && modePage.Subpage == 0x00) currentModePage = modePage; @@ -530,7 +530,7 @@ namespace DiscImageChef.Core.Devices.Dumping { var dcMode6 = Modes.DecodeMode6(readBuffer, dev.ScsiType); - if (dcMode6.HasValue) + if (dcMode6.HasValue && dcMode6.Value.Pages != null) foreach (var modePage in dcMode6.Value.Pages) if (modePage.Page == 0x01 && modePage.Subpage == 0x00) currentModePage = modePage; diff --git a/DiscImageChef.DiscImages/ZZZRawImage/Read.cs b/DiscImageChef.DiscImages/ZZZRawImage/Read.cs index f2f7382ee..9da2efada 100644 --- a/DiscImageChef.DiscImages/ZZZRawImage/Read.cs +++ b/DiscImageChef.DiscImages/ZZZRawImage/Read.cs @@ -41,7 +41,6 @@ using DiscImageChef.CommonTypes.Exceptions; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; -using DiscImageChef.Decoders.ATA; using DiscImageChef.Decoders.CD; using DiscImageChef.Decoders.DVD; using DiscImageChef.Decoders.SCSI; @@ -56,11 +55,11 @@ namespace DiscImageChef.DiscImages { public bool Open(IFilter imageFilter) { - Stream stream = imageFilter.GetDataForkStream(); + var stream = imageFilter.GetDataForkStream(); stream.Seek(0, SeekOrigin.Begin); extension = Path.GetExtension(imageFilter.GetFilename())?.ToLower(); - switch(extension) + switch (extension) { case ".iso" when imageFilter.GetDataForkLength() % 2048 == 0: imageInfo.SectorSize = 2048; @@ -69,13 +68,13 @@ namespace DiscImageChef.DiscImages imageInfo.SectorSize = 256; break; default: - if((extension == ".adf" || extension == ".adl" || extension == ".ssd" || extension == ".dsd") && - (imageFilter.GetDataForkLength() == 163840 || imageFilter.GetDataForkLength() == 327680 || - imageFilter.GetDataForkLength() == 655360)) imageInfo.SectorSize = 256; - else if((extension == ".adf" || extension == ".adl") && imageFilter.GetDataForkLength() == 819200) + if ((extension == ".adf" || extension == ".adl" || extension == ".ssd" || extension == ".dsd") && + (imageFilter.GetDataForkLength() == 163840 || imageFilter.GetDataForkLength() == 327680 || + imageFilter.GetDataForkLength() == 655360)) imageInfo.SectorSize = 256; + else if ((extension == ".adf" || extension == ".adl") && imageFilter.GetDataForkLength() == 819200) imageInfo.SectorSize = 1024; else - switch(imageFilter.GetDataForkLength()) + switch (imageFilter.GetDataForkLength()) { case 242944: case 256256: @@ -85,9 +84,9 @@ namespace DiscImageChef.DiscImages imageInfo.SectorSize = 128; break; case 116480: - case 287488: // T0S0 = 128bps - case 988416: // T0S0 = 128bps - case 995072: // T0S0 = 128bps, T0S1 = 256bps + case 287488: // T0S0 = 128bps + case 988416: // T0S0 = 128bps + case 995072: // T0S0 = 128bps, T0S1 = 256bps case 1021696: // T0S0 = 128bps, T0S1 = 256bps case 232960: case 143360: @@ -96,11 +95,12 @@ namespace DiscImageChef.DiscImages case 102400: case 204800: case 655360: - case 80384: // T0S0 = 128bps + case 80384: // T0S0 = 128bps case 325632: // T0S0 = 128bps, T0S1 = 256bps case 653312: // T0S0 = 128bps, T0S1 = 256bps #region Commodore + case 174848: case 175531: case 196608: @@ -108,6 +108,7 @@ namespace DiscImageChef.DiscImages case 349696: case 351062: case 822400: + #endregion Commodore imageInfo.SectorSize = 256; @@ -115,7 +116,7 @@ namespace DiscImageChef.DiscImages case 81664: imageInfo.SectorSize = 319; break; - case 306432: // T0S0 = 128bps + case 306432: // T0S0 = 128bps case 1146624: // T0S0 = 128bps, T0S1 = 256bps case 1177344: // T0S0 = 128bps, T0S1 = 256bps imageInfo.SectorSize = 512; @@ -138,14 +139,14 @@ namespace DiscImageChef.DiscImages break; } - imageInfo.ImageSize = (ulong)imageFilter.GetDataForkLength(); - imageInfo.CreationTime = imageFilter.GetCreationTime(); + imageInfo.ImageSize = (ulong) imageFilter.GetDataForkLength(); + imageInfo.CreationTime = imageFilter.GetCreationTime(); imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); - imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); - differentTrackZeroSize = false; - rawImageFilter = imageFilter; + imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); + differentTrackZeroSize = false; + rawImageFilter = imageFilter; - switch(imageFilter.GetDataForkLength()) + switch (imageFilter.GetDataForkLength()) { case 242944: imageInfo.Sectors = 1898; @@ -160,63 +161,63 @@ namespace DiscImageChef.DiscImages imageInfo.Sectors = 455; break; case 287488: // T0S0 = 128bps - imageInfo.Sectors = 1136; + imageInfo.Sectors = 1136; differentTrackZeroSize = true; break; case 988416: // T0S0 = 128bps - imageInfo.Sectors = 3874; + imageInfo.Sectors = 3874; differentTrackZeroSize = true; break; case 995072: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 3900; + imageInfo.Sectors = 3900; differentTrackZeroSize = true; break; case 1021696: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 4004; + imageInfo.Sectors = 4004; differentTrackZeroSize = true; break; case 81664: imageInfo.Sectors = 256; break; case 306432: // T0S0 = 128bps - imageInfo.Sectors = 618; + imageInfo.Sectors = 618; differentTrackZeroSize = true; break; case 1146624: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 2272; + imageInfo.Sectors = 2272; differentTrackZeroSize = true; break; case 1177344: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 2332; + imageInfo.Sectors = 2332; differentTrackZeroSize = true; break; case 1222400: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 1236; + imageInfo.Sectors = 1236; differentTrackZeroSize = true; break; case 1304320: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 1316; + imageInfo.Sectors = 1316; differentTrackZeroSize = true; break; case 1255168: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 1268; + imageInfo.Sectors = 1268; differentTrackZeroSize = true; break; case 80384: // T0S0 = 128bps - imageInfo.Sectors = 322; + imageInfo.Sectors = 322; differentTrackZeroSize = true; break; case 325632: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 1280; + imageInfo.Sectors = 1280; differentTrackZeroSize = true; break; case 653312: // T0S0 = 128bps, T0S1 = 256bps - imageInfo.Sectors = 2560; + imageInfo.Sectors = 2560; differentTrackZeroSize = true; break; case 1880064: // IBM XDF, 3,5", real number of sectors - imageInfo.Sectors = 670; - imageInfo.SectorSize = 8192; // Biggest sector size + imageInfo.Sectors = 670; + imageInfo.SectorSize = 8192; // Biggest sector size differentTrackZeroSize = true; break; case 175531: @@ -238,79 +239,81 @@ namespace DiscImageChef.DiscImages imageInfo.MediaType = CalculateDiskType(); - if(imageInfo.ImageSize % 2352 == 0 || imageInfo.ImageSize % 2448 == 0) + if (imageInfo.ImageSize % 2352 == 0 || imageInfo.ImageSize % 2448 == 0) { - byte[] sync = new byte[12]; - byte[] header = new byte[4]; + var sync = new byte[12]; + var header = new byte[4]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(sync, 0, 12); + stream.Read(sync, 0, 12); stream.Read(header, 0, 4); - if(cdSync.SequenceEqual(sync)) + if (cdSync.SequenceEqual(sync)) { - rawCompactDisc = true; - hasSubchannel = imageInfo.ImageSize % 2448 == 0; - imageInfo.Sectors = imageInfo.ImageSize / (ulong)(hasSubchannel ? 2448 : 2352); - imageInfo.MediaType = MediaType.CD; - mode2 = header[3] == 0x02; - imageInfo.SectorSize = (uint)(mode2 ? 2336 : 2048); + rawCompactDisc = true; + hasSubchannel = imageInfo.ImageSize % 2448 == 0; + imageInfo.Sectors = imageInfo.ImageSize / (ulong) (hasSubchannel ? 2448 : 2352); + imageInfo.MediaType = MediaType.CD; + mode2 = header[3] == 0x02; + imageInfo.SectorSize = (uint) (mode2 ? 2336 : 2048); } } // Sharp X68000 SASI hard disks - if(extension == ".hdf") - if(imageInfo.ImageSize % 256 == 0) + if (extension == ".hdf") + if (imageInfo.ImageSize % 256 == 0) { imageInfo.SectorSize = 256; - imageInfo.Sectors = imageInfo.ImageSize / imageInfo.SectorSize; - imageInfo.MediaType = MediaType.GENERIC_HDD; + imageInfo.Sectors = imageInfo.ImageSize / imageInfo.SectorSize; + imageInfo.MediaType = MediaType.GENERIC_HDD; } // Search for known tags - string basename = imageFilter.GetBasePath(); + var basename = imageFilter.GetBasePath(); basename = basename.Substring(0, basename.Length - extension.Length); mediaTags = new Dictionary(); - foreach((MediaTagType tag, string name) sidecar in readWriteSidecars) + foreach (var sidecar in readWriteSidecars) try { - FiltersList filters = new FiltersList(); - IFilter filter = filters.GetFilter(basename + sidecar.name); - if(filter == null || !filter.IsOpened()) continue; + var filters = new FiltersList(); + var filter = filters.GetFilter(basename + sidecar.name); + if (filter == null || !filter.IsOpened()) continue; DicConsole.DebugWriteLine("ZZZRawImage Plugin", "Found media tag {0}", sidecar.tag); - byte[] data = new byte[filter.GetDataForkLength()]; + var data = new byte[filter.GetDataForkLength()]; filter.GetDataForkStream().Read(data, 0, data.Length); mediaTags.Add(sidecar.tag, data); } - catch(IOException) { } + catch (IOException) + { + } // If there are INQUIRY and IDENTIFY tags, it's ATAPI - if(mediaTags.ContainsKey(MediaTagType.SCSI_INQUIRY)) - if(mediaTags.TryGetValue(MediaTagType.ATA_IDENTIFY, out byte[] tag)) + if (mediaTags.ContainsKey(MediaTagType.SCSI_INQUIRY)) + if (mediaTags.TryGetValue(MediaTagType.ATA_IDENTIFY, out var tag)) { mediaTags.Remove(MediaTagType.ATA_IDENTIFY); mediaTags.Add(MediaTagType.ATAPI_IDENTIFY, tag); } // It is a blu-ray - if(mediaTags.ContainsKey(MediaTagType.BD_DI)) + if (mediaTags.ContainsKey(MediaTagType.BD_DI)) { imageInfo.MediaType = MediaType.BDROM; - if(mediaTags.TryGetValue(MediaTagType.DVD_BCA, out byte[] bca)) + if (mediaTags.TryGetValue(MediaTagType.DVD_BCA, out var bca)) { mediaTags.Remove(MediaTagType.DVD_BCA); mediaTags.Add(MediaTagType.BD_BCA, bca); } - if(mediaTags.TryGetValue(MediaTagType.DVDRAM_DDS, out byte[] dds)) + if (mediaTags.TryGetValue(MediaTagType.DVDRAM_DDS, out var dds)) { imageInfo.MediaType = MediaType.BDRE; mediaTags.Remove(MediaTagType.DVDRAM_DDS); mediaTags.Add(MediaTagType.BD_DDS, dds); } - if(mediaTags.TryGetValue(MediaTagType.DVDRAM_SpareArea, out byte[] sai)) + if (mediaTags.TryGetValue(MediaTagType.DVDRAM_SpareArea, out var sai)) { imageInfo.MediaType = MediaType.BDRE; mediaTags.Remove(MediaTagType.DVDRAM_SpareArea); @@ -319,10 +322,10 @@ namespace DiscImageChef.DiscImages } // It is a DVD - if(mediaTags.TryGetValue(MediaTagType.DVD_PFI, out byte[] pfi)) + if (mediaTags.TryGetValue(MediaTagType.DVD_PFI, out var pfi)) { - PFI.PhysicalFormatInformation decPfi = PFI.Decode(pfi).Value; - switch(decPfi.DiskCategory) + var decPfi = PFI.Decode(pfi).Value; + switch (decPfi.DiskCategory) { case DiskCategory.DVDPR: imageInfo.MediaType = MediaType.DVDPR; @@ -368,53 +371,56 @@ namespace DiscImageChef.DiscImages break; } - if((imageInfo.MediaType == MediaType.DVDR || imageInfo.MediaType == MediaType.DVDRW || - imageInfo.MediaType == MediaType.HDDVDR) && - mediaTags.TryGetValue(MediaTagType.DVD_MediaIdentifier, out byte[] mid)) + if ((imageInfo.MediaType == MediaType.DVDR || imageInfo.MediaType == MediaType.DVDRW || + imageInfo.MediaType == MediaType.HDDVDR) && + mediaTags.TryGetValue(MediaTagType.DVD_MediaIdentifier, out var mid)) { mediaTags.Remove(MediaTagType.DVD_MediaIdentifier); mediaTags.Add(MediaTagType.DVDR_MediaIdentifier, mid); } // Check for Xbox - if(mediaTags.TryGetValue(MediaTagType.DVD_DMI, out byte[] dmi)) - if(DMI.IsXbox(dmi) || DMI.IsXbox360(dmi)) - if(DMI.IsXbox(dmi)) imageInfo.MediaType = MediaType.XGD; - else if(DMI.IsXbox360(dmi)) + if (mediaTags.TryGetValue(MediaTagType.DVD_DMI, out var dmi)) + if (DMI.IsXbox(dmi) || DMI.IsXbox360(dmi)) + if (DMI.IsXbox(dmi)) + { + imageInfo.MediaType = MediaType.XGD; + } + else if (DMI.IsXbox360(dmi)) { imageInfo.MediaType = MediaType.XGD2; // All XGD3 all have the same number of blocks - if(imageInfo.Sectors == 25063 || // Locked (or non compatible drive) - imageInfo.Sectors == 4229664 || // Xtreme unlock - imageInfo.Sectors == 4246304) // Wxripper unlock + if (imageInfo.Sectors == 25063 || // Locked (or non compatible drive) + imageInfo.Sectors == 4229664 || // Xtreme unlock + imageInfo.Sectors == 4246304) // Wxripper unlock imageInfo.MediaType = MediaType.XGD3; } } // It's MultiMediaCard or SecureDigital - if(mediaTags.ContainsKey(MediaTagType.SD_CID) || mediaTags.ContainsKey(MediaTagType.SD_CSD) || - mediaTags.ContainsKey(MediaTagType.SD_OCR)) + if (mediaTags.ContainsKey(MediaTagType.SD_CID) || mediaTags.ContainsKey(MediaTagType.SD_CSD) || + mediaTags.ContainsKey(MediaTagType.SD_OCR)) { imageInfo.MediaType = MediaType.SecureDigital; - if(mediaTags.ContainsKey(MediaTagType.MMC_ExtendedCSD) || !mediaTags.ContainsKey(MediaTagType.SD_SCR)) + if (mediaTags.ContainsKey(MediaTagType.MMC_ExtendedCSD) || !mediaTags.ContainsKey(MediaTagType.SD_SCR)) { imageInfo.MediaType = MediaType.MMC; - if(mediaTags.TryGetValue(MediaTagType.SD_CID, out byte[] cid)) + if (mediaTags.TryGetValue(MediaTagType.SD_CID, out var cid)) { mediaTags.Remove(MediaTagType.SD_CID); mediaTags.Add(MediaTagType.MMC_CID, cid); } - if(mediaTags.TryGetValue(MediaTagType.SD_CSD, out byte[] csd)) + if (mediaTags.TryGetValue(MediaTagType.SD_CSD, out var csd)) { mediaTags.Remove(MediaTagType.SD_CSD); mediaTags.Add(MediaTagType.MMC_CSD, csd); } - if(mediaTags.TryGetValue(MediaTagType.SD_OCR, out byte[] ocr)) + if (mediaTags.TryGetValue(MediaTagType.SD_OCR, out var ocr)) { mediaTags.Remove(MediaTagType.SD_OCR); mediaTags.Add(MediaTagType.MMC_OCR, ocr); @@ -423,457 +429,458 @@ namespace DiscImageChef.DiscImages } // It's a compact disc - if(mediaTags.ContainsKey(MediaTagType.CD_FullTOC)) + if (mediaTags.ContainsKey(MediaTagType.CD_FullTOC)) { imageInfo.MediaType = imageInfo.Sectors > 360000 ? MediaType.DDCD : MediaType.CD; // Only CD-R and CD-RW have ATIP - if(mediaTags.TryGetValue(MediaTagType.CD_ATIP, out byte[] atipBuf)) + if (mediaTags.TryGetValue(MediaTagType.CD_ATIP, out var atipBuf)) { - ATIP.CDATIP? atip = ATIP.Decode(atipBuf); - if(atip.HasValue) imageInfo.MediaType = atip.Value.DiscType ? MediaType.CDRW : MediaType.CDR; + var atip = ATIP.Decode(atipBuf); + if (atip.HasValue) imageInfo.MediaType = atip.Value.DiscType ? MediaType.CDRW : MediaType.CDR; } - if(mediaTags.TryGetValue(MediaTagType.Floppy_LeadOut, out byte[] leadout)) + if (mediaTags.TryGetValue(MediaTagType.Floppy_LeadOut, out var leadout)) { mediaTags.Remove(MediaTagType.Floppy_LeadOut); mediaTags.Add(MediaTagType.CD_LeadOut, leadout); } } - switch(imageInfo.MediaType) + switch (imageInfo.MediaType) { case MediaType.ACORN_35_DS_DD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 5; break; case MediaType.ACORN_35_DS_HD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 10; break; case MediaType.ACORN_525_DS_DD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 16; break; case MediaType.ACORN_525_SS_DD_40: - imageInfo.Cylinders = 40; - imageInfo.Heads = 1; + imageInfo.Cylinders = 40; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 16; break; case MediaType.ACORN_525_SS_DD_80: - imageInfo.Cylinders = 80; - imageInfo.Heads = 1; + imageInfo.Cylinders = 80; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 16; break; case MediaType.ACORN_525_SS_SD_40: - imageInfo.Cylinders = 40; - imageInfo.Heads = 1; + imageInfo.Cylinders = 40; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 10; break; case MediaType.ACORN_525_SS_SD_80: - imageInfo.Cylinders = 80; - imageInfo.Heads = 1; + imageInfo.Cylinders = 80; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 10; break; case MediaType.Apple32DS: - imageInfo.Cylinders = 35; - imageInfo.Heads = 2; + imageInfo.Cylinders = 35; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 13; break; case MediaType.Apple32SS: - imageInfo.Cylinders = 36; - imageInfo.Heads = 1; + imageInfo.Cylinders = 36; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 13; break; case MediaType.Apple33DS: - imageInfo.Cylinders = 35; - imageInfo.Heads = 2; + imageInfo.Cylinders = 35; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 16; break; case MediaType.Apple33SS: - imageInfo.Cylinders = 35; - imageInfo.Heads = 2; + imageInfo.Cylinders = 35; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 16; break; case MediaType.AppleSonyDS: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 10; break; case MediaType.AppleSonySS: - imageInfo.Cylinders = 80; - imageInfo.Heads = 1; + imageInfo.Cylinders = 80; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 10; break; case MediaType.ATARI_35_DS_DD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 10; break; case MediaType.ATARI_35_DS_DD_11: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 11; break; case MediaType.ATARI_35_SS_DD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 1; + imageInfo.Cylinders = 80; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 10; break; case MediaType.ATARI_35_SS_DD_11: - imageInfo.Cylinders = 80; - imageInfo.Heads = 1; + imageInfo.Cylinders = 80; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 11; break; case MediaType.ATARI_525_ED: - imageInfo.Cylinders = 40; - imageInfo.Heads = 1; + imageInfo.Cylinders = 40; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 26; break; case MediaType.ATARI_525_SD: - imageInfo.Cylinders = 40; - imageInfo.Heads = 1; + imageInfo.Cylinders = 40; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 18; break; case MediaType.CBM_35_DD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 10; break; case MediaType.CBM_AMIGA_35_DD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 11; break; case MediaType.CBM_AMIGA_35_HD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 22; break; case MediaType.DMF: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 21; break; case MediaType.DOS_35_DS_DD_9: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 9; break; case MediaType.Apricot_35: - imageInfo.Cylinders = 70; - imageInfo.Heads = 2; + imageInfo.Cylinders = 70; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 9; break; case MediaType.DOS_35_ED: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 36; break; case MediaType.DOS_35_HD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 18; break; case MediaType.DOS_35_SS_DD_9: - imageInfo.Cylinders = 80; - imageInfo.Heads = 1; + imageInfo.Cylinders = 80; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 9; break; case MediaType.DOS_525_DS_DD_8: - imageInfo.Cylinders = 40; - imageInfo.Heads = 2; + imageInfo.Cylinders = 40; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 8; break; case MediaType.DOS_525_DS_DD_9: - imageInfo.Cylinders = 40; - imageInfo.Heads = 2; + imageInfo.Cylinders = 40; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 9; break; case MediaType.DOS_525_HD: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 15; break; case MediaType.DOS_525_SS_DD_8: - imageInfo.Cylinders = 40; - imageInfo.Heads = 1; + imageInfo.Cylinders = 40; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 8; break; case MediaType.DOS_525_SS_DD_9: - imageInfo.Cylinders = 40; - imageInfo.Heads = 1; + imageInfo.Cylinders = 40; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 9; break; case MediaType.ECMA_54: - imageInfo.Cylinders = 77; - imageInfo.Heads = 1; + imageInfo.Cylinders = 77; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 26; break; case MediaType.ECMA_59: - imageInfo.Cylinders = 77; - imageInfo.Heads = 2; + imageInfo.Cylinders = 77; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 26; break; case MediaType.ECMA_66: - imageInfo.Cylinders = 35; - imageInfo.Heads = 1; + imageInfo.Cylinders = 35; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 9; break; case MediaType.ECMA_69_8: - imageInfo.Cylinders = 77; - imageInfo.Heads = 2; + imageInfo.Cylinders = 77; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 8; break; case MediaType.ECMA_70: - imageInfo.Cylinders = 40; - imageInfo.Heads = 2; + imageInfo.Cylinders = 40; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 16; break; case MediaType.ECMA_78: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 16; break; case MediaType.ECMA_99_15: - imageInfo.Cylinders = 77; - imageInfo.Heads = 2; + imageInfo.Cylinders = 77; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 15; break; case MediaType.ECMA_99_26: - imageInfo.Cylinders = 77; - imageInfo.Heads = 2; + imageInfo.Cylinders = 77; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 26; break; case MediaType.ECMA_99_8: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 8; break; case MediaType.FDFORMAT_35_DD: - imageInfo.Cylinders = 82; - imageInfo.Heads = 2; + imageInfo.Cylinders = 82; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 10; break; case MediaType.FDFORMAT_35_HD: - imageInfo.Cylinders = 82; - imageInfo.Heads = 2; + imageInfo.Cylinders = 82; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 21; break; case MediaType.FDFORMAT_525_HD: - imageInfo.Cylinders = 82; - imageInfo.Heads = 2; + imageInfo.Cylinders = 82; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 17; break; case MediaType.IBM23FD: - imageInfo.Cylinders = 32; - imageInfo.Heads = 1; + imageInfo.Cylinders = 32; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 8; break; case MediaType.IBM33FD_128: - imageInfo.Cylinders = 73; - imageInfo.Heads = 1; + imageInfo.Cylinders = 73; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 26; break; case MediaType.IBM33FD_256: - imageInfo.Cylinders = 74; - imageInfo.Heads = 1; + imageInfo.Cylinders = 74; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 15; break; case MediaType.IBM33FD_512: - imageInfo.Cylinders = 74; - imageInfo.Heads = 1; + imageInfo.Cylinders = 74; + imageInfo.Heads = 1; imageInfo.SectorsPerTrack = 8; break; case MediaType.IBM43FD_128: - imageInfo.Cylinders = 74; - imageInfo.Heads = 2; + imageInfo.Cylinders = 74; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 26; break; case MediaType.IBM43FD_256: - imageInfo.Cylinders = 74; - imageInfo.Heads = 2; + imageInfo.Cylinders = 74; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 15; break; case MediaType.IBM53FD_1024: - imageInfo.Cylinders = 74; - imageInfo.Heads = 2; + imageInfo.Cylinders = 74; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 8; break; case MediaType.IBM53FD_256: - imageInfo.Cylinders = 74; - imageInfo.Heads = 2; + imageInfo.Cylinders = 74; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 26; break; case MediaType.IBM53FD_512: - imageInfo.Cylinders = 74; - imageInfo.Heads = 2; + imageInfo.Cylinders = 74; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 15; break; case MediaType.NEC_35_TD: - imageInfo.Cylinders = 240; - imageInfo.Heads = 2; + imageInfo.Cylinders = 240; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 38; break; case MediaType.NEC_525_HD: - imageInfo.Cylinders = 77; - imageInfo.Heads = 2; + imageInfo.Cylinders = 77; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 8; break; case MediaType.XDF_35: - imageInfo.Cylinders = 80; - imageInfo.Heads = 2; + imageInfo.Cylinders = 80; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 23; break; // Following ones are what the device itself report, not the physical geometry case MediaType.Jaz: - imageInfo.Cylinders = 1021; - imageInfo.Heads = 64; + imageInfo.Cylinders = 1021; + imageInfo.Heads = 64; imageInfo.SectorsPerTrack = 32; break; case MediaType.PocketZip: - imageInfo.Cylinders = 154; - imageInfo.Heads = 16; + imageInfo.Cylinders = 154; + imageInfo.Heads = 16; imageInfo.SectorsPerTrack = 32; break; case MediaType.LS120: - imageInfo.Cylinders = 963; - imageInfo.Heads = 8; + imageInfo.Cylinders = 963; + imageInfo.Heads = 8; imageInfo.SectorsPerTrack = 32; break; case MediaType.LS240: - imageInfo.Cylinders = 262; - imageInfo.Heads = 32; + imageInfo.Cylinders = 262; + imageInfo.Heads = 32; imageInfo.SectorsPerTrack = 56; break; case MediaType.FD32MB: - imageInfo.Cylinders = 1024; - imageInfo.Heads = 2; + imageInfo.Cylinders = 1024; + imageInfo.Heads = 2; imageInfo.SectorsPerTrack = 32; break; case MediaType.ZIP100: - imageInfo.Cylinders = 96; - imageInfo.Heads = 64; + imageInfo.Cylinders = 96; + imageInfo.Heads = 64; imageInfo.SectorsPerTrack = 32; break; case MediaType.ZIP250: - imageInfo.Cylinders = 239; - imageInfo.Heads = 64; + imageInfo.Cylinders = 239; + imageInfo.Heads = 64; imageInfo.SectorsPerTrack = 32; break; default: - imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); - imageInfo.Heads = 16; + imageInfo.Cylinders = (uint) (imageInfo.Sectors / 16 / 63); + imageInfo.Heads = 16; imageInfo.SectorsPerTrack = 63; break; } // It's SCSI, check tags - if(mediaTags.ContainsKey(MediaTagType.SCSI_INQUIRY)) + if (mediaTags.ContainsKey(MediaTagType.SCSI_INQUIRY)) { - PeripheralDeviceTypes devType = PeripheralDeviceTypes.DirectAccess; - Inquiry.SCSIInquiry? scsiInq = null; - if(mediaTags.TryGetValue(MediaTagType.SCSI_INQUIRY, out byte[] inq)) + var devType = PeripheralDeviceTypes.DirectAccess; + Inquiry.SCSIInquiry? scsiInq = null; + if (mediaTags.TryGetValue(MediaTagType.SCSI_INQUIRY, out var inq)) { scsiInq = Inquiry.Decode(inq); - devType = (PeripheralDeviceTypes)(inq[0] & 0x1F); + devType = (PeripheralDeviceTypes) (inq[0] & 0x1F); } Modes.DecodedMode? decMode = null; - if(mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_6, out byte[] mode6)) + if (mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_6, out var mode6)) decMode = Modes.DecodeMode6(mode6, devType); - else if(mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_10, out byte[] mode10)) + else if (mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_10, out var mode10)) decMode = Modes.DecodeMode10(mode10, devType); - byte mediumType = 0; + byte mediumType = 0; byte densityCode = 0; - if(decMode.HasValue) + if (decMode.HasValue) { - mediumType = (byte)decMode.Value.Header.MediumType; - if(decMode.Value.Header.BlockDescriptors != null && - decMode.Value.Header.BlockDescriptors.Length >= 1) - densityCode = (byte)decMode.Value.Header.BlockDescriptors[0].Density; + mediumType = (byte) decMode.Value.Header.MediumType; + if (decMode.Value.Header.BlockDescriptors != null && + decMode.Value.Header.BlockDescriptors.Length >= 1) + densityCode = (byte) decMode.Value.Header.BlockDescriptors[0].Density; - foreach(Modes.ModePage page in decMode.Value.Pages) - // CD-ROM page - if(page.Page == 0x2A && page.Subpage == 0) - { - if(mediaTags.ContainsKey(MediaTagType.SCSI_MODEPAGE_2A)) - mediaTags.Remove(MediaTagType.SCSI_MODEPAGE_2A); - mediaTags.Add(MediaTagType.SCSI_MODEPAGE_2A, page.PageResponse); - } - // Rigid Disk page - else if(page.Page == 0x04 && page.Subpage == 0) - { - Modes.ModePage_04? mode04 = Modes.DecodeModePage_04(page.PageResponse); - if(!mode04.HasValue) continue; + if (decMode.Value.Pages != null) + foreach (var page in decMode.Value.Pages) + // CD-ROM page + if (page.Page == 0x2A && page.Subpage == 0) + { + if (mediaTags.ContainsKey(MediaTagType.SCSI_MODEPAGE_2A)) + mediaTags.Remove(MediaTagType.SCSI_MODEPAGE_2A); + mediaTags.Add(MediaTagType.SCSI_MODEPAGE_2A, page.PageResponse); + } + // Rigid Disk page + else if (page.Page == 0x04 && page.Subpage == 0) + { + var mode04 = Modes.DecodeModePage_04(page.PageResponse); + if (!mode04.HasValue) continue; - imageInfo.Cylinders = mode04.Value.Cylinders; - imageInfo.Heads = mode04.Value.Heads; - imageInfo.SectorsPerTrack = - (uint)(imageInfo.Sectors / (mode04.Value.Cylinders * mode04.Value.Heads)); - } - // Flexible Disk Page - else if(page.Page == 0x05 && page.Subpage == 0) - { - Modes.ModePage_05? mode05 = Modes.DecodeModePage_05(page.PageResponse); - if(!mode05.HasValue) continue; + imageInfo.Cylinders = mode04.Value.Cylinders; + imageInfo.Heads = mode04.Value.Heads; + imageInfo.SectorsPerTrack = + (uint) (imageInfo.Sectors / (mode04.Value.Cylinders * mode04.Value.Heads)); + } + // Flexible Disk Page + else if (page.Page == 0x05 && page.Subpage == 0) + { + var mode05 = Modes.DecodeModePage_05(page.PageResponse); + if (!mode05.HasValue) continue; - imageInfo.Cylinders = mode05.Value.Cylinders; - imageInfo.Heads = mode05.Value.Heads; - imageInfo.SectorsPerTrack = mode05.Value.SectorsPerTrack; - } + imageInfo.Cylinders = mode05.Value.Cylinders; + imageInfo.Heads = mode05.Value.Heads; + imageInfo.SectorsPerTrack = mode05.Value.SectorsPerTrack; + } } - if(scsiInq.HasValue) + if (scsiInq.HasValue) { imageInfo.DriveManufacturer = VendorString.Prettify(StringHandlers.CToString(scsiInq.Value.VendorIdentification).Trim()); imageInfo.DriveModel = StringHandlers.CToString(scsiInq.Value.ProductIdentification).Trim(); imageInfo.DriveFirmwareRevision = StringHandlers.CToString(scsiInq.Value.ProductRevisionLevel).Trim(); - imageInfo.MediaType = MediaTypeFromScsi.Get((byte)devType, imageInfo.DriveManufacturer, - imageInfo.DriveModel, mediumType, densityCode, - imageInfo.Sectors, imageInfo.SectorSize); + imageInfo.MediaType = MediaTypeFromScsi.Get((byte) devType, imageInfo.DriveManufacturer, + imageInfo.DriveModel, mediumType, densityCode, + imageInfo.Sectors, imageInfo.SectorSize); } - if(imageInfo.MediaType == MediaType.Unknown) + if (imageInfo.MediaType == MediaType.Unknown) imageInfo.MediaType = devType == PeripheralDeviceTypes.OpticalDevice - ? MediaType.UnknownMO - : MediaType.GENERIC_HDD; + ? MediaType.UnknownMO + : MediaType.GENERIC_HDD; } // It's ATA, check tags - if(mediaTags.TryGetValue(MediaTagType.ATA_IDENTIFY, out byte[] identifyBuf)) + if (mediaTags.TryGetValue(MediaTagType.ATA_IDENTIFY, out var identifyBuf)) { - Identify.IdentifyDevice? ataId = Decoders.ATA.Identify.Decode(identifyBuf); - if(ataId.HasValue) + var ataId = Decoders.ATA.Identify.Decode(identifyBuf); + if (ataId.HasValue) { - imageInfo.MediaType = (ushort)ataId.Value.GeneralConfiguration == 0x848A - ? MediaType.CompactFlash - : MediaType.GENERIC_HDD; + imageInfo.MediaType = (ushort) ataId.Value.GeneralConfiguration == 0x848A + ? MediaType.CompactFlash + : MediaType.GENERIC_HDD; - if(ataId.Value.Cylinders == 0 || ataId.Value.Heads == 0 || ataId.Value.SectorsPerTrack == 0) + if (ataId.Value.Cylinders == 0 || ataId.Value.Heads == 0 || ataId.Value.SectorsPerTrack == 0) { - imageInfo.Cylinders = ataId.Value.CurrentCylinders; - imageInfo.Heads = ataId.Value.CurrentHeads; + imageInfo.Cylinders = ataId.Value.CurrentCylinders; + imageInfo.Heads = ataId.Value.CurrentHeads; imageInfo.SectorsPerTrack = ataId.Value.CurrentSectorsPerTrack; } else { - imageInfo.Cylinders = ataId.Value.Cylinders; - imageInfo.Heads = ataId.Value.Heads; + imageInfo.Cylinders = ataId.Value.Cylinders; + imageInfo.Heads = ataId.Value.Heads; imageInfo.SectorsPerTrack = ataId.Value.SectorsPerTrack; } } } - switch(imageInfo.MediaType) + switch (imageInfo.MediaType) { case MediaType.CD: case MediaType.CDRW: @@ -911,20 +918,20 @@ namespace DiscImageChef.DiscImages break; } - if(imageInfo.XmlMediaType == XmlMediaType.OpticalDisc) + if (imageInfo.XmlMediaType == XmlMediaType.OpticalDisc) { - imageInfo.HasSessions = true; + imageInfo.HasSessions = true; imageInfo.HasPartitions = true; } DicConsole.VerboseWriteLine("Raw disk image contains a disk of type {0}", imageInfo.MediaType); - XmlSerializer sidecarXs = new XmlSerializer(typeof(CICMMetadataType)); - if(File.Exists(basename + "cicm.xml")) + var sidecarXs = new XmlSerializer(typeof(CICMMetadataType)); + if (File.Exists(basename + "cicm.xml")) try { - StreamReader sr = new StreamReader(basename + "cicm.xml"); - CicmMetadata = (CICMMetadataType)sidecarXs.Deserialize(sr); + var sr = new StreamReader(basename + "cicm.xml"); + CicmMetadata = (CICMMetadataType) sidecarXs.Deserialize(sr); sr.Close(); } catch @@ -934,81 +941,84 @@ namespace DiscImageChef.DiscImages imageInfo.ReadableMediaTags = new List(mediaTags.Keys); - if(!rawCompactDisc) return true; + if (!rawCompactDisc) return true; - if(hasSubchannel) - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel)) + if (hasSubchannel) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel); - if(mode2) + if (mode2) { - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); } else { - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) + if (!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); } return true; } - public byte[] ReadSector(ulong sectorAddress) => ReadSectors(sectorAddress, 1); + public byte[] ReadSector(ulong sectorAddress) + { + return ReadSectors(sectorAddress, 1); + } public byte[] ReadSectors(ulong sectorAddress, uint length) { - if(differentTrackZeroSize) throw new NotImplementedException("Not yet implemented"); + if (differentTrackZeroSize) throw new NotImplementedException("Not yet implemented"); - if(sectorAddress > imageInfo.Sectors - 1) + if (sectorAddress > imageInfo.Sectors - 1) throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); - if(sectorAddress + length > imageInfo.Sectors) + if (sectorAddress + length > imageInfo.Sectors) throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than available"); - Stream stream = rawImageFilter.GetDataForkStream(); + var stream = rawImageFilter.GetDataForkStream(); uint sectorOffset = 0; - uint sectorSize = imageInfo.SectorSize; - uint sectorSkip = 0; + var sectorSize = imageInfo.SectorSize; + uint sectorSkip = 0; - if(rawCompactDisc) + if (rawCompactDisc) { sectorOffset = 16; - sectorSize = (uint)(mode2 ? 2336 : 2048); - sectorSkip = (uint)(mode2 ? 0 : 288); + sectorSize = (uint) (mode2 ? 2336 : 2048); + sectorSkip = (uint) (mode2 ? 0 : 288); } - if(hasSubchannel) sectorSkip += 96; + if (hasSubchannel) sectorSkip += 96; - byte[] buffer = new byte[sectorSize * length]; + var buffer = new byte[sectorSize * length]; - BinaryReader br = new BinaryReader(stream); - br.BaseStream.Seek((long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); - if(sectorOffset == 0 && sectorSkip == 0) buffer = br.ReadBytes((int)(sectorSize * length)); + var br = new BinaryReader(stream); + br.BaseStream.Seek((long) (sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); + if (sectorOffset == 0 && sectorSkip == 0) buffer = br.ReadBytes((int) (sectorSize * length)); else - for(int i = 0; i < length; i++) + for (var i = 0; i < length; i++) { br.BaseStream.Seek(sectorOffset, SeekOrigin.Current); - byte[] sector = br.ReadBytes((int)sectorSize); + var sector = br.ReadBytes((int) sectorSize); br.BaseStream.Seek(sectorSkip, SeekOrigin.Current); Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } @@ -1018,101 +1028,101 @@ namespace DiscImageChef.DiscImages public List GetSessionTracks(Session session) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(session.SessionSequence != 1) + if (session.SessionSequence != 1) throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported"); - Track trk = new Track + var trk = new Track { - TrackBytesPerSector = (int)imageInfo.SectorSize, - TrackEndSector = imageInfo.Sectors - 1, - TrackFilter = rawImageFilter, - TrackFile = rawImageFilter.GetFilename(), - TrackFileOffset = 0, - TrackFileType = "BINARY", - TrackRawBytesPerSector = (int)imageInfo.SectorSize, - TrackSequence = 1, - TrackStartSector = 0, - TrackSubchannelType = TrackSubchannelType.None, - TrackType = TrackType.Data, - TrackSession = 1 + TrackBytesPerSector = (int) imageInfo.SectorSize, + TrackEndSector = imageInfo.Sectors - 1, + TrackFilter = rawImageFilter, + TrackFile = rawImageFilter.GetFilename(), + TrackFileOffset = 0, + TrackFileType = "BINARY", + TrackRawBytesPerSector = (int) imageInfo.SectorSize, + TrackSequence = 1, + TrackStartSector = 0, + TrackSubchannelType = TrackSubchannelType.None, + TrackType = TrackType.Data, + TrackSession = 1 }; - List lst = new List {trk}; + var lst = new List {trk}; return lst; } public List GetSessionTracks(ushort session) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(session != 1) + if (session != 1) throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported"); - Track trk = new Track + var trk = new Track { - TrackBytesPerSector = (int)imageInfo.SectorSize, - TrackEndSector = imageInfo.Sectors - 1, - TrackFilter = rawImageFilter, - TrackFile = rawImageFilter.GetFilename(), - TrackFileOffset = 0, - TrackFileType = "BINARY", - TrackRawBytesPerSector = (int)imageInfo.SectorSize, - TrackSequence = 1, - TrackStartSector = 0, - TrackSubchannelType = TrackSubchannelType.None, - TrackType = TrackType.Data, - TrackSession = 1 + TrackBytesPerSector = (int) imageInfo.SectorSize, + TrackEndSector = imageInfo.Sectors - 1, + TrackFilter = rawImageFilter, + TrackFile = rawImageFilter.GetFilename(), + TrackFileOffset = 0, + TrackFileType = "BINARY", + TrackRawBytesPerSector = (int) imageInfo.SectorSize, + TrackSequence = 1, + TrackStartSector = 0, + TrackSubchannelType = TrackSubchannelType.None, + TrackType = TrackType.Data, + TrackSession = 1 }; - List lst = new List {trk}; + var lst = new List {trk}; return lst; } public byte[] ReadSector(ulong sectorAddress, uint track) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); + if (track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); return ReadSector(sectorAddress); } public byte[] ReadSectors(ulong sectorAddress, uint length, uint track) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); + if (track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); return ReadSectors(sectorAddress, length); } public byte[] ReadSectorLong(ulong sectorAddress, uint track) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); + if (track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); return ReadSectorsLong(sectorAddress, 1); } public byte[] ReadSectorsLong(ulong sectorAddress, uint length, uint track) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); + if (track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); return ReadSectorsLong(sectorAddress, length); } public byte[] ReadSectorTag(ulong sectorAddress, SectorTagType tag) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); return ReadSectorsTag(sectorAddress, 1, tag); @@ -1120,54 +1130,55 @@ namespace DiscImageChef.DiscImages public byte[] ReadSectorsTag(ulong sectorAddress, uint length, SectorTagType tag) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(sectorAddress > imageInfo.Sectors - 1) + if (sectorAddress > imageInfo.Sectors - 1) throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); - if(sectorAddress + length > imageInfo.Sectors) + if (sectorAddress + length > imageInfo.Sectors) throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than available"); uint sectorOffset; uint sectorSize; uint sectorSkip = 0; - if(!hasSubchannel && tag == SectorTagType.CdSectorSubchannel) + if (!hasSubchannel && tag == SectorTagType.CdSectorSubchannel) throw new ArgumentException("No tags in image for requested track", nameof(tag)); // Requires reading sector - if(mode2) + if (mode2) { - if(tag != SectorTagType.CdSectorSubchannel) + if (tag != SectorTagType.CdSectorSubchannel) throw new FeatureSupportedButNotImplementedImageException("Feature not yet implemented"); sectorOffset = 2352; - sectorSize = 96; + sectorSize = 96; } else - switch(tag) + { + switch (tag) { case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340; + sectorSize = 12; + sectorSkip = 2340; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336; + sectorSize = 4; + sectorSkip = 2336; break; } case SectorTagType.CdSectorSubchannel: { sectorOffset = 2352; - sectorSize = 96; + sectorSize = 96; break; } @@ -1176,49 +1187,50 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorEcc: { sectorOffset = 2076; - sectorSize = 276; - sectorSkip = 0; + sectorSize = 276; + sectorSkip = 0; break; } case SectorTagType.CdSectorEccP: { sectorOffset = 2076; - sectorSize = 172; - sectorSkip = 104; + sectorSize = 172; + sectorSkip = 104; break; } case SectorTagType.CdSectorEccQ: { sectorOffset = 2248; - sectorSize = 104; - sectorSkip = 0; + sectorSize = 104; + sectorSkip = 0; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2064; - sectorSize = 4; - sectorSkip = 284; + sectorSize = 4; + sectorSkip = 284; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); } + } - byte[] buffer = new byte[sectorSize * length]; + var buffer = new byte[sectorSize * length]; - Stream stream = rawImageFilter.GetDataForkStream(); - BinaryReader br = new BinaryReader(stream); - br.BaseStream.Seek((long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); - if(sectorOffset == 0 && sectorSkip == 0) buffer = br.ReadBytes((int)(sectorSize * length)); + var stream = rawImageFilter.GetDataForkStream(); + var br = new BinaryReader(stream); + br.BaseStream.Seek((long) (sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); + if (sectorOffset == 0 && sectorSkip == 0) buffer = br.ReadBytes((int) (sectorSize * length)); else - for(int i = 0; i < length; i++) + for (var i = 0; i < length; i++) { br.BaseStream.Seek(sectorOffset, SeekOrigin.Current); - byte[] sector = br.ReadBytes((int)sectorSize); + var sector = br.ReadBytes((int) sectorSize); br.BaseStream.Seek(sectorSkip, SeekOrigin.Current); Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } @@ -1226,36 +1238,39 @@ namespace DiscImageChef.DiscImages return buffer; } - public byte[] ReadSectorLong(ulong sectorAddress) => ReadSectorsLong(sectorAddress, 1); + public byte[] ReadSectorLong(ulong sectorAddress) + { + return ReadSectorsLong(sectorAddress, 1); + } public byte[] ReadSectorsLong(ulong sectorAddress, uint length) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(sectorAddress > imageInfo.Sectors - 1) + if (sectorAddress > imageInfo.Sectors - 1) throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); - if(sectorAddress + length > imageInfo.Sectors) + if (sectorAddress + length > imageInfo.Sectors) throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than available"); const uint SECTOR_SIZE = 2352; - uint sectorSkip = 0; + uint sectorSkip = 0; - if(hasSubchannel) sectorSkip += 96; + if (hasSubchannel) sectorSkip += 96; - byte[] buffer = new byte[SECTOR_SIZE * length]; + var buffer = new byte[SECTOR_SIZE * length]; - Stream stream = rawImageFilter.GetDataForkStream(); - BinaryReader br = new BinaryReader(stream); + var stream = rawImageFilter.GetDataForkStream(); + var br = new BinaryReader(stream); - br.BaseStream.Seek((long)(sectorAddress * (SECTOR_SIZE + sectorSkip)), SeekOrigin.Begin); + br.BaseStream.Seek((long) (sectorAddress * (SECTOR_SIZE + sectorSkip)), SeekOrigin.Begin); - if(sectorSkip == 0) buffer = br.ReadBytes((int)(SECTOR_SIZE * length)); + if (sectorSkip == 0) buffer = br.ReadBytes((int) (SECTOR_SIZE * length)); else - for(int i = 0; i < length; i++) + for (var i = 0; i < length; i++) { - byte[] sector = br.ReadBytes((int)SECTOR_SIZE); + var sector = br.ReadBytes((int) SECTOR_SIZE); br.BaseStream.Seek(sectorSkip, SeekOrigin.Current); Array.Copy(sector, 0, buffer, i * SECTOR_SIZE, SECTOR_SIZE); @@ -1266,27 +1281,27 @@ namespace DiscImageChef.DiscImages public byte[] ReadDiskTag(MediaTagType tag) { - if(mediaTags.TryGetValue(tag, out byte[] data)) return data; + if (mediaTags.TryGetValue(tag, out var data)) return data; throw new FeatureNotPresentImageException("Requested tag is not present in image"); } public byte[] ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); + if (track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); return ReadSectorsTag(sectorAddress, 1, track, tag); } public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag) { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) + if (imageInfo.XmlMediaType != XmlMediaType.OpticalDisc || !rawCompactDisc) throw new FeatureUnsupportedImageException("Feature not supported by image format"); - if(track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); + if (track != 1) throw new ArgumentOutOfRangeException(nameof(track), "Only a single track is supported"); return ReadSectorsTag(sectorAddress, length, tag); } diff --git a/DiscImageChef.Gui/Tabs/tabScsiInfo.xeto.cs b/DiscImageChef.Gui/Tabs/tabScsiInfo.xeto.cs index 445ce5b36..7d13ca8c4 100644 --- a/DiscImageChef.Gui/Tabs/tabScsiInfo.xeto.cs +++ b/DiscImageChef.Gui/Tabs/tabScsiInfo.xeto.cs @@ -44,51 +44,51 @@ namespace DiscImageChef.Gui.Tabs { public class tabScsiInfo : TabPage { - byte[] configuration; - Dictionary evpdPages; - Inquiry.SCSIInquiry? inquiry; - byte[] inquiryData; - Modes.DecodedMode? mode; - byte[] modeSense10; - byte[] modeSense6; - PeripheralDeviceTypes type; + private byte[] configuration; + private Dictionary evpdPages; + private Inquiry.SCSIInquiry? inquiry; + private byte[] inquiryData; + private Modes.DecodedMode? mode; + private byte[] modeSense10; + private byte[] modeSense6; + private PeripheralDeviceTypes type; public tabScsiInfo() { XamlReader.Load(this); } - internal void LoadData(byte[] scsiInquiryData, Inquiry.SCSIInquiry? scsiInquiry, - Dictionary scsiEvpdPages, Modes.DecodedMode? scsiMode, - PeripheralDeviceTypes scsiType, byte[] scsiModeSense6, - byte[] scsiModeSense10, - byte[] mmcConfiguration) + internal void LoadData(byte[] scsiInquiryData, Inquiry.SCSIInquiry? scsiInquiry, + Dictionary scsiEvpdPages, Modes.DecodedMode? scsiMode, + PeripheralDeviceTypes scsiType, byte[] scsiModeSense6, + byte[] scsiModeSense10, + byte[] mmcConfiguration) { - inquiryData = scsiInquiryData; - inquiry = scsiInquiry; - evpdPages = scsiEvpdPages; - mode = scsiMode; - type = scsiType; - modeSense6 = scsiModeSense6; - modeSense10 = scsiModeSense10; + inquiryData = scsiInquiryData; + inquiry = scsiInquiry; + evpdPages = scsiEvpdPages; + mode = scsiMode; + type = scsiType; + modeSense6 = scsiModeSense6; + modeSense10 = scsiModeSense10; configuration = mmcConfiguration; - if(inquiryData == null || !inquiry.HasValue) return; + if (inquiryData == null || !inquiry.HasValue) return; - Visible = true; + Visible = true; txtScsiInquiry.Text = Inquiry.Prettify(inquiry); - if(mode.HasValue) + if (mode.HasValue) { tabScsiModeSense.Visible = true; - TreeGridItemCollection modePagesList = new TreeGridItemCollection(); + var modePagesList = new TreeGridItemCollection(); treeModeSensePages.Columns.Add(new GridColumn {HeaderText = "Page", DataCell = new TextBoxCell(0)}); treeModeSensePages.AllowMultipleSelection = false; - treeModeSensePages.ShowHeader = false; - treeModeSensePages.DataStore = modePagesList; + treeModeSensePages.ShowHeader = false; + treeModeSensePages.DataStore = modePagesList; modePagesList.Add(new TreeGridItem { @@ -98,404 +98,408 @@ namespace DiscImageChef.Gui.Tabs } }); - foreach(Modes.ModePage page in mode.Value.Pages.OrderBy(t => t.Page).ThenBy(t => t.Subpage)) - { - string pageNumberText = page.Subpage == 0 - ? $"MODE {page.Page:X2}h" - : $"MODE {page.Page:X2} Subpage {page.Subpage:X2}"; - string decodedText; - - switch(page.Page) + if (mode.Value.Pages != null) + foreach (var page in mode.Value.Pages.OrderBy(t => t.Page).ThenBy(t => t.Subpage)) { - case 0x00: - { - if(type == PeripheralDeviceTypes.MultiMediaDevice && page.Subpage == 0) - decodedText = Modes.PrettifyModePage_00_SFF(page.PageResponse); - else decodedText = "Undecoded"; + var pageNumberText = page.Subpage == 0 + ? $"MODE {page.Page:X2}h" + : $"MODE {page.Page:X2} Subpage {page.Subpage:X2}"; + string decodedText; - break; - } - case 0x01: + switch (page.Page) { - if(page.Subpage == 0) - decodedText = type == PeripheralDeviceTypes.MultiMediaDevice - ? Modes.PrettifyModePage_01_MMC(page.PageResponse) - : Modes.PrettifyModePage_01(page.PageResponse); - else goto default; + case 0x00: + { + if (type == PeripheralDeviceTypes.MultiMediaDevice && page.Subpage == 0) + decodedText = Modes.PrettifyModePage_00_SFF(page.PageResponse); + else decodedText = "Undecoded"; - break; - } - case 0x02: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_02(page.PageResponse); - else goto default; + break; + } + case 0x01: + { + if (page.Subpage == 0) + decodedText = type == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_01_MMC(page.PageResponse) + : Modes.PrettifyModePage_01(page.PageResponse); + else goto default; - break; - } - case 0x03: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_03(page.PageResponse); - else goto default; + break; + } + case 0x02: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_02(page.PageResponse); + else goto default; - break; - } - case 0x04: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_04(page.PageResponse); - else goto default; + break; + } + case 0x03: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_03(page.PageResponse); + else goto default; - break; - } - case 0x05: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_05(page.PageResponse); - else goto default; + break; + } + case 0x04: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_04(page.PageResponse); + else goto default; - break; - } - case 0x06: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_06(page.PageResponse); - else goto default; + break; + } + case 0x05: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_05(page.PageResponse); + else goto default; - break; - } - case 0x07: - { - if(page.Subpage == 0) - decodedText = type == PeripheralDeviceTypes.MultiMediaDevice - ? Modes.PrettifyModePage_07_MMC(page.PageResponse) - : Modes.PrettifyModePage_07(page.PageResponse); - else goto default; + break; + } + case 0x06: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_06(page.PageResponse); + else goto default; - break; - } - case 0x08: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_08(page.PageResponse); - else goto default; + break; + } + case 0x07: + { + if (page.Subpage == 0) + decodedText = type == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_07_MMC(page.PageResponse) + : Modes.PrettifyModePage_07(page.PageResponse); + else goto default; - break; - } - case 0x0A: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_0A(page.PageResponse); - else if(page.Subpage == 1) decodedText = Modes.PrettifyModePage_0A_S01(page.PageResponse); - else goto default; + break; + } + case 0x08: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_08(page.PageResponse); + else goto default; - break; - } - case 0x0B: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_0B(page.PageResponse); - else goto default; + break; + } + case 0x0A: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_0A(page.PageResponse); + else if (page.Subpage == 1) + decodedText = Modes.PrettifyModePage_0A_S01(page.PageResponse); + else goto default; - break; - } - case 0x0D: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_0D(page.PageResponse); - else goto default; + break; + } + case 0x0B: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_0B(page.PageResponse); + else goto default; - break; - } - case 0x0E: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_0E(page.PageResponse); - else goto default; + break; + } + case 0x0D: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_0D(page.PageResponse); + else goto default; - break; - } - case 0x0F: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_0F(page.PageResponse); - else goto default; + break; + } + case 0x0E: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_0E(page.PageResponse); + else goto default; - break; - } - case 0x10: - { - if(page.Subpage == 0) - decodedText = type == PeripheralDeviceTypes.SequentialAccess - ? Modes.PrettifyModePage_10_SSC(page.PageResponse) - : Modes.PrettifyModePage_10(page.PageResponse); - else goto default; + break; + } + case 0x0F: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_0F(page.PageResponse); + else goto default; - break; - } - case 0x11: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_11(page.PageResponse); - else goto default; + break; + } + case 0x10: + { + if (page.Subpage == 0) + decodedText = type == PeripheralDeviceTypes.SequentialAccess + ? Modes.PrettifyModePage_10_SSC(page.PageResponse) + : Modes.PrettifyModePage_10(page.PageResponse); + else goto default; - break; - } - case 0x12: - case 0x13: - case 0x14: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_12_13_14(page.PageResponse); - else goto default; + break; + } + case 0x11: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_11(page.PageResponse); + else goto default; - break; - } - case 0x1A: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_1A(page.PageResponse); - else if(page.Subpage == 1) decodedText = Modes.PrettifyModePage_1A_S01(page.PageResponse); - else goto default; + break; + } + case 0x12: + case 0x13: + case 0x14: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_12_13_14(page.PageResponse); + else goto default; - break; - } - case 0x1B: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_1B(page.PageResponse); - else goto default; + break; + } + case 0x1A: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_1A(page.PageResponse); + else if (page.Subpage == 1) + decodedText = Modes.PrettifyModePage_1A_S01(page.PageResponse); + else goto default; - break; - } - case 0x1C: - { - if(page.Subpage == 0) - decodedText = type == PeripheralDeviceTypes.MultiMediaDevice - ? Modes.PrettifyModePage_1C_SFF(page.PageResponse) - : Modes.PrettifyModePage_1C(page.PageResponse); - else if(page.Subpage == 1) decodedText = Modes.PrettifyModePage_1C_S01(page.PageResponse); - else goto default; + break; + } + case 0x1B: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_1B(page.PageResponse); + else goto default; - break; - } - case 0x1D: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_1D(page.PageResponse); - else goto default; + break; + } + case 0x1C: + { + if (page.Subpage == 0) + decodedText = type == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_1C_SFF(page.PageResponse) + : Modes.PrettifyModePage_1C(page.PageResponse); + else if (page.Subpage == 1) + decodedText = Modes.PrettifyModePage_1C_S01(page.PageResponse); + else goto default; - break; - } - case 0x21: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "CERTANCE") - decodedText = Modes.PrettifyCertanceModePage_21(page.PageResponse); - else goto default; + break; + } + case 0x1D: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_1D(page.PageResponse); + else goto default; - break; - } - case 0x22: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "CERTANCE") - decodedText = Modes.PrettifyCertanceModePage_22(page.PageResponse); - else goto default; + break; + } + case 0x21: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "CERTANCE") + decodedText = Modes.PrettifyCertanceModePage_21(page.PageResponse); + else goto default; - break; - } - case 0x24: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") - decodedText = Modes.PrettifyIBMModePage_24(page.PageResponse); - else goto default; + break; + } + case 0x22: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "CERTANCE") + decodedText = Modes.PrettifyCertanceModePage_22(page.PageResponse); + else goto default; - break; - } - case 0x2A: - { - if(page.Subpage == 0) decodedText = Modes.PrettifyModePage_2A(page.PageResponse); - else goto default; + break; + } + case 0x24: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") + decodedText = Modes.PrettifyIBMModePage_24(page.PageResponse); + else goto default; - break; - } - case 0x2F: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") - decodedText = Modes.PrettifyIBMModePage_2F(page.PageResponse); - else goto default; + break; + } + case 0x2A: + { + if (page.Subpage == 0) decodedText = Modes.PrettifyModePage_2A(page.PageResponse); + else goto default; - break; - } - case 0x30: - { - if(Modes.IsAppleModePage_30(page.PageResponse)) - decodedText = "Drive identifies as Apple OEM drive"; - else goto default; + break; + } + case 0x2F: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") + decodedText = Modes.PrettifyIBMModePage_2F(page.PageResponse); + else goto default; - break; - } - case 0x3B: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") - decodedText = Modes.PrettifyHPModePage_3B(page.PageResponse); - else goto default; + break; + } + case 0x30: + { + if (Modes.IsAppleModePage_30(page.PageResponse)) + decodedText = "Drive identifies as Apple OEM drive"; + else goto default; - break; - } - case 0x3C: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") - decodedText = Modes.PrettifyHPModePage_3C(page.PageResponse); - else goto default; + break; + } + case 0x3B: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") + decodedText = Modes.PrettifyHPModePage_3B(page.PageResponse); + else goto default; - break; - } - case 0x3D: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") - decodedText = Modes.PrettifyIBMModePage_3D(page.PageResponse); - else if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") - decodedText = Modes.PrettifyHPModePage_3D(page.PageResponse); - else goto default; + break; + } + case 0x3C: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") + decodedText = Modes.PrettifyHPModePage_3C(page.PageResponse); + else goto default; - break; - } - case 0x3E: - { - if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "FUJITSU") - decodedText = Modes.PrettifyFujitsuModePage_3E(page.PageResponse); - else if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") - decodedText = Modes.PrettifyHPModePage_3E(page.PageResponse); - else goto default; + break; + } + case 0x3D: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") + decodedText = Modes.PrettifyIBMModePage_3D(page.PageResponse); + else if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") + decodedText = Modes.PrettifyHPModePage_3D(page.PageResponse); + else goto default; - break; - } - default: - { - decodedText = "Undecoded"; - break; + break; + } + case 0x3E: + { + if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "FUJITSU") + decodedText = Modes.PrettifyFujitsuModePage_3E(page.PageResponse); + else if (StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") + decodedText = Modes.PrettifyHPModePage_3E(page.PageResponse); + else goto default; + + break; + } + default: + { + decodedText = "Undecoded"; + break; + } } + + // TODO: Automatic error reporting + if (decodedText == null) decodedText = "Error decoding page, please open an issue."; + modePagesList.Add(new TreeGridItem {Values = new object[] {pageNumberText, decodedText}}); } - - // TODO: Automatic error reporting - if(decodedText == null) decodedText = "Error decoding page, please open an issue."; - modePagesList.Add(new TreeGridItem {Values = new object[] {pageNumberText, decodedText}}); - } } - if(evpdPages != null) + if (evpdPages != null) { - tabScsiEvpd.Visible = true; + tabScsiEvpd.Visible = true; treeEvpdPages.ShowHeader = false; - TreeGridItemCollection evpdPagesList = new TreeGridItemCollection(); + var evpdPagesList = new TreeGridItemCollection(); treeEvpdPages.Columns.Add(new GridColumn {HeaderText = "Page", DataCell = new TextBoxCell(0)}); treeEvpdPages.AllowMultipleSelection = false; - treeEvpdPages.ShowHeader = false; - treeEvpdPages.DataStore = evpdPagesList; + treeEvpdPages.ShowHeader = false; + treeEvpdPages.DataStore = evpdPagesList; - foreach(KeyValuePair page in evpdPages.OrderBy(t => t.Key)) + foreach (var page in evpdPages.OrderBy(t => t.Key)) { - string evpdPageTitle = ""; - string evpdDecodedPage = ""; - if(page.Key >= 0x01 && page.Key <= 0x7F) + var evpdPageTitle = ""; + var evpdDecodedPage = ""; + if (page.Key >= 0x01 && page.Key <= 0x7F) { - evpdPageTitle = $"ASCII Page {page.Key:X2}h"; + evpdPageTitle = $"ASCII Page {page.Key:X2}h"; evpdDecodedPage = EVPD.DecodeASCIIPage(page.Value); } - else if(page.Key == 0x80) + else if (page.Key == 0x80) { - evpdPageTitle = "Unit Serial Number"; + evpdPageTitle = "Unit Serial Number"; evpdDecodedPage = EVPD.DecodePage80(page.Value); } - else if(page.Key == 0x81) + else if (page.Key == 0x81) { - evpdPageTitle = "SCSI Implemented operating definitions"; + evpdPageTitle = "SCSI Implemented operating definitions"; evpdDecodedPage = EVPD.PrettifyPage_81(page.Value); } - else if(page.Key == 0x82) + else if (page.Key == 0x82) { - evpdPageTitle = "ASCII implemented operating definitions"; + evpdPageTitle = "ASCII implemented operating definitions"; evpdDecodedPage = EVPD.DecodePage82(page.Value); } - else if(page.Key == 0x83) + else if (page.Key == 0x83) { - evpdPageTitle = "SCSI Device identification"; + evpdPageTitle = "SCSI Device identification"; evpdDecodedPage = EVPD.PrettifyPage_83(page.Value); } - else if(page.Key == 0x84) + else if (page.Key == 0x84) { - evpdPageTitle = "SCSI Software Interface Identifiers"; + evpdPageTitle = "SCSI Software Interface Identifiers"; evpdDecodedPage = EVPD.PrettifyPage_84(page.Value); } - else if(page.Key == 0x85) + else if (page.Key == 0x85) { - evpdPageTitle = "SCSI Management Network Addresses"; + evpdPageTitle = "SCSI Management Network Addresses"; evpdDecodedPage = EVPD.PrettifyPage_85(page.Value); } - else if(page.Key == 0x86) + else if (page.Key == 0x86) { - evpdPageTitle = "SCSI Extended INQUIRY Data"; + evpdPageTitle = "SCSI Extended INQUIRY Data"; evpdDecodedPage = EVPD.PrettifyPage_86(page.Value); } - else if(page.Key == 0x89) + else if (page.Key == 0x89) { - evpdPageTitle = "SCSI to ATA Translation Layer Data"; + evpdPageTitle = "SCSI to ATA Translation Layer Data"; evpdDecodedPage = EVPD.PrettifyPage_89(page.Value); } - else if(page.Key == 0xB0) + else if (page.Key == 0xB0) { - evpdPageTitle = "SCSI Sequential-access Device Capabilities"; + evpdPageTitle = "SCSI Sequential-access Device Capabilities"; evpdDecodedPage = EVPD.PrettifyPage_B0(page.Value); } - else if(page.Key == 0xB1) + else if (page.Key == 0xB1) { - evpdPageTitle = "Manufacturer-assigned Serial Number"; + evpdPageTitle = "Manufacturer-assigned Serial Number"; evpdDecodedPage = EVPD.DecodePageB1(page.Value); } - else if(page.Key == 0xB2) + else if (page.Key == 0xB2) { - evpdPageTitle = "TapeAlert Supported Flags Bitmap"; + evpdPageTitle = "TapeAlert Supported Flags Bitmap"; evpdDecodedPage = $"0x{EVPD.DecodePageB2(page.Value):X16}"; } - else if(page.Key == 0xB3) + else if (page.Key == 0xB3) { - evpdPageTitle = "Automation Device Serial Number"; + evpdPageTitle = "Automation Device Serial Number"; evpdDecodedPage = EVPD.DecodePageB3(page.Value); } - else if(page.Key == 0xB4) + else if (page.Key == 0xB4) { - evpdPageTitle = "Data Transfer Device Element Address"; + evpdPageTitle = "Data Transfer Device Element Address"; evpdDecodedPage = EVPD.DecodePageB4(page.Value); } - else if(page.Key == 0xC0 && - StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == - "quantum") + else if (page.Key == 0xC0 && + StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == + "quantum") { - evpdPageTitle = "Quantum Firmware Build Information page"; + evpdPageTitle = "Quantum Firmware Build Information page"; evpdDecodedPage = EVPD.PrettifyPage_C0_Quantum(page.Value); } - else if(page.Key == 0xC0 && - StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == - "seagate") + else if (page.Key == 0xC0 && + StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == + "seagate") { - evpdPageTitle = "Seagate Firmware Numbers page"; + evpdPageTitle = "Seagate Firmware Numbers page"; evpdDecodedPage = EVPD.PrettifyPage_C0_Seagate(page.Value); } - else if(page.Key == 0xC0 && - StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == - "ibm") + else if (page.Key == 0xC0 && + StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == + "ibm") { - evpdPageTitle = "IBM Drive Component Revision Levels page"; + evpdPageTitle = "IBM Drive Component Revision Levels page"; evpdDecodedPage = EVPD.PrettifyPage_C0_IBM(page.Value); } - else if(page.Key == 0xC1 && - StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == - "ibm") + else if (page.Key == 0xC1 && + StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == + "ibm") { - evpdPageTitle = "IBM Drive Serial Numbers page"; + evpdPageTitle = "IBM Drive Serial Numbers page"; evpdDecodedPage = EVPD.PrettifyPage_C1_IBM(page.Value); } - else if((page.Key == 0xC0 || page.Key == 0xC1) && - StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == - "certance") + else if ((page.Key == 0xC0 || page.Key == 0xC1) && + StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == + "certance") { - evpdPageTitle = "Certance Drive Component Revision Levels page"; + evpdPageTitle = "Certance Drive Component Revision Levels page"; evpdDecodedPage = EVPD.PrettifyPage_C0_C1_Certance(page.Value); } - else if((page.Key == 0xC2 || page.Key == 0xC3 || page.Key == 0xC4 || page.Key == 0xC5 || - page.Key == 0xC6) && - StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == - "certance") + else if ((page.Key == 0xC2 || page.Key == 0xC3 || page.Key == 0xC4 || page.Key == 0xC5 || + page.Key == 0xC6) && + StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == + "certance") { - switch(page.Key) + switch (page.Key) { case 0xC2: evpdPageTitle = "Head Assembly Serial Number"; @@ -516,12 +520,12 @@ namespace DiscImageChef.Gui.Tabs evpdDecodedPage = EVPD.PrettifyPage_C2_C3_C4_C5_C6_Certance(page.Value); } - else if((page.Key == 0xC0 || page.Key == 0xC1 || page.Key == 0xC2 || page.Key == 0xC3 || - page.Key == 0xC4 || page.Key == 0xC5) && StringHandlers - .CToString(inquiry.Value.VendorIdentification) - .ToLowerInvariant().Trim() == "hp") + else if ((page.Key == 0xC0 || page.Key == 0xC1 || page.Key == 0xC2 || page.Key == 0xC3 || + page.Key == 0xC4 || page.Key == 0xC5) && StringHandlers + .CToString(inquiry.Value.VendorIdentification) + .ToLowerInvariant().Trim() == "hp") { - switch(page.Key) + switch (page.Key) { case 0xC0: evpdPageTitle = "HP Drive Firmware Revision Levels page:"; @@ -545,21 +549,21 @@ namespace DiscImageChef.Gui.Tabs evpdDecodedPage = EVPD.PrettifyPage_C0_to_C5_HP(page.Value); } - else if(page.Key == 0xDF && - StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == - "certance") + else if (page.Key == 0xDF && + StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == + "certance") { - evpdPageTitle = "Certance drive status page"; + evpdPageTitle = "Certance drive status page"; evpdDecodedPage = EVPD.PrettifyPage_DF_Certance(page.Value); } else { - if(page.Key == 0x00) continue; + if (page.Key == 0x00) continue; - evpdPageTitle = $"Page {page.Key:X2}h"; + evpdPageTitle = $"Page {page.Key:X2}h"; evpdDecodedPage = "Undecoded"; DicConsole.DebugWriteLine("Device-Info command", "Found undecoded SCSI VPD page 0x{0:X2}", - page.Key); + page.Key); } evpdPagesList.Add(new TreeGridItem @@ -569,32 +573,32 @@ namespace DiscImageChef.Gui.Tabs } } - if(configuration != null) + if (configuration != null) { tabMmcFeatures.Visible = true; - TreeGridItemCollection featuresList = new TreeGridItemCollection(); + var featuresList = new TreeGridItemCollection(); treeMmcFeatures.Columns.Add(new GridColumn {HeaderText = "Feature", DataCell = new TextBoxCell(0)}); treeMmcFeatures.AllowMultipleSelection = false; - treeMmcFeatures.ShowHeader = false; - treeMmcFeatures.DataStore = featuresList; + treeMmcFeatures.ShowHeader = false; + treeMmcFeatures.DataStore = featuresList; - Features.SeparatedFeatures ftr = Features.Separate(configuration); + var ftr = Features.Separate(configuration); DicConsole.DebugWriteLine("Device-Info command", "GET CONFIGURATION length is {0} bytes", - ftr.DataLength); + ftr.DataLength); DicConsole.DebugWriteLine("Device-Info command", "GET CONFIGURATION current profile is {0:X4}h", - ftr.CurrentProfile); - if(ftr.Descriptors != null) - foreach(Features.FeatureDescriptor desc in ftr.Descriptors) + ftr.CurrentProfile); + if (ftr.Descriptors != null) + foreach (var desc in ftr.Descriptors) { - string featureNumber = $"Feature {desc.Code:X4}h"; + var featureNumber = $"Feature {desc.Code:X4}h"; string featureDescription; DicConsole.DebugWriteLine("Device-Info command", "Feature {0:X4}h", desc.Code); - switch(desc.Code) + switch (desc.Code) { case 0x0000: featureDescription = Features.Prettify_0000(desc.Data); @@ -779,7 +783,7 @@ namespace DiscImageChef.Gui.Tabs } else DicConsole.DebugWriteLine("Device-Info command", - "GET CONFIGURATION returned no feature descriptors"); + "GET CONFIGURATION returned no feature descriptors"); } Invalidate(); @@ -787,13 +791,13 @@ namespace DiscImageChef.Gui.Tabs protected void OnBtnSaveInquiryBinary(object sender, EventArgs e) { - SaveFileDialog dlgSaveBinary = new SaveFileDialog(); + var dlgSaveBinary = new SaveFileDialog(); dlgSaveBinary.Filters.Add(new FileFilter {Extensions = new[] {"*.bin"}, Name = "Binary"}); - DialogResult result = dlgSaveBinary.ShowDialog(this); + var result = dlgSaveBinary.ShowDialog(this); - if(result != DialogResult.Ok) return; + if (result != DialogResult.Ok) return; - FileStream saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); + var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); saveFs.Write(inquiryData, 0, inquiryData.Length); saveFs.Close(); @@ -801,27 +805,27 @@ namespace DiscImageChef.Gui.Tabs protected void OnBtnSaveInquiryText(object sender, EventArgs e) { - SaveFileDialog dlgSaveText = new SaveFileDialog(); + var dlgSaveText = new SaveFileDialog(); dlgSaveText.Filters.Add(new FileFilter {Extensions = new[] {"*.txt"}, Name = "Text"}); - DialogResult result = dlgSaveText.ShowDialog(this); + var result = dlgSaveText.ShowDialog(this); - if(result != DialogResult.Ok) return; + if (result != DialogResult.Ok) return; - FileStream saveFs = new FileStream(dlgSaveText.FileName, FileMode.Create); - StreamWriter saveSw = new StreamWriter(saveFs); + var saveFs = new FileStream(dlgSaveText.FileName, FileMode.Create); + var saveSw = new StreamWriter(saveFs); saveSw.Write(txtScsiInquiry.Text); saveFs.Close(); } protected void OnBtnSaveMode6(object sender, EventArgs e) { - SaveFileDialog dlgSaveBinary = new SaveFileDialog(); + var dlgSaveBinary = new SaveFileDialog(); dlgSaveBinary.Filters.Add(new FileFilter {Extensions = new[] {"*.bin"}, Name = "Binary"}); - DialogResult result = dlgSaveBinary.ShowDialog(this); + var result = dlgSaveBinary.ShowDialog(this); - if(result != DialogResult.Ok) return; + if (result != DialogResult.Ok) return; - FileStream saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); + var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); saveFs.Write(modeSense6, 0, modeSense6.Length); saveFs.Close(); @@ -829,13 +833,13 @@ namespace DiscImageChef.Gui.Tabs protected void OnBtnSaveMode10(object sender, EventArgs e) { - SaveFileDialog dlgSaveBinary = new SaveFileDialog(); + var dlgSaveBinary = new SaveFileDialog(); dlgSaveBinary.Filters.Add(new FileFilter {Extensions = new[] {"*.bin"}, Name = "Binary"}); - DialogResult result = dlgSaveBinary.ShowDialog(this); + var result = dlgSaveBinary.ShowDialog(this); - if(result != DialogResult.Ok) return; + if (result != DialogResult.Ok) return; - FileStream saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); + var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); saveFs.Write(modeSense10, 0, modeSense10.Length); saveFs.Close(); @@ -843,30 +847,30 @@ namespace DiscImageChef.Gui.Tabs protected void OnTreeModePagesSelectedItemChanged(object sender, EventArgs e) { - if(!(treeModeSensePages.SelectedItem is TreeGridItem item)) return; + if (!(treeModeSensePages.SelectedItem is TreeGridItem item)) return; txtModeSensePage.Text = item.Values[1] as string; } protected void OnTreeEvpdPagesSelectedItemChanged(object sender, EventArgs e) { - if(!(treeEvpdPages.SelectedItem is TreeGridItem item)) return; + if (!(treeEvpdPages.SelectedItem is TreeGridItem item)) return; txtEvpdPage.Text = item.Values[1] as string; } protected void OnBtnSaveEvpd(object sender, EventArgs e) { - if(!(treeModeSensePages.SelectedItem is TreeGridItem item)) return; - if(!(item.Values[2] is byte[] data)) return; + if (!(treeModeSensePages.SelectedItem is TreeGridItem item)) return; + if (!(item.Values[2] is byte[] data)) return; - SaveFileDialog dlgSaveBinary = new SaveFileDialog(); + var dlgSaveBinary = new SaveFileDialog(); dlgSaveBinary.Filters.Add(new FileFilter {Extensions = new[] {"*.bin"}, Name = "Binary"}); - DialogResult result = dlgSaveBinary.ShowDialog(this); + var result = dlgSaveBinary.ShowDialog(this); - if(result != DialogResult.Ok) return; + if (result != DialogResult.Ok) return; - FileStream saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); + var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); saveFs.Write(data, 0, data.Length); saveFs.Close(); @@ -874,48 +878,50 @@ namespace DiscImageChef.Gui.Tabs protected void OnTreeMmcFeaturesSelectedItemChanged(object sender, EventArgs e) { - if(!(treeMmcFeatures.SelectedItem is TreeGridItem item)) return; + if (!(treeMmcFeatures.SelectedItem is TreeGridItem item)) return; txtMmcFeature.Text = item.Values[1] as string; } protected void OnBtnSaveMmcFeatures(object sender, EventArgs e) { - SaveFileDialog dlgSaveBinary = new SaveFileDialog(); + var dlgSaveBinary = new SaveFileDialog(); dlgSaveBinary.Filters.Add(new FileFilter {Extensions = new[] {"*.bin"}, Name = "Binary"}); - DialogResult result = dlgSaveBinary.ShowDialog(this); + var result = dlgSaveBinary.ShowDialog(this); - if(result != DialogResult.Ok) return; + if (result != DialogResult.Ok) return; - FileStream saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); + var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); saveFs.Write(configuration, 0, configuration.Length); saveFs.Close(); } #region XAML controls - #pragma warning disable 169 - #pragma warning disable 649 - TabPage tabScsiInquiry; - Label lblScsiInquiry; - TextArea txtScsiInquiry; - Button btnSaveInquiryBinary; - Button btnSaveInquiryText; - TabPage tabScsiModeSense; - TreeGridView treeModeSensePages; - TextArea txtModeSensePage; - Button btnSaveMode6; - Button btnSaveMode10; - TabPage tabScsiEvpd; - TreeGridView treeEvpdPages; - TextArea txtEvpdPage; - Button btnSaveEvpd; - TabPage tabMmcFeatures; - TreeGridView treeMmcFeatures; - TextArea txtMmcFeature; - Button btnSaveMmcFeatures; - #pragma warning restore 169 - #pragma warning restore 649 + +#pragma warning disable 169 +#pragma warning disable 649 + private TabPage tabScsiInquiry; + private Label lblScsiInquiry; + private TextArea txtScsiInquiry; + private Button btnSaveInquiryBinary; + private Button btnSaveInquiryText; + private TabPage tabScsiModeSense; + private TreeGridView treeModeSensePages; + private TextArea txtModeSensePage; + private Button btnSaveMode6; + private Button btnSaveMode10; + private TabPage tabScsiEvpd; + private TreeGridView treeEvpdPages; + private TextArea txtEvpdPage; + private Button btnSaveEvpd; + private TabPage tabMmcFeatures; + private TreeGridView treeMmcFeatures; + private TextArea txtMmcFeature; + private Button btnSaveMmcFeatures; +#pragma warning restore 169 +#pragma warning restore 649 + #endregion } } \ No newline at end of file