diff --git a/ChangeLog b/ChangeLog index 7b81f65c1..ce11bfda9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,11 @@ * commandline: +2016-02-04 Natalia Portillo + + * commandline: + + 2016-02-03 Natalia Portillo * commandline: diff --git a/DiscImageChef.CommonTypes/ChangeLog b/DiscImageChef.CommonTypes/ChangeLog index b50d7e05e..3998f9dcb 100644 --- a/DiscImageChef.CommonTypes/ChangeLog +++ b/DiscImageChef.CommonTypes/ChangeLog @@ -1,3 +1,8 @@ +2016-02-04 Natalia Portillo + + * MediaType.cs: + Added Jaguar CD, Super CD-ROM² and 3DO discs. + 2016-01-16 Natalia Portillo * MediaType.cs: diff --git a/DiscImageChef.CommonTypes/MediaType.cs b/DiscImageChef.CommonTypes/MediaType.cs index 217d26344..7cd9e060d 100644 --- a/DiscImageChef.CommonTypes/MediaType.cs +++ b/DiscImageChef.CommonTypes/MediaType.cs @@ -229,11 +229,22 @@ namespace DiscImageChef.CommonTypes SATURNCD, /// Sega/Yamaha Gigabyte Disc GDROM, - /// Sega/Yamaha recordable Gigabyte Disc}} + /// Sega/Yamaha recordable Gigabyte Disc GDR, SegaCard, #endregion Sega game media + #region Other game media + /// PC-Engine / TurboGrafx cartridge + HuCard, + /// PC-Engine / TurboGrafx CD + SuperCDROM2, + /// Atari Jaguar CD + JaguarCD, + /// 3DO CD + ThreeDO, + #endregion Other game media + #region Apple standard floppy format /// 5.25", SS, DD, 35 tracks, 13 spt, 256 bytes/sector, GCR Apple32SS, @@ -753,7 +764,6 @@ namespace DiscImageChef.CommonTypes Flextra3225, HiTC1, HiTC2, - HuCard, LT1, MiniCard, Orb, diff --git a/DiscImageChef.Metadata/ChangeLog b/DiscImageChef.Metadata/ChangeLog index 0cc4aea59..cac93352f 100644 --- a/DiscImageChef.Metadata/ChangeLog +++ b/DiscImageChef.Metadata/ChangeLog @@ -1,3 +1,11 @@ +2016-02-04 Natalia Portillo + + * Dimensions.cs: + Add dimensions for CDs and family. + + * MediaType.cs: + Added Jaguar CD, Super CD-ROM² and 3DO discs. + 2016-01-16 Natalia Portillo * Dimensions.cs: diff --git a/DiscImageChef.Metadata/Dimensions.cs b/DiscImageChef.Metadata/Dimensions.cs index 2a9aa6a72..b05e7412e 100644 --- a/DiscImageChef.Metadata/Dimensions.cs +++ b/DiscImageChef.Metadata/Dimensions.cs @@ -807,6 +807,7 @@ namespace DiscImageChef.Metadata dmns.WidthSpecified = true; dmns.Thickness = 25.4; return dmns; + case CommonTypes.MediaType.LD: case CommonTypes.MediaType.LDROM: case CommonTypes.MediaType.LDROM2: case CommonTypes.MediaType.MegaLD: @@ -815,6 +816,81 @@ namespace DiscImageChef.Metadata dmns.DiameterSpecified = true; dmns.Thickness = 2.5; return dmns; + + #region CD/DVD/BD + case CommonTypes.MediaType.CDDA: + case CommonTypes.MediaType.CDG: + case CommonTypes.MediaType.CDEG: + case CommonTypes.MediaType.CDI: + case CommonTypes.MediaType.CDROM: + case CommonTypes.MediaType.CDROMXA: + case CommonTypes.MediaType.CDPLUS: + case CommonTypes.MediaType.CDMO: + case CommonTypes.MediaType.CDR: + case CommonTypes.MediaType.CDRW: + case CommonTypes.MediaType.CDMRW: + case CommonTypes.MediaType.VCD: + case CommonTypes.MediaType.SVCD: + case CommonTypes.MediaType.PCD: + case CommonTypes.MediaType.SACD: + case CommonTypes.MediaType.DDCD: + case CommonTypes.MediaType.DDCDR: + case CommonTypes.MediaType.DDCDRW: + case CommonTypes.MediaType.DTSCD: + case CommonTypes.MediaType.CDMIDI: + case CommonTypes.MediaType.CDV: + case CommonTypes.MediaType.CD: + case CommonTypes.MediaType.DVDROM: + case CommonTypes.MediaType.DVDR: + case CommonTypes.MediaType.DVDRW: + case CommonTypes.MediaType.DVDPR: + case CommonTypes.MediaType.DVDPRW: + case CommonTypes.MediaType.DVDPRWDL: + case CommonTypes.MediaType.DVDRDL: + case CommonTypes.MediaType.DVDPRDL: + case CommonTypes.MediaType.DVDRAM: + case CommonTypes.MediaType.DVDRWDL: + case CommonTypes.MediaType.DVDDownload: + case CommonTypes.MediaType.HDDVDROM: + case CommonTypes.MediaType.HDDVDRAM: + case CommonTypes.MediaType.HDDVDR: + case CommonTypes.MediaType.HDDVDRW: + case CommonTypes.MediaType.HDDVDRDL: + case CommonTypes.MediaType.HDDVDRWDL: + case CommonTypes.MediaType.BDROM: + case CommonTypes.MediaType.BDR: + case CommonTypes.MediaType.BDRE: + case CommonTypes.MediaType.BDRXL: + case CommonTypes.MediaType.BDREXL: + case CommonTypes.MediaType.PS1CD: + case CommonTypes.MediaType.PS2CD: + case CommonTypes.MediaType.PS2DVD: + case CommonTypes.MediaType.PS3DVD: + case CommonTypes.MediaType.PS3BD: + case CommonTypes.MediaType.PS4BD: + case CommonTypes.MediaType.XGD: + case CommonTypes.MediaType.XGD2: + case CommonTypes.MediaType.XGD3: + case CommonTypes.MediaType.XGD4: + case CommonTypes.MediaType.MEGACD: + case CommonTypes.MediaType.SATURNCD: + case CommonTypes.MediaType.GDROM: + case CommonTypes.MediaType.GDR: + case CommonTypes.MediaType.SuperCDROM2: + case CommonTypes.MediaType.JaguarCD: + case CommonTypes.MediaType.ThreeDO: + case CommonTypes.MediaType.WOD: + case CommonTypes.MediaType.WUOD: + dmns.Diameter = 120; + dmns.DiameterSpecified = true; + dmns.Thickness = 1.2; + return dmns; + case CommonTypes.MediaType.GOD: + dmns.Diameter = 80; + dmns.DiameterSpecified = true; + dmns.Thickness = 1.2; + return dmns; + #endregion CD/DVD/BD default: return null; diff --git a/DiscImageChef.Metadata/MediaType.cs b/DiscImageChef.Metadata/MediaType.cs index f4d1fba68..0bffb15ef 100644 --- a/DiscImageChef.Metadata/MediaType.cs +++ b/DiscImageChef.Metadata/MediaType.cs @@ -636,10 +636,22 @@ namespace DiscImageChef.Metadata DiscType = "3.5\" magneto-optical"; DiscSubType = "ECMA-201"; break; - case DiscImageChef.CommonTypes.MediaType.FlashDrive: + case CommonTypes.MediaType.FlashDrive: DiscType = "USB flash drive"; DiscSubType = "USB flash drive"; break; + case CommonTypes.MediaType.SuperCDROM2: + DiscType = "CD"; + DiscSubType = "Super CD-ROM²"; + break; + case CommonTypes.MediaType.JaguarCD: + DiscType = "CD"; + DiscSubType = "Atari Jaguar CD"; + break; + case CommonTypes.MediaType.ThreeDO: + DiscType = "CD"; + DiscSubType = "3DO"; + break; default: DiscType = "Unknown"; DiscSubType = "Unknown"; diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index d86450a5a..d2333edeb 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,10 @@ +2016-02-04 Natalia Portillo + + * Commands/DumpMedia.cs: + Added creation of IBG logs. + Added filesystem and partitions detection (does not work with + raw). + 2016-02-04 Natalia Portillo * Core/MHDDLog.cs: diff --git a/DiscImageChef/Commands/DumpMedia.cs b/DiscImageChef/Commands/DumpMedia.cs index 62860ccfa..8c6e66d8e 100644 --- a/DiscImageChef/Commands/DumpMedia.cs +++ b/DiscImageChef/Commands/DumpMedia.cs @@ -39,10 +39,12 @@ using System; using DiscImageChef.Console; using System.IO; using DiscImageChef.Devices; -using System.Text; using System.Collections.Generic; using Schemas; using DiscImageChef.CommonTypes; +using DiscImageChef.ImagePlugins; +using DiscImageChef.PartPlugins; +using DiscImageChef.Plugins; namespace DiscImageChef.Commands { @@ -51,6 +53,7 @@ namespace DiscImageChef.Commands static bool aborted; static FileStream dataFs; static Core.MHDDLog mhddLog; + static Core.IBGLog ibgLog; // TODO: Implement dump map public static void doDumpMedia(DumpMediaSubOptions options) @@ -78,6 +81,7 @@ namespace DiscImageChef.Commands } mhddLog = null; + ibgLog = null; Device dev = new Device(options.DevicePath); @@ -276,6 +280,7 @@ namespace DiscImageChef.Commands byte scsiMediumType = 0; byte scsiDensityCode = 0; bool containsFloppyPage = false; + ushort currentProfile = 0x0001; CICMMetadataType sidecar = new CICMMetadataType(); @@ -290,6 +295,7 @@ namespace DiscImageChef.Commands if (!sense) { Decoders.SCSI.MMC.Features.SeparatedFeatures ftr = Decoders.SCSI.MMC.Features.Separate(cmdBuf); + currentProfile = ftr.CurrentProfile; switch (ftr.CurrentProfile) { @@ -1195,7 +1201,9 @@ namespace DiscImageChef.Commands initDataFile(options.OutputPrefix + ".bin"); mhddLog = new Core.MHDDLog(options.OutputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); + ibgLog = new Core.IBGLog(options.OutputPrefix + ".ibg", 0x0008); + start = DateTime.UtcNow; for (ulong i = 0; i < blocks; i += blocksToRead) { if (aborted) @@ -1223,6 +1231,7 @@ namespace DiscImageChef.Commands if (!sense && !dev.Error) { mhddLog.Write(i, cmdDuration); + ibgLog.Write(i, currentSpeed * 1024); writeToDataFile(readBuffer); } else @@ -1243,12 +1252,16 @@ namespace DiscImageChef.Commands mhddLog.Write(i, 65535); else mhddLog.Write(i, cmdDuration); + + ibgLog.Write(i, 0); } currentSpeed = ((double)2448 * blocksToRead / (double)1048576) / (cmdDuration / (double)1000); } DicConsole.WriteLine(); + end = DateTime.UtcNow; mhddLog.Close(); + ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, (((double)blockSize * (double)(blocks + 1)) / 1024) / (totalDuration / 1000), options.DevicePath); dataChk = new Core.Checksum(); dataFs.Seek(0, SeekOrigin.Begin); @@ -1299,8 +1312,8 @@ namespace DiscImageChef.Commands sidecar.OpticalDisc[0].Image.Value = options.OutputPrefix + ".bin"; sidecar.OpticalDisc[0].Sessions = 1; sidecar.OpticalDisc[0].Tracks = new []{1}; - sidecar.OpticalDisc[0].Track = new TrackType[1]; - sidecar.OpticalDisc[0].Track[0] = new TrackType(); + sidecar.OpticalDisc[0].Track = new Schemas.TrackType[1]; + sidecar.OpticalDisc[0].Track[0] = new Schemas.TrackType(); sidecar.OpticalDisc[0].Track[0].BytesPerSector = (int)blockSize; sidecar.OpticalDisc[0].Track[0].Checksums = sidecar.OpticalDisc[0].Checksums; sidecar.OpticalDisc[0].Track[0].EndSector = (long)(blocks - 1); @@ -1673,6 +1686,7 @@ namespace DiscImageChef.Commands DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead); mhddLog = new Core.MHDDLog(options.OutputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); + ibgLog = new Core.IBGLog(options.OutputPrefix + ".ibg", currentProfile); initDataFile(options.OutputPrefix + ".bin"); start = DateTime.UtcNow; @@ -1750,6 +1764,7 @@ namespace DiscImageChef.Commands if (!sense && !dev.Error) { mhddLog.Write(i, cmdDuration); + ibgLog.Write(i, currentSpeed * 1024); writeToDataFile(readBuffer); } else @@ -1770,12 +1785,16 @@ namespace DiscImageChef.Commands mhddLog.Write(i, 65535); else mhddLog.Write(i, cmdDuration); + + ibgLog.Write(i, 0); } currentSpeed = ((double)blockSize * blocksToRead / (double)1048576) / (cmdDuration / (double)1000); } + end = DateTime.UtcNow; DicConsole.WriteLine(); mhddLog.Close(); + ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, (((double)blockSize * (double)(blocks + 1)) / 1024) / (totalDuration / 1000), options.DevicePath); #region Error handling if (unreadableSectors.Count > 0 && !aborted) @@ -2000,6 +2019,117 @@ namespace DiscImageChef.Commands closeDataFile(); end = DateTime.UtcNow; + PluginBase plugins = new PluginBase(); + plugins.RegisterAllPlugins(); + ImagePlugin _imageFormat; + _imageFormat = ImageFormat.Detect(options.OutputPrefix + ".bin"); + PartitionType[] xmlFileSysInfo = null; + + try + { + if (!_imageFormat.OpenImage(options.OutputPrefix + ".bin")) + _imageFormat = null; + } + catch (Exception ex) + { + _imageFormat = null; + } + + if (_imageFormat != null) + { + List partitions = new List(); + + foreach (PartPlugin _partplugin in plugins.PartPluginsList.Values) + { + List _partitions; + + if (_partplugin.GetInformation(_imageFormat, out _partitions)) + { + partitions = _partitions; + Core.Statistics.AddPartition(_partplugin.Name); + break; + } + } + + if (partitions.Count > 0) + { + xmlFileSysInfo = new PartitionType[partitions.Count]; + for (int i = 0; i < partitions.Count; i++) + { + xmlFileSysInfo[i] = new PartitionType(); + xmlFileSysInfo[i].Description = partitions[i].PartitionDescription; + xmlFileSysInfo[i].EndSector = (int)(partitions[i].PartitionStartSector + partitions[i].PartitionSectors - 1); + xmlFileSysInfo[i].Name = partitions[i].PartitionName; + xmlFileSysInfo[i].Sequence = (int)partitions[i].PartitionSequence; + xmlFileSysInfo[i].StartSector = (int)partitions[i].PartitionStartSector; + xmlFileSysInfo[i].Type = partitions[i].PartitionType; + + List lstFs = new List(); + + foreach (Plugin _plugin in plugins.PluginsList.Values) + { + try + { + if (_plugin.Identify(_imageFormat, partitions[i].PartitionStartSector, partitions[i].PartitionStartSector + partitions[i].PartitionSectors - 1)) + { + string foo; + _plugin.GetInformation(_imageFormat, partitions[i].PartitionStartSector, partitions[i].PartitionStartSector + partitions[i].PartitionSectors - 1, out foo); + lstFs.Add(_plugin.XmlFSType); + Core.Statistics.AddFilesystem(_plugin.XmlFSType.Type); + + if (_plugin.XmlFSType.Type == "Opera") + dskType = MediaType.ThreeDO; + if (_plugin.XmlFSType.Type == "PC Engine filesystem") + dskType = MediaType.SuperCDROM2; + } + } + catch + { + //DicConsole.DebugWriteLine("Dump-media command", "Plugin {0} crashed", _plugin.Name); + } + } + + if (lstFs.Count > 0) + xmlFileSysInfo[i].FileSystems = lstFs.ToArray(); + } + } + else + { + xmlFileSysInfo = new PartitionType[1]; + xmlFileSysInfo[0] = new PartitionType(); + xmlFileSysInfo[0].EndSector = (int)(blocks - 1); + xmlFileSysInfo[0].StartSector = 0; + + List lstFs = new List(); + + foreach (Plugin _plugin in plugins.PluginsList.Values) + { + try + { + if (_plugin.Identify(_imageFormat, (blocks - 1), 0)) + { + string foo; + _plugin.GetInformation(_imageFormat, (blocks - 1), 0, out foo); + lstFs.Add(_plugin.XmlFSType); + Core.Statistics.AddFilesystem(_plugin.XmlFSType.Type); + + if (_plugin.XmlFSType.Type == "Opera") + dskType = MediaType.ThreeDO; + if (_plugin.XmlFSType.Type == "PC Engine filesystem") + dskType = MediaType.SuperCDROM2; + } + } + catch + { + //DicConsole.DebugWriteLine("Create-sidecar command", "Plugin {0} crashed", _plugin.Name); + } + } + + if (lstFs.Count > 0) + xmlFileSysInfo[0].FileSystems = lstFs.ToArray(); + } + } + if (opticalDisc) { sidecar.OpticalDisc[0].Checksums = dataChk.End().ToArray(); @@ -2023,8 +2153,8 @@ namespace DiscImageChef.Commands //sidecar.OpticalDisc[0].Layers = new LayersType(); sidecar.OpticalDisc[0].Sessions = 1; sidecar.OpticalDisc[0].Tracks = new []{1}; - sidecar.OpticalDisc[0].Track = new TrackType[1]; - sidecar.OpticalDisc[0].Track[0] = new TrackType(); + sidecar.OpticalDisc[0].Track = new Schemas.TrackType[1]; + sidecar.OpticalDisc[0].Track[0] = new Schemas.TrackType(); sidecar.OpticalDisc[0].Track[0].BytesPerSector = (int)blockSize; sidecar.OpticalDisc[0].Track[0].Checksums = sidecar.OpticalDisc[0].Checksums; sidecar.OpticalDisc[0].Track[0].EndSector = (long)(blocks - 1); @@ -2038,6 +2168,8 @@ namespace DiscImageChef.Commands sidecar.OpticalDisc[0].Track[0].Sequence.TrackNumber = 1; sidecar.OpticalDisc[0].Track[0].Size = (long)(blocks * blockSize); sidecar.OpticalDisc[0].Track[0].StartSector = 0; + if (xmlFileSysInfo != null) + sidecar.OpticalDisc [0].Track [0].FileSystemInformation = xmlFileSysInfo; switch (dskType) { case MediaType.DDCD: @@ -2106,6 +2238,8 @@ namespace DiscImageChef.Commands sidecar.BlockMedia[0].Model = dev.Model; sidecar.BlockMedia[0].Serial = dev.Serial; sidecar.BlockMedia[0].Size = (long)(blocks * blockSize); + if (xmlFileSysInfo != null) + sidecar.BlockMedia[0].FileSystemInformation = xmlFileSysInfo; } }