mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Fix detection of CD-i Ready discs when negative offset and drive cannot read negative sectors. Fixes #396
This commit is contained in:
@@ -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
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user