Fix detection of version 3 and upper DVD-RW and DVD-RW DL. Fixes #456

This commit is contained in:
2020-11-20 19:29:04 +00:00
parent 8a105cd72d
commit 2ec3b0194d
7 changed files with 84 additions and 88 deletions

View File

@@ -292,7 +292,6 @@ namespace Aaru.Core.Devices.Dumping
UpdateStatus?.Invoke($"PFI:\n{PFI.Prettify(decPfi)}");
// False book types
if(dskType == MediaType.DVDROM)
switch(decPfi.DiskCategory)
{
case DiskCategory.DVDPR:
@@ -324,7 +323,7 @@ namespace Aaru.Core.Devices.Dumping
break;
case DiskCategory.DVDRW:
dskType = decPfi.PartVersion >= 3 ? MediaType.DVDRWDL : MediaType.DVDRW;
dskType = decPfi.PartVersion >= 15 ? MediaType.DVDRWDL : MediaType.DVDRW;
break;
case DiskCategory.HDDVDR:

View File

@@ -553,7 +553,7 @@ namespace Aaru.Core.Media.Info
break;
case DiskCategory.DVDRW:
MediaType = DecodedPfi.Value.PartVersion >= 3 ? MediaType.DVDRWDL
MediaType = DecodedPfi.Value.PartVersion >= 15 ? MediaType.DVDRWDL
: MediaType.DVDRW;
break;
@@ -1307,10 +1307,10 @@ namespace Aaru.Core.Media.Info
AaruConsole.DebugWriteLine("Dump-media command", "Video partition total size: {0} sectors",
totalSize);
ulong l0Video = (PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN) + 1;
ulong l0Video = PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1;
ulong l1Video = (totalSize - l0Video) + 1;
ulong l1Video = totalSize - l0Video + 1;
// Get game partition size
AaruConsole.DebugWriteLine("Dump-media command", "Getting game partition size");
@@ -1374,8 +1374,8 @@ namespace Aaru.Core.Media.Info
totalSize);
ulong middleZone =
(totalSize - ((PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN) + 1) - gameSize) + 1;
totalSize - (PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1) - gameSize + 1;
totalSize = l0Video + l1Video + (middleZone * 2) + gameSize;
ulong layerBreak = l0Video + middleZone + (gameSize / 2);

View File

@@ -286,7 +286,7 @@ namespace Aaru.Core
dskType = MediaType.DVDRDL;
if(dskType == MediaType.DVDRW &&
pfi.Value.PartVersion >= 3)
pfi.Value.PartVersion >= 15)
dskType = MediaType.DVDRWDL;
if(dskType == MediaType.GOD &&
@@ -554,12 +554,12 @@ namespace Aaru.Core
xmlTrk.Image.offsetSpecified = true;
}
xmlTrk.Size = ((xmlTrk.EndSector - xmlTrk.StartSector) + 1) * (ulong)trk.TrackRawBytesPerSector;
xmlTrk.Size = (xmlTrk.EndSector - xmlTrk.StartSector + 1) * (ulong)trk.TrackRawBytesPerSector;
xmlTrk.BytesPerSector = (uint)trk.TrackBytesPerSector;
uint sectorsToRead = 512;
ulong sectors = (xmlTrk.EndSector - xmlTrk.StartSector) + 1;
ulong sectors = xmlTrk.EndSector - xmlTrk.StartSector + 1;
ulong doneSectors = 0;
// If there is only one track, and it's the same as the image file (e.g. ".iso" files), don't re-checksum.
@@ -599,7 +599,7 @@ namespace Aaru.Core
sector = image.ReadSectorsLong(doneSectors, sectorsToRead, xmlTrk.Sequence.TrackNumber);
UpdateProgress2("Hashing sector {0} of {1}", (long)doneSectors,
(long)((trk.TrackEndSector - trk.TrackStartSector) + 1));
(long)(trk.TrackEndSector - trk.TrackStartSector + 1));
doneSectors += sectorsToRead;
}
@@ -609,7 +609,7 @@ namespace Aaru.Core
xmlTrk.Sequence.TrackNumber);
UpdateProgress2("Hashing sector {0} of {1}", (long)doneSectors,
(long)((trk.TrackEndSector - trk.TrackStartSector) + 1));
(long)(trk.TrackEndSector - trk.TrackStartSector + 1));
doneSectors += sectors - doneSectors;
}
@@ -634,7 +634,7 @@ namespace Aaru.Core
},
// TODO: Packed subchannel has different size?
Size = ((xmlTrk.EndSector - xmlTrk.StartSector) + 1) * 96
Size = (xmlTrk.EndSector - xmlTrk.StartSector + 1) * 96
};
switch(trk.TrackSubchannelType)
@@ -664,7 +664,7 @@ namespace Aaru.Core
var subChkWorker = new Checksum();
sectors = (xmlTrk.EndSector - xmlTrk.StartSector) + 1;
sectors = xmlTrk.EndSector - xmlTrk.StartSector + 1;
doneSectors = 0;
InitProgress2();
@@ -687,7 +687,7 @@ namespace Aaru.Core
SectorTagType.CdSectorSubchannel);
UpdateProgress2("Hashing subchannel sector {0} of {1}", (long)doneSectors,
(long)((trk.TrackEndSector - trk.TrackStartSector) + 1));
(long)(trk.TrackEndSector - trk.TrackStartSector + 1));
doneSectors += sectorsToRead;
}
@@ -698,7 +698,7 @@ namespace Aaru.Core
SectorTagType.CdSectorSubchannel);
UpdateProgress2("Hashing subchannel sector {0} of {1}", (long)doneSectors,
(long)((trk.TrackEndSector - trk.TrackStartSector) + 1));
(long)(trk.TrackEndSector - trk.TrackStartSector + 1));
doneSectors += sectors - doneSectors;
}
@@ -801,7 +801,7 @@ namespace Aaru.Core
var xmlPart = new Partition
{
Start = xmlTrk.StartSector,
Length = (xmlTrk.EndSector - xmlTrk.StartSector) + 1,
Length = xmlTrk.EndSector - xmlTrk.StartSector + 1,
Type = xmlTrk.TrackType1.ToString(),
Size = xmlTrk.Size,
Sequence = xmlTrk.Sequence.TrackNumber
@@ -910,8 +910,8 @@ namespace Aaru.Core
if(dskType == MediaType.XGD2 &&
sidecar.OpticalDisc[0].Track.Length == 1)
{
ulong blocks =
(sidecar.OpticalDisc[0].Track[0].EndSector - sidecar.OpticalDisc[0].Track[0].StartSector) + 1;
ulong blocks = sidecar.OpticalDisc[0].Track[0].EndSector - sidecar.OpticalDisc[0].Track[0].StartSector +
1;
if(blocks == 25063 || // Locked (or non compatible drive)
blocks == 4229664 || // Xtreme unlock

View File

@@ -349,7 +349,7 @@ namespace Aaru.DiscImages
session.StartSector = startingTrack.startLba;
session.StartTrack = alcSes.firstTrack;
session.SessionSequence = alcSes.sessionSequence;
session.EndSector = (endingTrack.startLba + endingTrackExtra.sectors) - 1;
session.EndSector = endingTrack.startLba + endingTrackExtra.sectors - 1;
session.EndTrack = alcSes.lastTrack;
Sessions.Add(session);
@@ -416,7 +416,7 @@ namespace Aaru.DiscImages
break;
case DiskCategory.DVDRW:
_imageInfo.MediaType =
pfi0.Value.PartVersion >= 3 ? MediaType.DVDRWDL : MediaType.DVDRW;
pfi0.Value.PartVersion >= 15 ? MediaType.DVDRWDL : MediaType.DVDRW;
break;
case DiskCategory.HDDVDR:

View File

@@ -825,7 +825,7 @@ namespace Aaru.DiscImages
partition.Size = (track.TrackEndSector - track.TrackStartSector) *
(ulong)track.TrackRawBytesPerSector;
partition.Length = (track.TrackEndSector - track.TrackStartSector) + 1;
partition.Length = track.TrackEndSector - track.TrackStartSector + 1;
partition.Sequence = track.TrackSequence;
partition.Offset = offsetBytes;
partition.Start = track.TrackStartSector;
@@ -941,7 +941,7 @@ namespace Aaru.DiscImages
break;
case DiskCategory.DVDRW:
_imageInfo.MediaType = pfi0.Value.PartVersion >= 3 ? MediaType.DVDRWDL : MediaType.DVDRW;
_imageInfo.MediaType = pfi0.Value.PartVersion >= 15 ? MediaType.DVDRWDL : MediaType.DVDRW;
break;
case DiskCategory.HDDVDR:
@@ -1238,8 +1238,7 @@ namespace Aaru.DiscImages
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
from track in Tracks where track.TrackSequence == kvp.Key
where sectorAddress - kvp.Value <
(track.TrackEndSector - track.TrackStartSector) + 1
select kvp)
track.TrackEndSector - track.TrackStartSector + 1 select kvp)
return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key);
throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found");
@@ -1250,8 +1249,7 @@ namespace Aaru.DiscImages
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
from track in Tracks where track.TrackSequence == kvp.Key
where sectorAddress - kvp.Value <
(track.TrackEndSector - track.TrackStartSector) + 1
select kvp)
track.TrackEndSector - track.TrackStartSector + 1 select kvp)
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag);
throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found");
@@ -1275,13 +1273,13 @@ namespace Aaru.DiscImages
if(aaruTrack is null)
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1)
if(length + sectorAddress > aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1)
throw new ArgumentOutOfRangeException(nameof(length),
$"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks");
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1}), won't cross tracks");
DataFileCharacteristics chars = (from characteristics in _filePaths let firstSector =
characteristics.StartLba let lastSector =
(firstSector + characteristics.Sectors) - 1 let wantedSector =
firstSector + characteristics.Sectors - 1 let wantedSector =
(int)(sectorAddress + aaruTrack.TrackStartSector)
where wantedSector >= firstSector && wantedSector <= lastSector
select characteristics).FirstOrDefault();
@@ -1410,13 +1408,13 @@ namespace Aaru.DiscImages
if(aaruTrack is null)
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1)
if(length + sectorAddress > aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1)
throw new ArgumentOutOfRangeException(nameof(length),
$"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks");
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1}), won't cross tracks");
DataFileCharacteristics chars = (from characteristics in _filePaths let firstSector =
characteristics.StartLba let lastSector =
(firstSector + characteristics.Sectors) - 1 let wantedSector =
firstSector + characteristics.Sectors - 1 let wantedSector =
(int)(sectorAddress + aaruTrack.TrackStartSector)
where wantedSector >= firstSector && wantedSector <= lastSector
select characteristics).FirstOrDefault();
@@ -1826,8 +1824,7 @@ namespace Aaru.DiscImages
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
from track in Tracks where track.TrackSequence == kvp.Key
where sectorAddress - kvp.Value <
(track.TrackEndSector - track.TrackStartSector) + 1
select kvp)
track.TrackEndSector - track.TrackStartSector + 1 select kvp)
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key);
throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found");
@@ -1851,13 +1848,13 @@ namespace Aaru.DiscImages
if(aaruTrack is null)
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1)
if(length + sectorAddress > aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1)
throw new ArgumentOutOfRangeException(nameof(length),
$"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks");
$"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector - aaruTrack.TrackStartSector + 1}), won't cross tracks");
DataFileCharacteristics chars = (from characteristics in _filePaths let firstSector =
characteristics.StartLba let lastSector =
(firstSector + characteristics.Sectors) - 1 let wantedSector =
firstSector + characteristics.Sectors - 1 let wantedSector =
(int)(sectorAddress + aaruTrack.TrackStartSector)
where wantedSector >= firstSector && wantedSector <= lastSector
select characteristics).FirstOrDefault();

View File

@@ -398,7 +398,7 @@ namespace Aaru.DiscImages
break;
case DiskCategory.DVDRW:
_imageInfo.MediaType = decPfi.PartVersion >= 3 ? MediaType.DVDRWDL : MediaType.DVDRW;
_imageInfo.MediaType = decPfi.PartVersion >= 15 ? MediaType.DVDRWDL : MediaType.DVDRW;
break;
case DiskCategory.HDDVDR: