mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Check MMC drive profile when dumping, fixes #457
This commit is contained in:
@@ -39,6 +39,7 @@ using Aaru.Checksums;
|
|||||||
using Aaru.CommonTypes;
|
using Aaru.CommonTypes;
|
||||||
using Aaru.Console;
|
using Aaru.Console;
|
||||||
using Aaru.Decoders.CD;
|
using Aaru.Decoders.CD;
|
||||||
|
using Aaru.Decoders.SCSI.MMC;
|
||||||
using Aaru.Decoders.Sega;
|
using Aaru.Decoders.Sega;
|
||||||
using Aaru.Devices;
|
using Aaru.Devices;
|
||||||
using Aaru.Helpers;
|
using Aaru.Helpers;
|
||||||
@@ -178,12 +179,12 @@ namespace Aaru.Core.Media.Detection
|
|||||||
int frame = sector[i + 14];
|
int frame = sector[i + 14];
|
||||||
|
|
||||||
// Convert to binary
|
// Convert to binary
|
||||||
minute = ((minute / 16) * 10) + (minute & 0x0F);
|
minute = (minute / 16 * 10) + (minute & 0x0F);
|
||||||
second = ((second / 16) * 10) + (second & 0x0F);
|
second = (second / 16 * 10) + (second & 0x0F);
|
||||||
frame = ((frame / 16) * 10) + (frame & 0x0F);
|
frame = (frame / 16 * 10) + (frame & 0x0F);
|
||||||
|
|
||||||
// Calculate the first found LBA
|
// Calculate the first found LBA
|
||||||
int lba = ((minute * 60 * 75) + (second * 75) + frame) - 150;
|
int lba = (minute * 60 * 75) + (second * 75) + frame - 150;
|
||||||
|
|
||||||
// Calculate the difference between the found LBA and the requested one
|
// Calculate the difference between the found LBA and the requested one
|
||||||
int diff = wantedLba - lba;
|
int diff = wantedLba - lba;
|
||||||
@@ -298,6 +299,135 @@ namespace Aaru.Core.Media.Detection
|
|||||||
hiddenTrack = false;
|
hiddenTrack = false;
|
||||||
hiddenData = false;
|
hiddenData = false;
|
||||||
|
|
||||||
|
sense = dev.GetConfiguration(out cmdBuf, out _, 0, MmcGetConfigurationRt.Current, dev.Timeout, out _);
|
||||||
|
|
||||||
|
if(!sense)
|
||||||
|
{
|
||||||
|
Features.SeparatedFeatures ftr = Features.Separate(cmdBuf);
|
||||||
|
|
||||||
|
AaruConsole.DebugWriteLine("Media-Info command", "GET CONFIGURATION current profile is {0:X4}h",
|
||||||
|
ftr.CurrentProfile);
|
||||||
|
|
||||||
|
switch(ftr.CurrentProfile)
|
||||||
|
{
|
||||||
|
case 0x0001:
|
||||||
|
mediaType = MediaType.GENERIC_HDD;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0005:
|
||||||
|
mediaType = MediaType.CDMO;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0008:
|
||||||
|
mediaType = MediaType.CD;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0009:
|
||||||
|
mediaType = MediaType.CDR;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x000A:
|
||||||
|
mediaType = MediaType.CDRW;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0010:
|
||||||
|
mediaType = MediaType.DVDROM;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0011:
|
||||||
|
mediaType = MediaType.DVDR;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0012:
|
||||||
|
mediaType = MediaType.DVDRAM;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0013:
|
||||||
|
case 0x0014:
|
||||||
|
mediaType = MediaType.DVDRW;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0015:
|
||||||
|
case 0x0016:
|
||||||
|
mediaType = MediaType.DVDRDL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0017:
|
||||||
|
mediaType = MediaType.DVDRWDL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0018:
|
||||||
|
mediaType = MediaType.DVDDownload;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x001A:
|
||||||
|
mediaType = MediaType.DVDPRW;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x001B:
|
||||||
|
mediaType = MediaType.DVDPR;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0020:
|
||||||
|
mediaType = MediaType.DDCD;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0021:
|
||||||
|
mediaType = MediaType.DDCDR;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0022:
|
||||||
|
mediaType = MediaType.DDCDRW;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x002A:
|
||||||
|
mediaType = MediaType.DVDPRWDL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x002B:
|
||||||
|
mediaType = MediaType.DVDPRDL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0040:
|
||||||
|
mediaType = MediaType.BDROM;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0041:
|
||||||
|
case 0x0042:
|
||||||
|
mediaType = MediaType.BDR;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0043:
|
||||||
|
mediaType = MediaType.BDRE;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0050:
|
||||||
|
mediaType = MediaType.HDDVDROM;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0051:
|
||||||
|
mediaType = MediaType.HDDVDR;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0052:
|
||||||
|
mediaType = MediaType.HDDVDRAM;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0053:
|
||||||
|
mediaType = MediaType.HDDVDRW;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x0058:
|
||||||
|
mediaType = MediaType.HDDVDRDL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x005A:
|
||||||
|
mediaType = MediaType.HDDVDRWDL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(decodedToc?.TrackDescriptors.Any(t => t.SessionNumber == 2) == true)
|
if(decodedToc?.TrackDescriptors.Any(t => t.SessionNumber == 2) == true)
|
||||||
secondSessionFirstTrack = decodedToc.Value.TrackDescriptors.Where(t => t.SessionNumber == 2).
|
secondSessionFirstTrack = decodedToc.Value.TrackDescriptors.Where(t => t.SessionNumber == 2).
|
||||||
Min(t => t.POINT);
|
Min(t => t.POINT);
|
||||||
@@ -341,9 +471,8 @@ namespace Aaru.Core.Media.Detection
|
|||||||
if((TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrack ||
|
if((TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrack ||
|
||||||
(TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrackIncremental)
|
(TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrackIncremental)
|
||||||
{
|
{
|
||||||
uint startAddress =
|
uint startAddress = (uint)((track.PHOUR * 3600 * 75) + (track.PMIN * 60 * 75) +
|
||||||
(uint)(((track.PHOUR * 3600 * 75) + (track.PMIN * 60 * 75) + (track.PSEC * 75) +
|
(track.PSEC * 75) + track.PFRAME - 150);
|
||||||
track.PFRAME) - 150);
|
|
||||||
|
|
||||||
if(startAddress < startOfFirstDataTrack)
|
if(startAddress < startOfFirstDataTrack)
|
||||||
startOfFirstDataTrack = startAddress;
|
startOfFirstDataTrack = startAddress;
|
||||||
@@ -412,12 +541,10 @@ namespace Aaru.Core.Media.Detection
|
|||||||
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 *
|
(track.PMIN * 60 * 75) +
|
||||||
75) +
|
(track.PSEC * 75) +
|
||||||
(track.PSEC * 75) +
|
track.PFRAME - 150) + 16))
|
||||||
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,
|
||||||
@@ -458,9 +585,9 @@ namespace Aaru.Core.Media.Detection
|
|||||||
decodedToc.Value.TrackDescriptors.First(t => t.POINT == secondSessionFirstTrack);
|
decodedToc.Value.TrackDescriptors.First(t => t.POINT == secondSessionFirstTrack);
|
||||||
|
|
||||||
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,
|
||||||
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true,
|
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true,
|
||||||
@@ -532,9 +659,9 @@ 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
|
||||||
if(firstTrackSector > 0)
|
if(firstTrackSector > 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user