Fix detection of CD-i Ready discs when negative offset and drive cannot read negative sectors. Fixes #396

This commit is contained in:
2020-11-08 21:48:22 +00:00
parent 1308b2b17d
commit 146bb0804e

View File

@@ -224,7 +224,7 @@ namespace Aaru.Core.Media.Detection
bool isData = IsData(sector0); bool isData = IsData(sector0);
if(!isData || if(!isData ||
sector0[0xF] != 2) (sector0[0xF] != 2 && sector0[0xF] != 1))
return false; return false;
byte[] testMark = new byte[4]; byte[] testMark = new byte[4];
@@ -406,15 +406,18 @@ namespace Aaru.Core.Media.Detection
if((mediaType == MediaType.CD || mediaType == MediaType.CDROM) && hasDataTrack) if((mediaType == MediaType.CD || mediaType == MediaType.CDROM) && hasDataTrack)
{ {
foreach(uint startAddress in decodedToc. foreach(uint startAddress in decodedToc.Value.TrackDescriptors.
Value.TrackDescriptors. Where(t => t.POINT > 0 && t.POINT <= 0x99 &&
Where(t => t.POINT > 0 && t.POINT <= 0x99 && ((TocControl)(t.CONTROL & 0x0D) ==
((TocControl)(t.CONTROL & 0x0D) == TocControl.DataTrack || TocControl.DataTrack ||
(TocControl)(t.CONTROL & 0x0D) == (TocControl)(t.CONTROL & 0x0D) ==
TocControl.DataTrackIncremental)). TocControl.DataTrackIncremental)).
Select(track => (uint)(((track.PHOUR * 3600 * 75) + Select(track => (uint)(((track.PHOUR * 3600 * 75) +
(track.PMIN * 60 * 75) + (track.PSEC * 75) + (track.PMIN * 60 *
track.PFRAME) - 150) + 16)) 75) +
(track.PSEC * 75) +
track.PFRAME) -
150) + 16))
{ {
sense = dev.ReadCd(out cmdBuf, out _, startAddress, 2352, 1, MmcSectorTypes.AllTypes, false, sense = dev.ReadCd(out cmdBuf, out _, startAddress, 2352, 1, MmcSectorTypes.AllTypes, false,
false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
@@ -456,7 +459,7 @@ namespace Aaru.Core.Media.Detection
uint firstSectorSecondSessionFirstTrack = uint firstSectorSecondSessionFirstTrack =
(uint)(((secondSessionFirstTrackTrack.PHOUR * 3600 * 75) + (uint)(((secondSessionFirstTrackTrack.PHOUR * 3600 * 75) +
(secondSessionFirstTrackTrack.PMIN * 60 * 75) + (secondSessionFirstTrackTrack.PSEC * 75) + (secondSessionFirstTrackTrack.PMIN * 60 * 75) + (secondSessionFirstTrackTrack.PSEC * 75) +
secondSessionFirstTrackTrack.PFRAME) - 150); secondSessionFirstTrackTrack.PFRAME) - 150);
sense = dev.ReadCd(out cmdBuf, out _, firstSectorSecondSessionFirstTrack, 2352, 1, sense = dev.ReadCd(out cmdBuf, out _, firstSectorSecondSessionFirstTrack, 2352, 1,
@@ -530,7 +533,7 @@ namespace Aaru.Core.Media.Detection
if(firstTrack?.POINT == 1) if(firstTrack?.POINT == 1)
{ {
uint firstTrackSector = (uint)(((firstTrack.Value.PHOUR * 3600 * 75) + uint firstTrackSector = (uint)(((firstTrack.Value.PHOUR * 3600 * 75) +
(firstTrack.Value.PMIN * 60 * 75) + (firstTrack.Value.PSEC * 75) + (firstTrack.Value.PMIN * 60 * 75) + (firstTrack.Value.PSEC * 75) +
firstTrack.Value.PFRAME) - 150); firstTrack.Value.PFRAME) - 150);
// Check for hidden data before start of track 1 // Check for hidden data before start of track 1
@@ -587,11 +590,22 @@ namespace Aaru.Core.Media.Detection
lba16 -= sectorsForOffset; lba16 -= sectorsForOffset;
} }
dev.ReadCd(out sector0, out _, (uint)lba0, 2352, (uint)sectorsForOffset + 1, sense = dev.ReadCd(out sector0, out _, (uint)lba0, 2352, (uint)sectorsForOffset + 1,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, MmcSectorTypes.AllTypes, false, false, true,
true, MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _); MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout, out _);
sector0 = DescrambleAndFixOffset(sector0, combinedOffset, sectorsForOffset); // Drive does not support reading negative sectors?
if(sense && lba0 < 0)
{
dev.ReadCd(out sector0, out _, 0, 2352, 2, MmcSectorTypes.AllTypes, false, false,
true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout, out _);
sector0 = DescrambleAndFixOffset(sector0, combinedOffset, sectorsForOffset);
}
else
sector0 = DescrambleAndFixOffset(sector0, combinedOffset, sectorsForOffset);
dev.ReadCd(out byte[] sector16, out _, (uint)lba16, 2352, (uint)sectorsForOffset + 1, dev.ReadCd(out byte[] sector16, out _, (uint)lba16, 2352, (uint)sectorsForOffset + 1,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
@@ -2203,4 +2217,4 @@ namespace Aaru.Core.Media.Detection
} }
} }
} }
} }