mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Fix detection of version 3 and upper DVD-RW and DVD-RW DL. Fixes #456
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Submodule Aaru.Decoders updated: a1870c5437...65c2002dfe
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user