From 2c4042fcb69f206582da4dcfd061fee91cb70f98 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 15 Jun 2020 03:39:28 +0100 Subject: [PATCH] Fix reading multisession CloneCD images. --- Aaru.Images/CloneCD/Read.cs | 305 +++++++++++++++++------------------- 1 file changed, 144 insertions(+), 161 deletions(-) diff --git a/Aaru.Images/CloneCD/Read.cs b/Aaru.Images/CloneCD/Read.cs index 27536217a..fe4be9b7b 100644 --- a/Aaru.Images/CloneCD/Read.cs +++ b/Aaru.Images/CloneCD/Read.cs @@ -447,8 +447,6 @@ namespace Aaru.DiscImages TrackSession = descriptor.SessionNumber }; - currentTrack.TrackFileOffset = currentTrack.TrackStartSector * 2352; - // Need to check exact data type later if((TocControl)(descriptor.CONTROL & 0x0D) == TocControl.DataTrack || (TocControl)(descriptor.CONTROL & 0x0D) == TocControl.DataTrackIncremental) @@ -463,169 +461,10 @@ namespace Aaru.DiscImages { currentTrack.TrackSubchannelFile = subFilter.GetFilename(); currentTrack.TrackSubchannelFilter = subFilter; - currentTrack.TrackSubchannelOffset = currentTrack.TrackStartSector * 96; currentTrack.TrackSubchannelType = TrackSubchannelType.Raw; } else currentTrack.TrackSubchannelType = TrackSubchannelType.None; - - if(currentTrack.TrackType == TrackType.Data) - { - byte[] syncTest = new byte[12]; - byte[] sectTest = new byte[2352]; - dataStream.Seek((long)currentTrack.TrackFileOffset, SeekOrigin.Begin); - dataStream.Read(sectTest, 0, 2352); - Array.Copy(sectTest, 0, syncTest, 0, 12); - - if(Sector.SyncMark.SequenceEqual(syncTest)) - { - if(scrambled) - sectTest = Sector.Scramble(sectTest); - - if(sectTest[15] == 1) - { - currentTrack.TrackBytesPerSector = 2048; - currentTrack.TrackType = TrackType.CdMode1; - - if(!imageInfo.ReadableSectorTags. - Contains(SectorTagType.CdSectorSync)) - imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorHeader)) - imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc) - ) - imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc); - - if(!imageInfo.ReadableSectorTags. - Contains(SectorTagType.CdSectorEccP)) - imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP); - - if(!imageInfo.ReadableSectorTags. - Contains(SectorTagType.CdSectorEccQ)) - imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc) - ) - imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); - - if(imageInfo.SectorSize < 2048) - imageInfo.SectorSize = 2048; - } - else if(sectTest[15] == 2) - { - byte[] subHdr1 = new byte[4]; - byte[] subHdr2 = new byte[4]; - byte[] empHdr = new byte[4]; - - Array.Copy(sectTest, 16, subHdr1, 0, 4); - Array.Copy(sectTest, 20, subHdr2, 0, 4); - - if(subHdr1.SequenceEqual(subHdr2) && - !empHdr.SequenceEqual(subHdr1)) - if((subHdr1[2] & 0x20) == 0x20) - { - currentTrack.TrackBytesPerSector = 2324; - currentTrack.TrackType = TrackType.CdMode2Form2; - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorSync)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorSync); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorHeader) - ) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorHeader); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorSubHeader) - ) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorSubHeader); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorEdc)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorEdc); - - if(imageInfo.SectorSize < 2324) - imageInfo.SectorSize = 2324; - } - else - { - currentTrack.TrackBytesPerSector = 2048; - currentTrack.TrackType = TrackType.CdMode2Form1; - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorSync)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorSync); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorHeader) - ) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorHeader); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorSubHeader) - ) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorSubHeader); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorEcc)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorEcc); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorEccP)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorEccP); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorEccQ)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorEccQ); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorEdc)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorEdc); - - if(imageInfo.SectorSize < 2048) - imageInfo.SectorSize = 2048; - } - else - { - currentTrack.TrackBytesPerSector = 2336; - currentTrack.TrackType = TrackType.CdMode2Formless; - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorSync)) - imageInfo.ReadableSectorTags. - Add(SectorTagType.CdSectorSync); - - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType. - CdSectorHeader)) - imageInfo.ReadableSectorTags.Add(SectorTagType. - CdSectorHeader); - - if(imageInfo.SectorSize < 2336) - imageInfo.SectorSize = 2336; - } - } - } - } - else - { - if(imageInfo.SectorSize < 2352) - imageInfo.SectorSize = 2352; - } } break; @@ -669,6 +508,150 @@ namespace Aaru.DiscImages Tracks.Add(currentTrack); } + Track[] tmpTracks = Tracks.OrderBy(t => t.TrackSequence).ToArray(); + + ulong currentDataOffset = 0; + ulong currentSubchannelOffset = 0; + + for(int i = 0; i < tmpTracks.Length; i++) + { + tmpTracks[i].TrackFileOffset = currentDataOffset; + + currentDataOffset += 2352 * ((tmpTracks[i].TrackEndSector - tmpTracks[i].TrackStartSector) + 1); + + if(subFilter != null) + { + tmpTracks[i].TrackSubchannelOffset = currentSubchannelOffset; + + currentSubchannelOffset += + 96 * ((tmpTracks[i].TrackEndSector - tmpTracks[i].TrackStartSector) + 1); + } + + if(tmpTracks[i].TrackType == TrackType.Data) + { + byte[] syncTest = new byte[12]; + byte[] sectTest = new byte[2352]; + dataStream.Seek((long)tmpTracks[i].TrackFileOffset, SeekOrigin.Begin); + dataStream.Read(sectTest, 0, 2352); + Array.Copy(sectTest, 0, syncTest, 0, 12); + + if(Sector.SyncMark.SequenceEqual(syncTest)) + { + if(scrambled) + sectTest = Sector.Scramble(sectTest); + + if(sectTest[15] == 1) + { + tmpTracks[i].TrackBytesPerSector = 2048; + tmpTracks[i].TrackType = TrackType.CdMode1; + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); + + if(imageInfo.SectorSize < 2048) + imageInfo.SectorSize = 2048; + } + else if(sectTest[15] == 2) + { + byte[] subHdr1 = new byte[4]; + byte[] subHdr2 = new byte[4]; + byte[] empHdr = new byte[4]; + + Array.Copy(sectTest, 16, subHdr1, 0, 4); + Array.Copy(sectTest, 20, subHdr2, 0, 4); + + if(subHdr1.SequenceEqual(subHdr2) && + !empHdr.SequenceEqual(subHdr1)) + if((subHdr1[2] & 0x20) == 0x20) + { + tmpTracks[i].TrackBytesPerSector = 2324; + tmpTracks[i].TrackType = TrackType.CdMode2Form2; + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); + + if(imageInfo.SectorSize < 2324) + imageInfo.SectorSize = 2324; + } + else + { + tmpTracks[i].TrackBytesPerSector = 2048; + tmpTracks[i].TrackType = TrackType.CdMode2Form1; + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); + + if(imageInfo.SectorSize < 2048) + imageInfo.SectorSize = 2048; + } + else + { + tmpTracks[i].TrackBytesPerSector = 2336; + tmpTracks[i].TrackType = TrackType.CdMode2Formless; + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); + + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); + + if(imageInfo.SectorSize < 2336) + imageInfo.SectorSize = 2336; + } + } + } + } + else + { + if(imageInfo.SectorSize < 2352) + imageInfo.SectorSize = 2352; + } + } + + Tracks = tmpTracks.ToList(); + if(subFilter != null && !imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);