Files
Aaru/Aaru.Core/Media/Info/ScsiInfo.cs

1582 lines
70 KiB
C#
Raw Normal View History

2018-09-07 23:26:10 +01:00
// /***************************************************************************
2020-02-27 12:31:25 +00:00
// Aaru Data Preservation Suite
2018-09-07 23:26:10 +01:00
// ----------------------------------------------------------------------------
//
// Filename : ScsiInfo.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Core.
//
// --[ Description ] ----------------------------------------------------------
//
// Retrieves the media info for a SCSI device.
//
// --[ License ] --------------------------------------------------------------
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
2022-02-18 10:02:53 +00:00
// Copyright © 2011-2022 Natalia Portillo
2018-09-07 23:26:10 +01:00
// ****************************************************************************/
2022-03-07 07:36:44 +00:00
using DVDDecryption = Aaru.Decryption.DVD.Dump;
namespace Aaru.Core.Media.Info;
2018-09-07 23:26:10 +01:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
2020-02-27 00:33:26 +00:00
using Aaru.CommonTypes;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Structs.Devices.SCSI;
using Aaru.Console;
2020-02-29 18:03:35 +00:00
using Aaru.Core.Media.Detection;
2020-02-27 00:33:26 +00:00
using Aaru.Decoders.CD;
using Aaru.Decoders.DVD;
using Aaru.Decoders.SCSI;
using Aaru.Decoders.SCSI.MMC;
using Aaru.Decoders.SCSI.SSC;
using Aaru.Decoders.Xbox;
using Aaru.Devices;
using DeviceInfo = Aaru.Core.Devices.Info.DeviceInfo;
using DMI = Aaru.Decoders.Xbox.DMI;
using Inquiry = Aaru.CommonTypes.Structs.Devices.SCSI.Inquiry;
2020-02-27 00:33:26 +00:00
2022-03-06 13:29:38 +00:00
/// <summary>Retrieves information from a SCSI device</summary>
public sealed class ScsiInfo
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
/// <summary>Initializes this class with the specific device, and fills in the information</summary>
/// <param name="dev">Device</param>
public ScsiInfo(Device dev)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
if(dev.Type != DeviceType.SCSI &&
dev.Type != DeviceType.ATAPI)
return;
MediaType = MediaType.Unknown;
MediaInserted = false;
2022-03-07 07:36:44 +00:00
var resets = 0;
2022-03-06 13:29:38 +00:00
bool sense;
byte[] cmdBuf;
byte[] senseBuf;
2022-03-07 07:36:44 +00:00
var containsFloppyPage = false;
var sessions = 1;
var firstTrackLastSession = 1;
2022-03-06 13:29:38 +00:00
if(dev.IsRemovable)
2018-09-07 23:26:10 +01:00
{
2022-03-07 07:36:44 +00:00
deviceGotReset:
2022-03-06 13:29:38 +00:00
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(sense)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
DecodedSense? decSense = Sense.Decode(senseBuf);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(decSense.HasValue)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
// Just retry, for 5 times
if(decSense?.ASC == 0x29)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
resets++;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(resets < 5)
goto deviceGotReset;
}
2020-01-01 18:06:31 +00:00
2022-11-13 19:38:03 +00:00
switch(decSense?.ASC)
2022-03-06 13:29:38 +00:00
{
2022-11-13 19:38:03 +00:00
case 0x3A:
2022-03-06 13:29:38 +00:00
{
2022-11-13 19:38:03 +00:00
var leftRetries = 5;
2018-09-07 23:26:10 +01:00
2022-11-13 19:38:03 +00:00
while(leftRetries > 0)
{
//AaruConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-11-13 19:38:03 +00:00
if(!sense)
break;
2020-01-01 18:06:31 +00:00
2022-11-13 19:38:03 +00:00
leftRetries--;
}
2020-01-01 18:06:31 +00:00
2022-11-13 19:38:03 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Please insert media in drive");
return;
}
2018-09-07 23:26:10 +01:00
2022-11-13 19:38:03 +00:00
break;
}
case 0x04 when decSense?.ASCQ == 0x01:
2022-03-06 13:29:38 +00:00
{
2022-11-13 19:38:03 +00:00
var leftRetries = 10;
2018-09-07 23:26:10 +01:00
2022-11-13 19:38:03 +00:00
while(leftRetries > 0)
{
//AaruConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-11-13 19:38:03 +00:00
if(!sense)
break;
2022-03-06 13:29:38 +00:00
2022-11-13 19:38:03 +00:00
leftRetries--;
}
if(sense)
{
AaruConsole.ErrorWriteLine("Error testing unit was ready:\n{0}",
Sense.PrettifySense(senseBuf));
return;
}
break;
}
default:
2020-02-27 23:48:41 +00:00
AaruConsole.ErrorWriteLine("Error testing unit was ready:\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2020-01-01 18:06:31 +00:00
2018-09-07 23:26:10 +01:00
return;
}
}
2022-03-06 13:29:38 +00:00
else
{
AaruConsole.ErrorWriteLine("Unknown testing unit was ready.");
return;
}
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
MediaInserted = true;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
DeviceInfo = new DeviceInfo(dev);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
byte scsiMediumType = 0;
byte scsiDensityCode = 0;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(DeviceInfo.ScsiMode.HasValue)
{
scsiMediumType = (byte)DeviceInfo.ScsiMode.Value.Header.MediumType;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(DeviceInfo.ScsiMode?.Header.BlockDescriptors?.Length > 0)
scsiDensityCode = (byte)DeviceInfo.ScsiMode.Value.Header.BlockDescriptors[0].Density;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(DeviceInfo.ScsiMode.Value.Pages != null)
containsFloppyPage = DeviceInfo.ScsiMode.Value.Pages.Any(p => p.Page == 0x05);
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
Blocks = 0;
BlockSize = 0;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
switch(dev.ScsiType)
{
case PeripheralDeviceTypes.DirectAccess:
case PeripheralDeviceTypes.MultiMediaDevice:
case PeripheralDeviceTypes.OCRWDevice:
case PeripheralDeviceTypes.OpticalDevice:
case PeripheralDeviceTypes.SimplifiedDevice:
case PeripheralDeviceTypes.WriteOnceDevice:
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _);
2022-03-06 13:29:38 +00:00
if(!sense)
{
ReadCapacity = cmdBuf;
2022-03-07 07:36:44 +00:00
Blocks = (ulong)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) & 0xFFFFFFFF;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
BlockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]);
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadCapacity16(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(!sense)
ReadCapacity16 = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-16 11:47:00 +00:00
if(ReadCapacity == null ||
Blocks is 0xFFFFFFFF or 0)
2022-03-06 13:29:38 +00:00
{
if(ReadCapacity16 == null &&
Blocks == 0)
if(dev.ScsiType != PeripheralDeviceTypes.MultiMediaDevice)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
AaruConsole.ErrorWriteLine("Unable to get media capacity");
AaruConsole.ErrorWriteLine("{0}", Sense.PrettifySense(senseBuf));
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
if(ReadCapacity16 != null)
{
2022-03-07 07:36:44 +00:00
var temp = new byte[8];
2022-03-06 13:29:38 +00:00
Array.Copy(cmdBuf, 0, temp, 0, 8);
Array.Reverse(temp);
Blocks = BitConverter.ToUInt64(temp, 0);
BlockSize = (uint)((cmdBuf[8] << 24) + (cmdBuf[9] << 16) + (cmdBuf[10] << 8) + cmdBuf[11]);
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(Blocks != 0 &&
BlockSize != 0)
Blocks++;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
case PeripheralDeviceTypes.SequentialAccess:
byte[] medBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReportDensitySupport(out byte[] seqBuf, out senseBuf, false, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(!sense)
{
sense = dev.ReportDensitySupport(out medBuf, out senseBuf, true, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(!sense &&
!seqBuf.SequenceEqual(medBuf))
{
DensitySupport = seqBuf;
DensitySupportHeader = Decoders.SCSI.SSC.DensitySupport.DecodeDensity(seqBuf);
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReportDensitySupport(out seqBuf, out senseBuf, true, false, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(!sense)
{
sense = dev.ReportDensitySupport(out medBuf, out senseBuf, true, true, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(!sense &&
!seqBuf.SequenceEqual(medBuf))
{
MediaTypeSupport = medBuf;
MediaTypeSupportHeader = Decoders.SCSI.SSC.DensitySupport.DecodeMediumType(seqBuf);
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
// TODO: Get a machine where 16-byte CDBs don't get DID_ABORT
/*
sense = dev.ReadAttribute(out seqBuf, out senseBuf, ScsiAttributeAction.List, 0, dev.Timeout, out _);
if (sense)
AaruConsole.ErrorWriteLine("SCSI READ ATTRIBUTE:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
{
DataFile.WriteTo("Media-Info command", outputPrefix, "_scsi_readattribute.bin", "SCSI READ ATTRIBUTE", seqBuf);
}
*/
break;
2022-03-07 07:36:44 +00:00
case PeripheralDeviceTypes.BridgingExpander when dev.Model.StartsWith("MDM", StringComparison.Ordinal) ||
dev.Model.StartsWith("MDH", StringComparison.Ordinal):
2022-03-06 13:29:38 +00:00
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _);
if(!sense)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
ReadCapacity = cmdBuf;
2022-03-07 07:36:44 +00:00
Blocks = (ulong)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) & 0xFFFFFFFF;
2022-03-06 13:29:38 +00:00
BlockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]);
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
if(dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice)
{
sense = dev.GetConfiguration(out cmdBuf, out senseBuf, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out _);
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.DebugWriteLine("Media-Info command", "READ GET CONFIGURATION:\n{0}",
Sense.PrettifySense(senseBuf));
2022-03-06 13:29:38 +00:00
if(dev.IsUsb &&
2022-03-16 11:47:00 +00:00
scsiMediumType is 0x40 or 0x41 or 0x42)
2022-03-06 13:29:38 +00:00
MediaType = MediaType.FlashDrive;
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
else
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
MmcConfiguration = cmdBuf;
Features.SeparatedFeatures ftr = Features.Separate(cmdBuf);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "GET CONFIGURATION current profile is {0:X4}h",
ftr.CurrentProfile);
2022-03-06 13:29:38 +00:00
switch(ftr.CurrentProfile)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
case 0x0001:
MediaType = MediaType.GENERIC_HDD;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
case 0x0002:
switch(scsiMediumType)
{
case 0x01:
MediaType = MediaType.PD650;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
case 0x41:
switch(Blocks)
{
case 58620544:
MediaType = MediaType.REV120;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 17090880:
MediaType = MediaType.REV35;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 34185728:
MediaType = MediaType.REV70;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
default:
MediaType = MediaType.Unknown;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
}
2019-09-19 16:39:32 +01:00
2022-03-06 13:29:38 +00:00
break;
case 0x0005:
MediaType = MediaType.CDMO;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0008:
MediaType = MediaType.CD;
2019-07-13 20:46:25 +01:00
2022-03-06 13:29:38 +00:00
break;
case 0x0009:
MediaType = MediaType.CDR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x000A:
MediaType = MediaType.CDRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0010:
MediaType = MediaType.DVDROM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0011:
MediaType = MediaType.DVDR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0012:
MediaType = MediaType.DVDRAM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0013:
case 0x0014:
MediaType = MediaType.DVDRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0015:
case 0x0016:
MediaType = MediaType.DVDRDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0017:
MediaType = MediaType.DVDRWDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0018:
MediaType = MediaType.DVDDownload;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x001A:
MediaType = MediaType.DVDPRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x001B:
MediaType = MediaType.DVDPR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0020:
MediaType = MediaType.DDCD;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0021:
MediaType = MediaType.DDCDR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0022:
MediaType = MediaType.DDCDRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x002A:
MediaType = MediaType.DVDPRWDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x002B:
MediaType = MediaType.DVDPRDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0040:
MediaType = MediaType.BDROM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0041:
case 0x0042:
MediaType = MediaType.BDR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0043:
MediaType = MediaType.BDRE;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0050:
MediaType = MediaType.HDDVDROM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0051:
MediaType = MediaType.HDDVDR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0052:
MediaType = MediaType.HDDVDRAM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0053:
MediaType = MediaType.HDDVDRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x0058:
MediaType = MediaType.HDDVDRDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case 0x005A:
MediaType = MediaType.HDDVDRWDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
}
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(MediaType == MediaType.PD650 &&
Blocks == 1281856)
MediaType = MediaType.PD650_WORM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.RecognizedFormatLayers, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Recognized Format Layers\n{0}",
2022-03-06 13:29:38 +00:00
Sense.PrettifySense(senseBuf));
else
RecognizedFormatLayers = cmdBuf;
2019-05-16 23:29:54 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.WriteProtectionStatus, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Write Protection Status\n{0}",
2022-03-06 13:29:38 +00:00
Sense.PrettifySense(senseBuf));
else
WriteProtectionStatus = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
// More like a drive information
/*
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.CapabilityList, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Capability List\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_capabilitylist.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
*/
#region All DVD and HD DVD types
2022-03-16 11:47:00 +00:00
if(MediaType is MediaType.DVDDownload or MediaType.DVDPR or MediaType.DVDPRDL or MediaType.DVDPRW
or MediaType.DVDPRWDL or MediaType.DVDR or MediaType.DVDRAM or MediaType.DVDRDL
or MediaType.DVDROM or MediaType.DVDRW or MediaType.DVDRWDL or MediaType.HDDVDR
or MediaType.HDDVDRAM or MediaType.HDDVDRDL or MediaType.HDDVDROM or MediaType.HDDVDRW
or MediaType.HDDVDRWDL)
2022-03-06 13:29:38 +00:00
{
2018-09-07 23:26:10 +01:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-06 13:29:38 +00:00
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2020-01-01 18:06:31 +00:00
else
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
DvdPfi = cmdBuf;
DecodedPfi = PFI.Decode(cmdBuf, MediaType);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(DecodedPfi.HasValue)
if(MediaType == MediaType.DVDROM)
switch(DecodedPfi.Value.DiskCategory)
{
case DiskCategory.DVDPR:
MediaType = MediaType.DVDPR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.DVDPRDL:
MediaType = MediaType.DVDPRDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.DVDPRW:
MediaType = MediaType.DVDPRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.DVDPRWDL:
MediaType = MediaType.DVDPRWDL;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.DVDR:
2022-03-07 07:36:44 +00:00
MediaType = DecodedPfi.Value.PartVersion >= 6 ? MediaType.DVDRDL : MediaType.DVDR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.DVDRAM:
MediaType = MediaType.DVDRAM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
default:
MediaType = MediaType.DVDROM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.DVDRW:
MediaType = DecodedPfi.Value.PartVersion >= 15 ? MediaType.DVDRWDL
: MediaType.DVDRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.HDDVDR:
MediaType = MediaType.HDDVDR;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.HDDVDRAM:
MediaType = MediaType.HDDVDRAM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.HDDVDROM:
MediaType = MediaType.HDDVDROM;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.HDDVDRW:
MediaType = MediaType.HDDVDRW;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.Nintendo:
MediaType = DecodedPfi.Value.DiscSize == DVDSize.Eighty ? MediaType.GOD
: MediaType.WOD;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DiskCategory.UMD:
MediaType = MediaType.UMD;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
}
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DiscManufacturingInformation, 0, dev.Timeout,
out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DMI\n{0}",
Sense.PrettifySense(senseBuf));
else
{
DvdDmi = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(DMI.IsXbox(cmdBuf))
MediaType = MediaType.XGD;
else if(DMI.IsXbox360(cmdBuf))
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
MediaType = MediaType.XGD2;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
// All XGD3 all have the same number of blocks
2022-03-16 11:47:00 +00:00
if(Blocks is 25063 or 4229664 or 4246304) // Wxripper unlock
2022-03-06 13:29:38 +00:00
MediaType = MediaType.XGD3;
2018-09-07 23:26:10 +01:00
}
}
2022-03-06 13:29:38 +00:00
}
#endregion All DVD and HD DVD types
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
#region DVD-ROM
2022-03-16 11:47:00 +00:00
if(MediaType is MediaType.DVDDownload or MediaType.DVDROM)
2022-03-06 13:29:38 +00:00
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.CopyrightInformation, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: CMI\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdCmi = cmdBuf;
}
#endregion DVD-ROM
switch(MediaType)
{
#region DVD-ROM and HD DVD-ROM
case MediaType.DVDDownload:
case MediaType.DVDROM:
case MediaType.HDDVDROM:
2018-09-07 23:26:10 +01:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-06 13:29:38 +00:00
MmcDiscStructureFormat.BurstCuttingArea, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: BCA\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2020-01-01 18:06:31 +00:00
else
2022-03-06 13:29:38 +00:00
DvdBca = cmdBuf;
2019-09-19 16:39:32 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdAacs, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DVD AACS\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdAacs = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
#endregion DVD-ROM and HD DVD-ROM
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
#region DVD-RAM and HD DVD-RAM
case MediaType.DVDRAM:
case MediaType.HDDVDRAM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdramDds, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DDS\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdRamDds = cmdBuf;
2019-09-19 16:39:32 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdramMediumStatus, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Medium Status\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdRamCartridgeStatus = cmdBuf;
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-06 13:29:38 +00:00
MmcDiscStructureFormat.DvdramSpareAreaInformation, 0, dev.Timeout,
out _);
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: SAI\n{0}",
Sense.PrettifySense(senseBuf));
else
2022-03-06 13:29:38 +00:00
DvdRamSpareArea = cmdBuf;
2022-03-06 13:29:38 +00:00
break;
#endregion DVD-RAM and HD DVD-RAM
#region DVD-R and HD DVD-R
case MediaType.DVDR:
case MediaType.HDDVDR:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-06 13:29:38 +00:00
MmcDiscStructureFormat.LastBorderOutRmd, 0, dev.Timeout, out _);
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command",
"READ DISC STRUCTURE: Last-Out Border RMD\n{0}",
Sense.PrettifySense(senseBuf));
else
2022-03-06 13:29:38 +00:00
LastBorderOutRmd = cmdBuf;
break;
#endregion DVD-R and HD DVD-R
}
var dvdDecrypt = new DVDDecryption(dev);
sense = dvdDecrypt.ReadBusKey(out cmdBuf, out senseBuf, CopyrightType.CSS, dev.Timeout, out _);
if(!sense)
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DiscKey, dvdDecrypt.Agid, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Disc Key\n{0}",
Sense.PrettifySense(senseBuf));
2018-09-07 23:26:10 +01:00
else
2022-03-06 13:29:38 +00:00
DvdDiscKey = cmdBuf;
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.SectorCopyrightInformation, dvdDecrypt.Agid,
dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Sector CMI\n{0}",
Sense.PrettifySense(senseBuf));
2018-09-07 23:26:10 +01:00
else
2022-03-06 13:29:38 +00:00
DvdSectorCmi = cmdBuf;
}
#region Require drive authentication, won't work
/*
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.MediaIdentifier, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Media ID\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_dvd_mediaid.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.MediaKeyBlock, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: MKB\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_dvd_mkb.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.AACSVolId, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: AACS Volume ID\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacsvolid.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.AACSMediaSerial, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: AACS Media Serial Number\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacssn.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.AACSMediaId, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: AACS Media ID\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacsmediaid.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.AACSMKB, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: AACS MKB\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacsmkb.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.AACSLBAExtents, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: AACS LBA Extents\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacslbaextents.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.AACSMKBCPRM, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: AACS CPRM MKB\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacscprmmkb.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.AACSDataKeys, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: AACS Data Keys\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacsdatakeys.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
*/
#endregion Require drive authentication, won't work
#region DVD-R and DVD-RW
2022-03-16 11:47:00 +00:00
if(MediaType is MediaType.DVDR or MediaType.DVDRW or MediaType.DVDRDL or MediaType.DVDRWDL)
2022-03-06 13:29:38 +00:00
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PreRecordedInfo, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Pre-Recorded Info\n{0}",
Sense.PrettifySense(senseBuf));
2018-09-07 23:26:10 +01:00
else
{
2022-03-06 13:29:38 +00:00
DvdPreRecordedInfo = cmdBuf;
DecodedDvdPrePitInformation = PRI.Decode(cmdBuf);
}
}
#endregion DVD-R and DVD-RW
switch(MediaType)
{
#region DVD-R, DVD-RW and HD DVD-R
case MediaType.DVDR:
case MediaType.DVDRW:
case MediaType.DVDRDL:
case MediaType.DVDRWDL:
case MediaType.HDDVDR:
2018-09-07 23:26:10 +01:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-07 07:36:44 +00:00
MmcDiscStructureFormat.DvdrMediaIdentifier, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DVD-R Media ID\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdrMediaIdentifier = cmdBuf;
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdrPhysicalInformation, 0, dev.Timeout,
out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DVD-R PFI\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2020-01-01 18:06:31 +00:00
else
{
2022-03-06 13:29:38 +00:00
DvdrPhysicalInformation = cmdBuf;
2022-03-06 13:29:38 +00:00
DecodedDvdrPfi = PFI.Decode(cmdBuf, MediaType);
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
#endregion DVD-R, DVD-RW and HD DVD-R
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
#region All DVD+
case MediaType.DVDPR:
case MediaType.DVDPRDL:
case MediaType.DVDPRW:
case MediaType.DVDPRWDL:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Adip, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: ADIP\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdPlusAdip = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Dcb, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DCB\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdPlusDcb = cmdBuf;
2021-06-23 19:27:56 +01:00
2022-03-06 13:29:38 +00:00
break;
#endregion All DVD+
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
#region HD DVD-ROM
case MediaType.HDDVDROM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.HddvdCopyrightInformation, 0, dev.Timeout,
out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: HD DVD CMI\n{0}",
Sense.PrettifySense(senseBuf));
else
HddvdCopyrightInformation = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
#endregion HD DVD-ROM
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
#region HD DVD-R
if(MediaType == MediaType.HDDVDR)
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.HddvdrMediumStatus, 0, dev.Timeout, out _);
2019-09-19 16:39:32 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: HD DVD-R Medium Status\n{0}",
2022-03-06 13:29:38 +00:00
Sense.PrettifySense(senseBuf));
else
HddvdrMediumStatus = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.HddvdrLastRmd, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Last RMD\n{0}",
Sense.PrettifySense(senseBuf));
else
HddvdrLastRmd = cmdBuf;
}
#endregion HD DVD-R
2019-09-19 16:39:32 +01:00
2022-03-06 13:29:38 +00:00
#region DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL
2022-03-16 11:47:00 +00:00
if(MediaType is MediaType.DVDPRDL or MediaType.DVDRDL or MediaType.DVDRWDL or MediaType.DVDPRWDL)
2022-03-06 13:29:38 +00:00
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdrLayerCapacity, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Layer Capacity\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdrLayerCapacity = cmdBuf;
}
#endregion DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL
switch(MediaType)
{
#region DVD-R DL
case MediaType.DVDRDL:
2018-09-07 23:26:10 +01:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-06 13:29:38 +00:00
MmcDiscStructureFormat.MiddleZoneStart, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
if(sense)
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Middle Zone Start\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2020-01-01 18:06:31 +00:00
else
2022-03-06 13:29:38 +00:00
DvdrDlMiddleZoneStart = cmdBuf;
2020-01-01 18:06:31 +00:00
2018-09-07 23:26:10 +01:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-06 13:29:38 +00:00
MmcDiscStructureFormat.JumpIntervalSize, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
if(sense)
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Jump Interval Size\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2020-01-01 18:06:31 +00:00
else
2022-03-06 13:29:38 +00:00
DvdrDlJumpIntervalSize = cmdBuf;
2018-09-07 23:26:10 +01:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
2022-03-06 13:29:38 +00:00
MmcDiscStructureFormat.ManualLayerJumpStartLba, 0, dev.Timeout,
out _);
2020-01-01 18:06:31 +00:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command",
"READ DISC STRUCTURE: Manual Layer Jump Start LBA\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2020-01-01 18:06:31 +00:00
else
2022-03-06 13:29:38 +00:00
DvdrDlManualLayerJumpStartLba = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.RemapAnchorPoint, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Remap Anchor Point\n{0}",
2022-03-06 13:29:38 +00:00
Sense.PrettifySense(senseBuf));
else
DvdrDlRemapAnchorPoint = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
#endregion DVD-R DL
#region All Blu-ray
case MediaType.BDR:
case MediaType.BDRE:
case MediaType.BDROM:
case MediaType.UHDBD:
case MediaType.BDRXL:
case MediaType.BDREXL:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.DiscInformation, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DI\n{0}",
Sense.PrettifySense(senseBuf));
else
BlurayDiscInformation = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.Pac, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PAC\n{0}",
Sense.PrettifySense(senseBuf));
else
BlurayPac = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
#endregion All Blu-ray
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
switch(MediaType)
{
#region BD-ROM only
case MediaType.BDROM:
case MediaType.UHDBD:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdBurstCuttingArea, 0, dev.Timeout, out _);
2019-09-19 16:39:32 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: BCA\n{0}",
Sense.PrettifySense(senseBuf));
else
BlurayBurstCuttingArea = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
#endregion BD-ROM only
#region Writable Blu-ray only
case MediaType.BDR:
case MediaType.BDRE:
case MediaType.BDRXL:
case MediaType.BDREXL:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdDds, 0, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DDS\n{0}",
Sense.PrettifySense(senseBuf));
else
BlurayDds = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.CartridgeStatus, 0, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Cartridge Status\n{0}",
2022-03-06 13:29:38 +00:00
Sense.PrettifySense(senseBuf));
else
BlurayCartridgeStatus = cmdBuf;
2019-09-19 16:39:32 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
2022-03-07 07:36:44 +00:00
MmcDiscStructureFormat.BdSpareAreaInformation, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command",
"READ DISC STRUCTURE: Spare Area Information\n{0}",
Sense.PrettifySense(senseBuf));
else
BluraySpareAreaInformation = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.RawDfl, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: Raw DFL\n{0}",
Sense.PrettifySense(senseBuf));
else
BlurayRawDfl = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscInformation(out cmdBuf, out senseBuf,
MmcDiscInformationDataTypes.TrackResources, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC INFORMATION 001b\n{0}",
Sense.PrettifySense(senseBuf));
else
BlurayTrackResources = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-07 07:36:44 +00:00
sense = dev.ReadDiscInformation(out cmdBuf, out senseBuf, MmcDiscInformationDataTypes.PowResources,
dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC INFORMATION 010b\n{0}",
Sense.PrettifySense(senseBuf));
else
BlurayPowResources = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
#endregion Writable Blu-ray only
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
#region CDs
case MediaType.CD:
case MediaType.CDR:
case MediaType.CDROM:
case MediaType.CDRW:
case MediaType.Unknown:
// We discarded all discs that falsify a TOC before requesting a real TOC
// No TOC, no CD (or an empty one)
bool tocSense = dev.ReadTocPmaAtip(out cmdBuf, out senseBuf, false, 0, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(tocSense)
AaruConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: TOC\n{0}",
Sense.PrettifySense(senseBuf));
else
{
Toc = cmdBuf;
DecodedToc = TOC.Decode(cmdBuf);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
// As we have a TOC we know it is a CD
if(MediaType == MediaType.Unknown)
MediaType = MediaType.CD;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
// ATIP exists on blank CDs
sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: ATIP\n{0}",
Sense.PrettifySense(senseBuf));
else
{
Atip = cmdBuf;
DecodedAtip = ATIP.Decode(cmdBuf);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(DecodedAtip != null)
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
// Only CD-R and CD-RW have ATIP
MediaType = DecodedAtip.DiscType ? MediaType.CDRW : MediaType.CDR;
2020-01-01 18:06:31 +00:00
else
2022-03-06 13:29:38 +00:00
Atip = null;
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
// We got a TOC, get information about a recorded/mastered CD
if(!tocSense)
{
sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Session info\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2022-03-06 13:29:38 +00:00
else if(cmdBuf.Length > 4)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
Session = cmdBuf;
DecodedSession = Decoders.CD.Session.Decode(cmdBuf);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(DecodedSession.HasValue)
{
sessions = DecodedSession.Value.LastCompleteSession;
firstTrackLastSession = DecodedSession.Value.TrackDescriptors[0].TrackNumber;
}
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
sense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
if(sense)
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Raw TOC\n{0}",
2020-02-29 18:03:35 +00:00
Sense.PrettifySense(senseBuf));
2022-03-06 13:29:38 +00:00
else if(cmdBuf.Length > 4)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
RawToc = cmdBuf;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
FullToc = FullTOC.Decode(cmdBuf);
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
sense = dev.ReadPma(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: PMA\n{0}",
Sense.PrettifySense(senseBuf));
else if(cmdBuf.Length > 4)
Pma = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: CD-TEXT\n{0}",
Sense.PrettifySense(senseBuf));
else if(cmdBuf.Length > 4)
{
CdTextLeadIn = cmdBuf;
DecodedCdTextLeadIn = CDTextOnLeadIn.Decode(cmdBuf);
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadMcn(out string mcn, out _, out _, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(!sense &&
mcn != null &&
mcn != "0000000000000")
Mcn = mcn;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
Isrcs = new Dictionary<byte, string>();
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
for(byte i = DecodedToc.Value.FirstTrack; i <= DecodedToc.Value.LastTrack; i++)
{
sense = dev.ReadIsrc(i, out string isrc, out _, out _, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(!sense &&
isrc != null &&
isrc != "000000000000")
Isrcs.Add(i, isrc);
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(Isrcs.Count == 0)
Isrcs = null;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
#endregion CDs
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
#region Nintendo
if(MediaType == MediaType.Unknown &&
Blocks > 0)
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}",
Sense.PrettifySense(senseBuf));
else
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
DvdPfi = cmdBuf;
PFI.PhysicalFormatInformation? nintendoPfi = PFI.Decode(cmdBuf, MediaType);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(nintendoPfi != null)
2018-09-07 23:26:10 +01:00
{
2022-03-06 13:29:38 +00:00
AaruConsole.WriteLine("PFI:\n{0}", PFI.Prettify(cmdBuf, MediaType));
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(nintendoPfi.Value.DiskCategory == DiskCategory.Nintendo &&
nintendoPfi.Value.PartVersion == 15)
switch(nintendoPfi.Value.DiscSize)
{
case DVDSize.Eighty:
MediaType = MediaType.GOD;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
case DVDSize.OneTwenty:
MediaType = MediaType.WOD;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
}
2018-09-07 23:26:10 +01:00
}
}
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DiscManufacturingInformation, 0, dev.Timeout,
out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DMI\n{0}",
Sense.PrettifySense(senseBuf));
else
DvdDmi = cmdBuf;
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
#endregion Nintendo
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadMediaSerialNumber(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ MEDIA SERIAL NUMBER\n{0}",
Sense.PrettifySense(senseBuf));
else
{
if(cmdBuf.Length >= 4)
MediaSerialNumber = cmdBuf;
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
switch(MediaType)
{
#region Xbox
case MediaType.XGD:
case MediaType.XGD2:
case MediaType.XGD3:
// We need to get INQUIRY to know if it is a Kreon drive
sense = dev.ScsiInquiry(out byte[] inqBuffer, out senseBuf);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(!sense)
{
Inquiry? inq = Inquiry.Decode(inqBuffer);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(inq?.KreonPresent == true)
{
sense = dev.KreonExtractSs(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "KREON EXTRACT SS:\n{0}",
Sense.PrettifySense(senseBuf));
else
XboxSecuritySector = cmdBuf;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
DecodedXboxSecuritySector = SS.Decode(cmdBuf);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
// Get video partition size
AaruConsole.DebugWriteLine("Dump-media command", "Getting video partition size");
sense = dev.KreonLock(out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot lock drive, not continuing.");
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot get disc capacity.");
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
ulong totalSize =
2022-03-07 07:36:44 +00:00
(ulong)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) & 0xFFFFFFFF;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot get PFI.");
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Dump-media command", "Video partition total size: {0} sectors",
totalSize);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
ulong l0Video = PFI.Decode(cmdBuf, MediaType).Value.Layer0EndPSN -
PFI.Decode(cmdBuf, MediaType).Value.DataAreaStartPSN + 1;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
ulong l1Video = totalSize - l0Video + 1;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
// Get game partition size
AaruConsole.DebugWriteLine("Dump-media command", "Getting game partition size");
sense = dev.KreonUnlockXtreme(out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot unlock drive, not continuing.");
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot get disc capacity.");
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
return;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
ulong gameSize =
((ulong)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) &
0xFFFFFFFF) + 1;
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
AaruConsole.DebugWriteLine("Dump-media command", "Game partition total size: {0} sectors",
gameSize);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
// Get middle zone size
AaruConsole.DebugWriteLine("Dump-media command", "Getting middle zone size");
sense = dev.KreonUnlockWxripper(out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot unlock drive, not continuing.");
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
}
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _);
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot get disc capacity.");
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
break;
}
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
totalSize = (ulong)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) &
0xFFFFFFFF;
2020-01-01 18:06:31 +00:00
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
if(sense)
{
AaruConsole.ErrorWriteLine("Cannot get PFI.");
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
break;
2018-09-07 23:26:10 +01:00
}
2022-03-07 07:36:44 +00:00
AaruConsole.DebugWriteLine("Dump-media command", "Unlocked total size: {0} sectors", totalSize);
2018-09-07 23:26:10 +01:00
2022-03-06 13:29:38 +00:00
ulong middleZone =
totalSize - (PFI.Decode(cmdBuf, MediaType).Value.Layer0EndPSN -
PFI.Decode(cmdBuf, MediaType).Value.DataAreaStartPSN + 1) - gameSize + 1;
2018-09-09 19:51:56 +01:00
2022-03-07 07:36:44 +00:00
totalSize = l0Video + l1Video + middleZone * 2 + gameSize;
ulong layerBreak = l0Video + middleZone + gameSize / 2;
2018-09-09 19:51:56 +01:00
2022-03-06 13:29:38 +00:00
XgdInfo = new XgdInfo
{
L0Video = l0Video,
L1Video = l1Video,
MiddleZone = middleZone,
GameSize = gameSize,
TotalSize = totalSize,
LayerBreak = layerBreak
};
}
}
2018-09-09 20:06:37 +01:00
2022-03-06 13:29:38 +00:00
break;
#endregion Xbox
2022-03-06 13:29:38 +00:00
case MediaType.Unknown:
MediaType = MediaTypeFromDevice.GetFromScsi((byte)dev.ScsiType, dev.Manufacturer, dev.Model,
scsiMediumType, scsiDensityCode, Blocks, BlockSize,
dev.IsUsb, true);
2018-09-11 20:29:08 +01:00
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
if(MediaType == MediaType.Unknown &&
dev.IsUsb &&
containsFloppyPage)
MediaType = MediaType.FlashDrive;
2022-03-06 13:29:38 +00:00
if(MediaType == MediaType.Unknown &&
!dev.IsRemovable)
MediaType = MediaType.GENERIC_HDD;
2022-03-06 13:29:38 +00:00
if(DeviceInfo.ScsiType != PeripheralDeviceTypes.MultiMediaDevice ||
2022-03-16 11:47:00 +00:00
dev.IsUsb && scsiMediumType is 0x40 or 0x41 or 0x42)
2022-03-06 13:29:38 +00:00
return;
2022-03-06 13:29:38 +00:00
sense = dev.ReadDiscInformation(out cmdBuf, out senseBuf, MmcDiscInformationDataTypes.DiscInformation,
dev.Timeout, out _);
if(sense)
AaruConsole.DebugWriteLine("Media-Info command", "READ DISC INFORMATION 000b\n{0}",
Sense.PrettifySense(senseBuf));
else
{
DiscInformation = cmdBuf;
DecodedDiscInformation = Decoders.SCSI.MMC.DiscInformation.Decode000b(cmdBuf);
if(DecodedDiscInformation.HasValue)
if(MediaType == MediaType.CD)
switch(DecodedDiscInformation.Value.DiscType)
{
case 0x10:
MediaType = MediaType.CDI;
2022-03-06 13:29:38 +00:00
break;
case 0x20:
MediaType = MediaType.CDROMXA;
2018-09-11 23:36:23 +01:00
2022-03-06 13:29:38 +00:00
break;
}
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
MediaType tmpType = MediaType;
MMC.DetectDiscType(ref tmpType, sessions, FullToc, dev, out _, out _, firstTrackLastSession, Blocks);
MediaType = tmpType;
2018-09-07 23:26:10 +01:00
}
2022-03-06 13:29:38 +00:00
/// <summary>Decoded DVD Pre-Recorded Information</summary>
public PRI.PreRecordedInformation? DecodedDvdPrePitInformation { get; }
/// <summary>Decoded recordable DVD Physical Format Information</summary>
public PFI.PhysicalFormatInformation? DecodedDvdrPfi { get; }
/// <summary>Raw media serial number</summary>
public byte[] MediaSerialNumber { get; }
/// <summary>Raw Xbox security sectors</summary>
public byte[] XboxSecuritySector { get; }
/// <summary>Decoded Xbox security sectors</summary>
public SS.SecuritySector? DecodedXboxSecuritySector { get; }
/// <summary>Information about an XGD, XGD2 or XGD3 media</summary>
public XgdInfo XgdInfo { get; }
/// <summary>MMC drive raw GET CONFIGURATION</summary>
public byte[] MmcConfiguration { get; }
/// <summary>Raw recognized format layers</summary>
public byte[] RecognizedFormatLayers { get; }
/// <summary>Raw write protection status</summary>
public byte[] WriteProtectionStatus { get; }
/// <summary>Raw DVD Physical Format Information</summary>
public byte[] DvdPfi { get; }
/// <summary>Decoded DVD Physical Format Information</summary>
public PFI.PhysicalFormatInformation? DecodedPfi { get; }
/// <summary>Raw DVD Disc Manufacturing Information</summary>
public byte[] DvdDmi { get; }
/// <summary>Raw DVD Copyright Management Information</summary>
public byte[] DvdCmi { get; }
/// <summary>Raw DVD Burst Cutting Area</summary>
public byte[] DvdBca { get; }
/// <summary>Raw DVD AACS information</summary>
public byte[] DvdAacs { get; }
/// <summary>Raw DVD-RAM Disc Definition Structure</summary>
public byte[] DvdRamDds { get; }
/// <summary>Raw DVD-RAM Cartridge Status</summary>
public byte[] DvdRamCartridgeStatus { get; }
/// <summary>Raw DVD-RAM Spare Area Information</summary>
public byte[] DvdRamSpareArea { get; }
/// <summary>Raw DVD-R(W) Last Border-Out RMD</summary>
public byte[] LastBorderOutRmd { get; }
/// <summary>Raw DVD-R(W) Pre-Recorded Information</summary>
public byte[] DvdPreRecordedInfo { get; }
/// <summary>Raw DVD-R Media ID</summary>
public byte[] DvdrMediaIdentifier { get; }
/// <summary>Raw recordable DVD Physical Format Information</summary>
public byte[] DvdrPhysicalInformation { get; }
/// <summary>Raw DVD+R(W) ADIP</summary>
public byte[] DvdPlusAdip { get; }
/// <summary>Raw DVD+R(W) Disc Control Blocks</summary>
public byte[] DvdPlusDcb { get; }
/// <summary>Raw HD DVD Copyright Management Information</summary>
public byte[] HddvdCopyrightInformation { get; }
/// <summary>Raw HD DVD-R Medium Status</summary>
public byte[] HddvdrMediumStatus { get; }
/// <summary>Raw HD DVD-R(W) Last Border-Out RMD</summary>
public byte[] HddvdrLastRmd { get; }
/// <summary>Raw DVD-R(W) Layer Capacity</summary>
public byte[] DvdrLayerCapacity { get; }
/// <summary>Raw DVD-R DL Middle Zone start</summary>
public byte[] DvdrDlMiddleZoneStart { get; }
/// <summary>Raw DVD-R DL Jump Interval size</summary>
public byte[] DvdrDlJumpIntervalSize { get; }
/// <summary>Raw DVD-R DL Manual Layer Jump Start LBA</summary>
public byte[] DvdrDlManualLayerJumpStartLba { get; }
/// <summary>Raw DVD-R DL Remap Anchor Point</summary>
public byte[] DvdrDlRemapAnchorPoint { get; }
/// <summary>Raw Blu-ray Disc Information</summary>
public byte[] BlurayDiscInformation { get; }
/// <summary>Raw Blu-ray PAC</summary>
public byte[] BlurayPac { get; }
/// <summary>Raw Blu-ray Burst Cutting Area</summary>
public byte[] BlurayBurstCuttingArea { get; }
/// <summary>Raw Blu-ray Disc Definition Structure</summary>
public byte[] BlurayDds { get; }
/// <summary>Raw Blu-ray Cartridge Status</summary>
public byte[] BlurayCartridgeStatus { get; }
/// <summary>Raw Blu-ray Spare Area Information</summary>
public byte[] BluraySpareAreaInformation { get; }
/// <summary>Raw Blu-ray DFL</summary>
public byte[] BlurayRawDfl { get; }
/// <summary>Raw Blu-ray Pseudo OverWrite Resources</summary>
public byte[] BlurayPowResources { get; }
/// <summary>Raw READ TOC response</summary>
public byte[] Toc { get; }
/// <summary>Raw READ ATIP response</summary>
public byte[] Atip { get; }
/// <summary>Raw READ DISC INFORMATION response</summary>
public byte[] DiscInformation { get; }
/// <summary>Raw READ SESSION response</summary>
public byte[] Session { get; }
/// <summary>Raw READ FULL TOC response</summary>
public byte[] RawToc { get; }
/// <summary>Raw READ PMA response</summary>
public byte[] Pma { get; }
/// <summary>Raw Lead-In's CD-TEXT response</summary>
public byte[] CdTextLeadIn { get; }
/// <summary>Decoded READ TOC response</summary>
public TOC.CDTOC? DecodedToc { get; }
/// <summary>Decoded READ ATIP response</summary>
public ATIP.CDATIP DecodedAtip { get; }
/// <summary>Decoded READ SESSION response</summary>
public Session.CDSessionInfo? DecodedSession { get; }
/// <summary>Decoded READ FULL TOC response</summary>
public FullTOC.CDFullTOC? FullToc { get; }
/// <summary>Decoded Lead-In CD-TEXT response</summary>
public CDTextOnLeadIn.CDText? DecodedCdTextLeadIn { get; }
/// <summary>Raw Blu-ray track resources</summary>
public byte[] BlurayTrackResources { get; }
/// <summary>Decoded Blu-ray Disc Information</summary>
public DiscInformation.StandardDiscInformation? DecodedDiscInformation { get; }
/// <summary>Decoded Media Catalogue Number</summary>
public string Mcn { get; }
/// <summary>List of decoded track ISRCs</summary>
public Dictionary<byte, string> Isrcs { get; }
/// <summary>Set if media is inserted in drive</summary>
public bool MediaInserted { get; }
/// <summary>Detected media type</summary>
public MediaType MediaType { get; }
/// <summary>Device information</summary>
public DeviceInfo DeviceInfo { get; }
/// <summary>Raw READ CAPACITY(10) response</summary>
public byte[] ReadCapacity { get; }
/// <summary>Number of blocks in media</summary>
public ulong Blocks { get; }
/// <summary>Logical block size</summary>
public uint BlockSize { get; }
/// <summary>Raw READ CAPACITY(16) response</summary>
public byte[] ReadCapacity16 { get; }
/// <summary>Raw SSC Density support</summary>
public byte[] DensitySupport { get; }
/// <summary>Decoded SSC Density support</summary>
public DensitySupport.DensitySupportHeader? DensitySupportHeader { get; }
/// <summary>Raw SSC media support</summary>
public byte[] MediaTypeSupport { get; }
/// <summary>Decoded SSC media support</summary>
public DensitySupport.MediaTypeSupportHeader? MediaTypeSupportHeader { get; }
/// <summary>Raw data from DVD sector Copyright Management Information</summary>
public byte[] DvdSectorCmi { get; }
/// <summary>Raw DVD Disc Key</summary>
public byte[] DvdDiscKey { get; }
2018-09-07 23:26:10 +01:00
}