* README.md:
	* DiscImageChef.sln:
	* DiscImageChef/Commands/Ls.cs:
	* DiscImageChef.Filters/GZip.cs:
	* DiscImageChef.DiscImages/BLU.cs:
	* DiscImageChef.DiscImages/VHD.cs:
	* DiscImageChef.DiscImages/VDI.cs:
	* DiscImageChef.DiscImages/QED.cs:
	* DiscImageChef.DiscImages/DIM.cs:
	* DiscImageChef.DiscImages/GDI.cs:
	* DiscImageChef.Filters/Filter.cs:
	* DiscImageChef/Commands/Decode.cs:
	* DiscImageChef.DiscImages/QCOW.cs:
	* DiscImageChef.Filters/Filters.cs:
	* DiscImageChef/Core/Statistics.cs:
	* DiscImageChef.DiscImages/VHDX.cs:
	* DiscImageChef.DiscImages/Nero.cs:
	* DiscImageChef/Commands/Verify.cs:
	* DiscImageChef.DiscImages/UDIF.cs:
	* DiscImageChef/Commands/Compare.cs:
	* DiscImageChef/Commands/Analyze.cs:
	* DiscImageChef.DiscImages/QCOW2.cs:
	* DiscImageChef/Commands/Entropy.cs:
	* DiscImageChef/Commands/Formats.cs:
	* DiscImageChef/Commands/PrintHex.cs:
	* DiscImageChef.DiscImages/VMware.cs:
	* DiscImageChef.Settings/Settings.cs:
	* DiscImageChef/DetectImageFormat.cs:
	* DiscImageChef/DiscImageChef.csproj:
	* DiscImageChef.DiscImages/CDRDAO.cs:
	* DiscImageChef.DiscImages/CPCDSK.cs:
	* DiscImageChef/Commands/Checksum.cs:
	* DiscImageChef.DiscImages/CopyQM.cs:
	* DiscImageChef.DiscImages/CDRWin.cs:
	* DiscImageChef/Commands/Configure.cs:
	* DiscImageChef/Commands/DumpMedia.cs:
	* DiscImageChef/Commands/Statistics.cs:
	* DiscImageChef.Filters/ZZZNoFilter.cs:
	* DiscImageChef.DiscImages/TeleDisk.cs:
	* DiscImageChef.DiscImages/Apple2MG.cs:
	* DiscImageChef.Filters/OffsetStream.cs:
	* DiscImageChef.DiscImages/Parallels.cs:
	* DiscImageChef/Commands/ExtractFiles.cs:
	* DiscImageChef.DiscImages/DiskCopy42.cs:
	* DiscImageChef.DiscImages/Alcohol120.cs:
	* DiscImageChef.DiscImages/ZZZRawImage.cs:
	* DiscImageChef/Commands/CreateSidecar.cs:
	* DiscImageChef.DiscImages/ImagePlugin.cs:
	* DiscImageChef.DiscImages/BlindWrite5.cs:
	* DiscImageChef.DiscImages/BlindWrite4.cs:
	* DiscImageChef.Filters/ForcedSeekStream.cs:
	* DiscImageChef.Filters/Properties/AssemblyInfo.cs:
	* DiscImageChef.Filters/DiscImageChef.Filters.csproj:
	* DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj:
	  Added filters.

	* DiscImageChef.Filesystems/CPM/Info.cs:
	  Do not throw identification exceptions.

	* DiscImageChef/Plugins.cs:
	  Sorted plugins lists.
This commit is contained in:
2016-09-05 17:37:31 +01:00
parent e4c4b2572f
commit 71af0eda23
62 changed files with 2600 additions and 837 deletions

View File

@@ -36,6 +36,7 @@ using System.IO;
using System.Text.RegularExpressions;
using DiscImageChef.Console;
using DiscImageChef.CommonTypes;
using DiscImageChef.Filters;
namespace DiscImageChef.ImagePlugins
{
@@ -49,6 +50,8 @@ namespace DiscImageChef.ImagePlugins
{
/// <summary>Track #</summary>
public uint sequence;
/// <summary>Track filter</summary>
public Filter trackfilter;
/// <summary>Track file</summary>
public string trackfile;
/// <summary>Track byte offset in file</summary>
@@ -83,9 +86,8 @@ namespace DiscImageChef.ImagePlugins
#region Internal variables
string imagePath;
StreamReader gdiStream;
FileStream imageStream;
Stream imageStream;
/// <summary>Dictionary, index is track #, value is track number, or 0 if a TOC</summary>
Dictionary<uint, ulong> offsetmap;
GDIDisc discimage;
@@ -106,7 +108,6 @@ namespace DiscImageChef.ImagePlugins
{
Name = "Dreamcast GDI image";
PluginUUID = new Guid("281ECBF2-D2A7-414C-8497-1A33F6DCB2DD");
imagePath = "";
ImageInfo = new ImageInfo();
ImageInfo.readableSectorTags = new List<SectorTagType>();
ImageInfo.readableMediaTags = new List<MediaTagType>();
@@ -128,13 +129,12 @@ namespace DiscImageChef.ImagePlugins
}
// Due to .gdi format, this method must parse whole file, ignoring errors (those will be thrown by OpenImage()).
public override bool IdentifyImage(string imagePath)
public override bool IdentifyImage(Filter imageFilter)
{
this.imagePath = imagePath;
try
{
gdiStream = new StreamReader(this.imagePath);
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
gdiStream = new StreamReader(imageFilter.GetDataForkStream());
int line = 0;
int tracksFound = 0;
int tracks = 0;
@@ -169,30 +169,26 @@ namespace DiscImageChef.ImagePlugins
}
catch(Exception ex)
{
DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", this.imagePath);
DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", imageFilter.GetBasePath());
DicConsole.ErrorWriteLine("Exception: {0}", ex.Message);
DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace);
return false;
}
}
public override bool OpenImage(string imagePath)
public override bool OpenImage(Filter imageFilter)
{
if(imagePath == null)
if(imageFilter == null)
return false;
if(imagePath == "")
return false;
this.imagePath = imagePath;
try
{
gdiStream = new StreamReader(imagePath);
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
gdiStream = new StreamReader(imageFilter.GetDataForkStream());
int line = 0;
int tracksFound = 0;
int tracks = 0;
bool highDensity = false;
FileInfo trackFileInfo;
// Initialize all RegExs
Regex RegexTrack = new Regex(TrackRegEx);
@@ -210,6 +206,8 @@ namespace DiscImageChef.ImagePlugins
GDITrack currentTrack;
densitySeparationSectors = 0;
FiltersList filtersList = new FiltersList();
while(gdiStream.Peek() >= 0)
{
line++;
@@ -239,7 +237,8 @@ namespace DiscImageChef.ImagePlugins
currentTrack.offset = long.Parse(TrackMatch.Groups["offset"].Value);
currentTrack.sequence = uint.Parse(TrackMatch.Groups["track"].Value);
currentTrack.startSector = ulong.Parse(TrackMatch.Groups["start"].Value);
currentTrack.trackfile = TrackMatch.Groups["filename"].Value.Replace("\\\"", "\"").Trim(new[] { '"' });
currentTrack.trackfilter = filtersList.GetFilter(Path.Combine(imageFilter.GetParentFolder(), TrackMatch.Groups["filename"].Value.Replace("\\\"", "\"").Trim(new[] { '"' })));
currentTrack.trackfile = currentTrack.trackfilter.GetFilename();
if((currentTrack.startSector - currentStart) > 0)
{
@@ -257,11 +256,10 @@ namespace DiscImageChef.ImagePlugins
}
}
trackFileInfo = new FileInfo(currentTrack.trackfile);
if(((trackFileInfo.Length - currentTrack.offset) % currentTrack.bps) != 0)
if(((currentTrack.trackfilter.GetDataForkLength() - currentTrack.offset) % currentTrack.bps) != 0)
throw new ImageNotSupportedException("Track size not a multiple of sector size");
currentTrack.sectors = (ulong)((trackFileInfo.Length - currentTrack.offset) / currentTrack.bps);
currentTrack.sectors = (ulong)((currentTrack.trackfilter.GetDataForkLength() - currentTrack.offset) / currentTrack.bps);
currentTrack.sectors += currentTrack.pregap;
currentStart += currentTrack.sectors;
currentTrack.highDensity = highDensity;
@@ -364,7 +362,7 @@ namespace DiscImageChef.ImagePlugins
DicConsole.DebugWriteLine("GDI plugin", "\t\tTrack has pre-emphasis applied");
DicConsole.DebugWriteLine("GDI plugin", "\t\tTrack resides in file {0}, type defined as {1}, starting at byte {2}",
discimage.tracks[i].trackfile, discimage.tracks[i].tracktype, discimage.tracks[i].offset);
discimage.tracks[i].trackfilter, discimage.tracks[i].tracktype, discimage.tracks[i].offset);
}
DicConsole.DebugWriteLine("GDI plugin", "Building offset map");
@@ -417,10 +415,8 @@ namespace DiscImageChef.ImagePlugins
}
}
FileInfo fi = new FileInfo(discimage.tracks[0].trackfile);
ImageInfo.imageCreationTime = fi.CreationTimeUtc;
ImageInfo.imageLastModificationTime = fi.LastWriteTimeUtc;
ImageInfo.imageCreationTime = imageFilter.GetCreationTime();
ImageInfo.imageLastModificationTime = imageFilter.GetLastWriteTime();
ImageInfo.mediaType = discimage.disktype;
@@ -434,7 +430,7 @@ namespace DiscImageChef.ImagePlugins
}
catch(Exception ex)
{
DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", imagePath);
DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", imageFilter.GetBasePath());
DicConsole.ErrorWriteLine("Exception: {0}", ex.Message);
DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace);
return false;
@@ -623,22 +619,20 @@ namespace DiscImageChef.ImagePlugins
if(remainingSectors == 0)
return buffer;
imageStream = new FileStream(_track.trackfile, FileMode.Open, FileAccess.Read);
using(BinaryReader br = new BinaryReader(imageStream))
imageStream = _track.trackfilter.GetDataForkStream();
BinaryReader br = new BinaryReader(imageStream);
br.BaseStream.Seek(_track.offset + (long)(sectorAddress * (sector_offset + sector_size + sector_skip) + _track.pregap * _track.bps), SeekOrigin.Begin);
if(sector_offset == 0 && sector_skip == 0)
buffer = br.ReadBytes((int)(sector_size * remainingSectors));
else
{
br.BaseStream.Seek(_track.offset + (long)(sectorAddress * (sector_offset + sector_size + sector_skip) + _track.pregap * _track.bps), SeekOrigin.Begin);
if(sector_offset == 0 && sector_skip == 0)
buffer = br.ReadBytes((int)(sector_size * remainingSectors));
else
for(ulong i = 0; i < remainingSectors; i++)
{
for(ulong i = 0; i < remainingSectors; i++)
{
byte[] sector;
br.BaseStream.Seek(sector_offset, SeekOrigin.Current);
sector = br.ReadBytes((int)sector_size);
br.BaseStream.Seek(sector_skip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, (int)(i * sector_size), sector_size);
}
byte[] sector;
br.BaseStream.Seek(sector_offset, SeekOrigin.Current);
sector = br.ReadBytes((int)sector_size);
br.BaseStream.Seek(sector_skip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, (int)(i * sector_size), sector_size);
}
}
@@ -792,22 +786,20 @@ namespace DiscImageChef.ImagePlugins
if(remainingSectors == 0)
return buffer;
imageStream = new FileStream(_track.trackfile, FileMode.Open, FileAccess.Read);
using(BinaryReader br = new BinaryReader(imageStream))
imageStream = _track.trackfilter.GetDataForkStream();
BinaryReader br = new BinaryReader(imageStream);
br.BaseStream.Seek(_track.offset + (long)(sectorAddress * (sector_offset + sector_size + sector_skip) + _track.pregap * _track.bps), SeekOrigin.Begin);
if(sector_offset == 0 && sector_skip == 0)
buffer = br.ReadBytes((int)(sector_size * remainingSectors));
else
{
br.BaseStream.Seek(_track.offset + (long)(sectorAddress * (sector_offset + sector_size + sector_skip) + _track.pregap * _track.bps), SeekOrigin.Begin);
if(sector_offset == 0 && sector_skip == 0)
buffer = br.ReadBytes((int)(sector_size * remainingSectors));
else
for(ulong i = 0; i < remainingSectors; i++)
{
for(ulong i = 0; i < remainingSectors; i++)
{
byte[] sector;
br.BaseStream.Seek(sector_offset, SeekOrigin.Current);
sector = br.ReadBytes((int)sector_size);
br.BaseStream.Seek(sector_skip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, (int)(i * sector_size), sector_size);
}
byte[] sector;
br.BaseStream.Seek(sector_offset, SeekOrigin.Current);
sector = br.ReadBytes((int)sector_size);
br.BaseStream.Seek(sector_skip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, (int)(i * sector_size), sector_size);
}
}
@@ -931,22 +923,20 @@ namespace DiscImageChef.ImagePlugins
if(remainingSectors == 0)
return buffer;
imageStream = new FileStream(_track.trackfile, FileMode.Open, FileAccess.Read);
using(BinaryReader br = new BinaryReader(imageStream))
imageStream = _track.trackfilter.GetDataForkStream();
BinaryReader br = new BinaryReader(imageStream);
br.BaseStream.Seek(_track.offset + (long)(sectorAddress * (sector_offset + sector_size + sector_skip) + _track.pregap * _track.bps), SeekOrigin.Begin);
if(sector_offset == 0 && sector_skip == 0)
buffer = br.ReadBytes((int)(sector_size * remainingSectors));
else
{
br.BaseStream.Seek(_track.offset + (long)(sectorAddress * (sector_offset + sector_size + sector_skip) + _track.pregap * _track.bps), SeekOrigin.Begin);
if(sector_offset == 0 && sector_skip == 0)
buffer = br.ReadBytes((int)(sector_size * remainingSectors));
else
for(ulong i = 0; i < remainingSectors; i++)
{
for(ulong i = 0; i < remainingSectors; i++)
{
byte[] sector;
br.BaseStream.Seek(sector_offset, SeekOrigin.Current);
sector = br.ReadBytes((int)sector_size);
br.BaseStream.Seek(sector_skip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, (int)(i * sector_size), sector_size);
}
byte[] sector;
br.BaseStream.Seek(sector_offset, SeekOrigin.Current);
sector = br.ReadBytes((int)sector_size);
br.BaseStream.Seek(sector_skip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, (int)(i * sector_size), sector_size);
}
}
@@ -1027,6 +1017,7 @@ namespace DiscImageChef.ImagePlugins
_track.TrackSession = 1;
_track.TrackSequence = gdi_track.sequence;
_track.TrackType = gdi_track.tracktype;
_track.TrackFilter = gdi_track.trackfilter;
_track.TrackFile = gdi_track.trackfile;
_track.TrackFileOffset = (ulong)gdi_track.offset;
_track.TrackFileType = "BINARY";
@@ -1086,6 +1077,7 @@ namespace DiscImageChef.ImagePlugins
_track.TrackSession = 1;
_track.TrackSequence = gdi_track.sequence;
_track.TrackType = gdi_track.tracktype;
_track.TrackFilter = gdi_track.trackfilter;
_track.TrackFile = gdi_track.trackfile;
_track.TrackFileOffset = (ulong)gdi_track.offset;
_track.TrackFileType = "BINARY";