mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Remove all image thrown exceptions.
This commit is contained in:
Submodule Aaru.CommonTypes updated: 317f989c37...5f334edd29
@@ -33,6 +33,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
@@ -50,7 +51,7 @@ namespace Aaru.Filesystems
|
||||
var defsReader =
|
||||
XmlReader.Create(Assembly.GetExecutingAssembly().
|
||||
GetManifestResourceStream("Aaru.Filesystems.CPM.cpmdefs.xml") ??
|
||||
throw new InvalidOperationException());
|
||||
new MemoryStream());
|
||||
|
||||
var defsSerializer = new XmlSerializer(typeof(CpmDefinitions));
|
||||
_definitions = (CpmDefinitions)defsSerializer.Deserialize(defsReader);
|
||||
|
||||
@@ -43,7 +43,6 @@ using System.Xml.Serialization;
|
||||
using Aaru.Checksums;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.Console;
|
||||
using Aaru.Decoders;
|
||||
@@ -639,8 +638,10 @@ namespace Aaru.DiscImages
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new
|
||||
ImageNotSupportedException($"Found unsupported compression algorithm {(ushort)ddtHeader.compression}");
|
||||
ErrorMessage =
|
||||
$"Found unsupported compression algorithm {(ushort)ddtHeader.compression}";
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if(IsTape)
|
||||
@@ -706,8 +707,10 @@ namespace Aaru.DiscImages
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new
|
||||
ImageNotSupportedException($"Found unsupported compression algorithm {(ushort)ddtHeader.compression}");
|
||||
ErrorMessage =
|
||||
$"Found unsupported compression algorithm {(ushort)ddtHeader.compression}";
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint[] cdDdt = MemoryMarshal.Cast<byte, uint>(decompressedDdt).ToArray();
|
||||
|
||||
@@ -37,7 +37,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Decoders.CD;
|
||||
@@ -1491,13 +1490,8 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<CommonTypes.Structs.Track> GetSessionTracks(CommonTypes.Structs.Session session)
|
||||
{
|
||||
if(Sessions.Contains(session))
|
||||
return GetSessionTracks(session.Sequence);
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
}
|
||||
public List<CommonTypes.Structs.Track> GetSessionTracks(CommonTypes.Structs.Session session) =>
|
||||
Sessions.Contains(session) ? GetSessionTracks(session.Sequence) : null;
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<CommonTypes.Structs.Track> GetSessionTracks(ushort session)
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
using System.IO;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
@@ -93,8 +92,7 @@ namespace Aaru.DiscImages
|
||||
case RecordType.Sector:
|
||||
if(record.compression != CompressType.Compressed &&
|
||||
record.compression != CompressType.Uncompresed)
|
||||
throw new
|
||||
ImageNotSupportedException($"Found record with unknown compression type 0x{(ushort)record.compression:X4} at {stream.Position}");
|
||||
return ErrorNumber.NotSupported;
|
||||
|
||||
AaruConsole.DebugWriteLine("Apridisk plugin",
|
||||
"Found {4} sector record at {0} for cylinder {1} head {2} sector {3}",
|
||||
@@ -114,9 +112,7 @@ namespace Aaru.DiscImages
|
||||
stream.Seek(record.headerSize - recordSize + record.dataSize, SeekOrigin.Current);
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new
|
||||
ImageNotSupportedException($"Found record with unknown type 0x{(uint)record.type:X8} at {stream.Position}");
|
||||
default: return ErrorNumber.NotSupported;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,7 +121,7 @@ namespace Aaru.DiscImages
|
||||
|
||||
if(totalCylinders <= 0 ||
|
||||
totalHeads <= 0)
|
||||
throw new ImageNotSupportedException("No cylinders or heads found");
|
||||
return ErrorNumber.NotSupported;
|
||||
|
||||
_sectorsData = new byte[totalCylinders][][][];
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.Console;
|
||||
@@ -826,8 +825,7 @@ namespace Aaru.DiscImages
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
default:
|
||||
throw new FeatureSupportedButNotImplementedImageException("Feature not supported by image format");
|
||||
default: return ErrorNumber.NotSupported;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1243,7 +1241,7 @@ namespace Aaru.DiscImages
|
||||
if(Sessions.Contains(session))
|
||||
return GetSessionTracks(session.Sequence);
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -38,7 +38,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.CommonTypes.Structs.Devices.SCSI.Modes;
|
||||
@@ -2215,7 +2214,7 @@ namespace Aaru.DiscImages
|
||||
if(Sessions.Contains(session))
|
||||
return GetSessionTracks(session.Sequence);
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -84,7 +84,7 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
string line = _tocStream.ReadLine();
|
||||
|
||||
Match dm = dr.Match(line ?? throw new InvalidOperationException());
|
||||
Match dm = dr.Match(line ?? "");
|
||||
Match cm = cr.Match(line);
|
||||
|
||||
// Skip comments at start of file
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace Aaru.DiscImages
|
||||
lineNumber++;
|
||||
line = _tocStream.ReadLine();
|
||||
|
||||
matchDiskType = regexDiskType.Match(line ?? throw new InvalidOperationException());
|
||||
matchDiskType = regexDiskType.Match(line ?? "");
|
||||
matchComment = regexComment.Match(line);
|
||||
|
||||
// Skip comments at start of file
|
||||
@@ -149,7 +149,7 @@ namespace Aaru.DiscImages
|
||||
lineNumber++;
|
||||
line = _tocStream.ReadLine();
|
||||
|
||||
matchComment = regexComment.Match(line ?? throw new InvalidOperationException());
|
||||
matchComment = regexComment.Match(line ?? "");
|
||||
matchDiskType = regexDiskType.Match(line);
|
||||
Match matchMcn = regexMcn.Match(line);
|
||||
Match matchTrack = regexTrack.Match(line);
|
||||
@@ -1532,7 +1532,7 @@ namespace Aaru.DiscImages
|
||||
if(session == 1)
|
||||
return Tracks;
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
public sealed partial class CdrWin
|
||||
{
|
||||
// Due to .cue format, this method must parse whole file, ignoring errors (those will be thrown by OpenImage()).
|
||||
// Due to .cue format, this method must parse whole file, ignoring errors (those will be returned by OpenImage()).
|
||||
/// <inheritdoc />
|
||||
public bool Identify(IFilter imageFilter)
|
||||
{
|
||||
@@ -91,7 +91,7 @@ namespace Aaru.DiscImages
|
||||
var tr = new Regex(REGEX_CDTEXT);
|
||||
|
||||
// First line must be SESSION, REM, CATALOG, FILE or CDTEXTFILE.
|
||||
Match sm = sr.Match(line ?? throw new InvalidOperationException());
|
||||
Match sm = sr.Match(line ?? "");
|
||||
Match rm = rr.Match(line);
|
||||
Match cm = cr.Match(line);
|
||||
Match fm = fr.Match(line);
|
||||
|
||||
@@ -38,7 +38,6 @@ using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.Console;
|
||||
@@ -144,14 +143,21 @@ namespace Aaru.DiscImages
|
||||
uint trackSeq = uint.Parse(matchTrack.Groups[1].Value);
|
||||
|
||||
if(trackCount + 1 != trackSeq)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found TRACK {trackSeq} out of order in line {lineNumber}");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Found TRACK {trackSeq} out of order in line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
trackCount++;
|
||||
}
|
||||
|
||||
if(trackCount == 0)
|
||||
throw new FeatureUnsupportedImageException("No tracks found");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("No tracks found");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
CdrWinTrack[] cueTracks = new CdrWinTrack[trackCount];
|
||||
|
||||
@@ -458,8 +464,12 @@ namespace Aaru.DiscImages
|
||||
if(!inTrack)
|
||||
_discImage.Barcode = matchBarCode.Groups[1].Value;
|
||||
else
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found barcode field in incorrect place at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found barcode field in incorrect place at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
else if(matchCdText.Success)
|
||||
{
|
||||
@@ -468,8 +478,12 @@ namespace Aaru.DiscImages
|
||||
if(!inTrack)
|
||||
_discImage.CdTextFile = matchCdText.Groups[1].Value;
|
||||
else
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found CD-Text file field in incorrect place at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found CD-Text file field in incorrect place at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
else if(matchComposer.Success)
|
||||
{
|
||||
@@ -487,8 +501,12 @@ namespace Aaru.DiscImages
|
||||
if(!inTrack)
|
||||
_discImage.DiscId = matchDiskId.Groups[1].Value;
|
||||
else
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found CDDB ID field in incorrect place at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found CDDB ID field in incorrect place at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
else if(matchFile.Success)
|
||||
{
|
||||
@@ -541,13 +559,20 @@ namespace Aaru.DiscImages
|
||||
currentFile.DataFilter = filtersList.GetFilter(path);
|
||||
|
||||
if(currentFile.DataFilter == null)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
}
|
||||
else if((datafile[1] == ':' && datafile[2] == '\\') ||
|
||||
(datafile[0] == '\\' && datafile[1] == '\\') ||
|
||||
@@ -571,13 +596,20 @@ namespace Aaru.DiscImages
|
||||
currentFile.DataFilter = filtersList.GetFilter(path);
|
||||
|
||||
if(currentFile.DataFilter == null)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -585,8 +617,11 @@ namespace Aaru.DiscImages
|
||||
currentFile.DataFilter = filtersList.GetFilter(path);
|
||||
|
||||
if(currentFile.DataFilter == null)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"File \"{matchFile.Groups[1].Value}\" not found.");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
}
|
||||
|
||||
// File does exist, process it
|
||||
@@ -600,11 +635,13 @@ namespace Aaru.DiscImages
|
||||
case CDRWIN_DISK_TYPE_AIFF:
|
||||
case CDRWIN_DISK_TYPE_RIFF:
|
||||
case CDRWIN_DISK_TYPE_MP3:
|
||||
throw new
|
||||
FeatureSupportedButNotImplementedImageException($"Unsupported file type {currentFile.FileType}");
|
||||
AaruConsole.ErrorWriteLine($"Unsupported file type {currentFile.FileType}");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
default:
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Unknown file type {currentFile.FileType}");
|
||||
AaruConsole.ErrorWriteLine($"Unknown file type {currentFile.FileType}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
currentFile.Offset = 0;
|
||||
@@ -615,8 +652,12 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("CDRWin plugin", "Found FLAGS at line {0}", lineNumber);
|
||||
|
||||
if(!inTrack)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found FLAGS field in incorrect place at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found FLAGS field in incorrect place at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
currentTrack.FlagDcp |= matchFlags.Groups["dcp"].Value == "DCP";
|
||||
currentTrack.Flag4Ch |= matchFlags.Groups["quad"].Value == "4CH";
|
||||
@@ -637,7 +678,11 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("CDRWin plugin", "Found INDEX at line {0}", lineNumber);
|
||||
|
||||
if(!inTrack)
|
||||
throw new FeatureUnsupportedImageException($"Found INDEX before a track {lineNumber}");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Found INDEX before a track {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
ushort index = ushort.Parse(matchIndex.Groups[1].Value);
|
||||
int offset = CdrWinMsfToLba(matchIndex.Groups[2].Value) + cumulativeEmptyPregap;
|
||||
@@ -645,8 +690,11 @@ namespace Aaru.DiscImages
|
||||
if(index != 0 &&
|
||||
index != 1 &&
|
||||
currentTrack.Indexes.Count == 0)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found INDEX {index} before INDEX 00 or INDEX 01");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Found INDEX {index} before INDEX 00 or INDEX 01");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(index == 0 ||
|
||||
(index == 1 && !currentTrack.Indexes.ContainsKey(0)))
|
||||
@@ -714,7 +762,11 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("CDRWin plugin", "Found ISRC at line {0}", lineNumber);
|
||||
|
||||
if(!inTrack)
|
||||
throw new FeatureUnsupportedImageException($"Found ISRC before a track {lineNumber}");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Found ISRC before a track {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
currentTrack.Isrc = matchIsrc.Groups[1].Value;
|
||||
}
|
||||
@@ -725,8 +777,12 @@ namespace Aaru.DiscImages
|
||||
if(!inTrack)
|
||||
_discImage.Mcn = matchMcn.Groups[1].Value;
|
||||
else
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found CATALOG field in incorrect place at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found CATALOG field in incorrect place at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
else if(matchPerformer.Success)
|
||||
{
|
||||
@@ -744,16 +800,22 @@ namespace Aaru.DiscImages
|
||||
if(inTrack)
|
||||
currentTrack.Postgap = CdrWinMsfToLba(matchPostgap.Groups[1].Value);
|
||||
else
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found POSTGAP field before a track at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Found POSTGAP field before a track at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
else if(matchPregap.Success)
|
||||
{
|
||||
AaruConsole.DebugWriteLine("CDRWin plugin", "Found PREGAP at line {0}", lineNumber);
|
||||
|
||||
if(!inTrack)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found PREGAP field before a track at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Found PREGAP field before a track at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
currentEmptyPregap = CdrWinMsfToLba(matchPregap.Groups[1].Value);
|
||||
}
|
||||
@@ -780,8 +842,12 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("CDRWin plugin", "Found TRACK at line {0}", lineNumber);
|
||||
|
||||
if(currentFile.DataFilter == null)
|
||||
throw new
|
||||
FeatureUnsupportedImageException($"Found TRACK field before a file is defined at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found TRACK field before a file is defined at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(inTrack)
|
||||
{
|
||||
@@ -1317,12 +1383,20 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
if(_discImage.Tracks[i].Sequence == 1 &&
|
||||
i != 0)
|
||||
throw new ImageNotSupportedException("Unordered tracks");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Unordered tracks");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
var partition = new Partition();
|
||||
|
||||
if(!_discImage.Tracks[i].Indexes.TryGetValue(1, out _))
|
||||
throw new ImageNotSupportedException($"Track {_discImage.Tracks[i].Sequence} lacks index 01");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Track {_discImage.Tracks[i].Sequence} lacks index 01");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
// Index 01
|
||||
partition.Description = $"Track {_discImage.Tracks[i].Sequence}.";
|
||||
@@ -1506,43 +1580,47 @@ namespace Aaru.DiscImages
|
||||
leadouts.Count == 0 &&
|
||||
!_discImage.IsRedumpGigadisc &&
|
||||
_isCd)
|
||||
throw new
|
||||
FeatureUnsupportedImageException("This image is missing vital multi-session data and cannot be read correctly.");
|
||||
|
||||
if(!_isCd)
|
||||
{
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSync);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorHeader);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSubHeader);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEcc);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccP);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccQ);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc);
|
||||
AaruConsole.
|
||||
ErrorWriteLine("This image is missing vital multi-session data and cannot be read correctly.");
|
||||
|
||||
sessions = _discImage.Sessions.ToArray();
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
foreach(CdrWinTrack track in _discImage.Tracks)
|
||||
if(_isCd)
|
||||
return ErrorNumber.NoError;
|
||||
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSync);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorHeader);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSubHeader);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEcc);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccP);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccQ);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags);
|
||||
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc);
|
||||
|
||||
sessions = _discImage.Sessions.ToArray();
|
||||
|
||||
foreach(CdrWinTrack track in _discImage.Tracks)
|
||||
{
|
||||
track.Indexes.Remove(0);
|
||||
track.Pregap = 0;
|
||||
|
||||
for(int s = 0; s < sessions.Length; s++)
|
||||
{
|
||||
track.Indexes.Remove(0);
|
||||
track.Pregap = 0;
|
||||
|
||||
for(int s = 0; s < sessions.Length; s++)
|
||||
if(sessions[s].Sequence > 1 &&
|
||||
track.Sequence == sessions[s].StartTrack)
|
||||
{
|
||||
if(sessions[s].Sequence > 1 &&
|
||||
track.Sequence == sessions[s].StartTrack)
|
||||
{
|
||||
track.TrackFile.Offset += 307200;
|
||||
track.Sectors -= 150;
|
||||
sessions[s].StartSector = (ulong)track.Indexes[1];
|
||||
}
|
||||
track.TrackFile.Offset += 307200;
|
||||
track.Sectors -= 150;
|
||||
sessions[s].StartSector = (ulong)track.Indexes[1];
|
||||
}
|
||||
}
|
||||
|
||||
_discImage.Sessions = sessions.ToList();
|
||||
}
|
||||
|
||||
_discImage.Sessions = sessions.ToList();
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
catch(Exception ex)
|
||||
@@ -2262,7 +2340,7 @@ namespace Aaru.DiscImages
|
||||
if(_discImage.Sessions.Contains(session))
|
||||
return GetSessionTracks(session.Sequence);
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -34,8 +34,9 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
using SharpCompress.Compressors;
|
||||
using SharpCompress.Compressors.Deflate;
|
||||
@@ -61,10 +62,10 @@ namespace Aaru.DiscImages
|
||||
return (aaruTrack?.StartSector ?? 0) + relativeSector;
|
||||
}
|
||||
|
||||
byte[] GetHunk(ulong hunkNo)
|
||||
ErrorNumber GetHunk(ulong hunkNo, out byte[] buffer)
|
||||
{
|
||||
if(_hunkCache.TryGetValue(hunkNo, out byte[] hunk))
|
||||
return hunk;
|
||||
if(_hunkCache.TryGetValue(hunkNo, out buffer))
|
||||
return ErrorNumber.NoError;
|
||||
|
||||
switch(_mapVersion)
|
||||
{
|
||||
@@ -77,18 +78,26 @@ namespace Aaru.DiscImages
|
||||
_imageStream.Read(compHunk, 0, compHunk.Length);
|
||||
|
||||
if(length == _sectorsPerHunk * _imageInfo.SectorSize)
|
||||
hunk = compHunk;
|
||||
buffer = compHunk;
|
||||
else if((Compression)_hdrCompression > Compression.Zlib)
|
||||
throw new ImageNotSupportedException($"Unsupported compression {(Compression)_hdrCompression}");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Unsupported compression {(Compression)_hdrCompression}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
else
|
||||
{
|
||||
var zStream = new DeflateStream(new MemoryStream(compHunk), CompressionMode.Decompress);
|
||||
hunk = new byte[_sectorsPerHunk * _imageInfo.SectorSize];
|
||||
int read = zStream.Read(hunk, 0, (int)(_sectorsPerHunk * _imageInfo.SectorSize));
|
||||
buffer = new byte[_sectorsPerHunk * _imageInfo.SectorSize];
|
||||
int read = zStream.Read(buffer, 0, (int)(_sectorsPerHunk * _imageInfo.SectorSize));
|
||||
|
||||
if(read != _sectorsPerHunk * _imageInfo.SectorSize)
|
||||
throw new
|
||||
IOException($"Unable to decompress hunk correctly, got {read} bytes, expected {_sectorsPerHunk * _imageInfo.SectorSize}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Unable to decompress hunk correctly, got {read} bytes, expected {_sectorsPerHunk * _imageInfo.SectorSize}");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
zStream.Close();
|
||||
}
|
||||
@@ -101,7 +110,10 @@ namespace Aaru.DiscImages
|
||||
|
||||
switch((EntryFlagsV3)(entry.flags & 0x0F))
|
||||
{
|
||||
case EntryFlagsV3.Invalid: throw new ArgumentException("Invalid hunk found.");
|
||||
case EntryFlagsV3.Invalid:
|
||||
AaruConsole.ErrorWriteLine("Invalid hunk found.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
case EntryFlagsV3.Compressed:
|
||||
switch((Compression)_hdrCompression)
|
||||
{
|
||||
@@ -117,74 +129,96 @@ namespace Aaru.DiscImages
|
||||
var zStream =
|
||||
new DeflateStream(new MemoryStream(zHunk), CompressionMode.Decompress);
|
||||
|
||||
hunk = new byte[_bytesPerHunk];
|
||||
int read = zStream.Read(hunk, 0, (int)_bytesPerHunk);
|
||||
buffer = new byte[_bytesPerHunk];
|
||||
int read = zStream.Read(buffer, 0, (int)_bytesPerHunk);
|
||||
|
||||
if(read != _bytesPerHunk)
|
||||
throw new
|
||||
IOException($"Unable to decompress hunk correctly, got {read} bytes, expected {_bytesPerHunk}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Unable to decompress hunk correctly, got {read} bytes, expected {_bytesPerHunk}");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
zStream.Close();
|
||||
}
|
||||
|
||||
// TODO: Guess wth is MAME doing with these hunks
|
||||
else
|
||||
throw new
|
||||
ImageNotSupportedException("Compressed CD/GD-ROM hunks are not yet supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Compressed CD/GD-ROM hunks are not yet supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
break;
|
||||
case Compression.Av:
|
||||
throw new
|
||||
ImageNotSupportedException($"Unsupported compression {(Compression)_hdrCompression}");
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Unsupported compression {(Compression)_hdrCompression}");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
break;
|
||||
case EntryFlagsV3.Uncompressed:
|
||||
uncompressedV3:
|
||||
hunk = new byte[_bytesPerHunk];
|
||||
buffer = new byte[_bytesPerHunk];
|
||||
_imageStream.Seek((long)entry.offset, SeekOrigin.Begin);
|
||||
_imageStream.Read(hunk, 0, hunk.Length);
|
||||
_imageStream.Read(buffer, 0, buffer.Length);
|
||||
|
||||
break;
|
||||
case EntryFlagsV3.Mini:
|
||||
hunk = new byte[_bytesPerHunk];
|
||||
buffer = new byte[_bytesPerHunk];
|
||||
byte[] mini;
|
||||
mini = BigEndianBitConverter.GetBytes(entry.offset);
|
||||
|
||||
for(int i = 0; i < _bytesPerHunk; i++)
|
||||
hunk[i] = mini[i % 8];
|
||||
buffer[i] = mini[i % 8];
|
||||
|
||||
break;
|
||||
case EntryFlagsV3.SelfHunk: return GetHunk(entry.offset);
|
||||
case EntryFlagsV3.SelfHunk: return GetHunk(entry.offset, out buffer);
|
||||
case EntryFlagsV3.ParentHunk:
|
||||
throw new ImageNotSupportedException("Parent images are not supported");
|
||||
AaruConsole.ErrorWriteLine("Parent images are not supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
case EntryFlagsV3.SecondCompressed:
|
||||
throw new ImageNotSupportedException("FLAC is not supported");
|
||||
AaruConsole.ErrorWriteLine("FLAC is not supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
default:
|
||||
throw new ImageNotSupportedException($"Hunk type {entry.flags & 0xF} is not supported");
|
||||
AaruConsole.ErrorWriteLine($"Hunk type {entry.flags & 0xF} is not supported");
|
||||
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
break;
|
||||
case 5:
|
||||
if(_hdrCompression == 0)
|
||||
{
|
||||
hunk = new byte[_bytesPerHunk];
|
||||
buffer = new byte[_bytesPerHunk];
|
||||
_imageStream.Seek(_hunkTableSmall[hunkNo] * _bytesPerHunk, SeekOrigin.Begin);
|
||||
_imageStream.Read(hunk, 0, hunk.Length);
|
||||
_imageStream.Read(buffer, 0, buffer.Length);
|
||||
}
|
||||
else
|
||||
throw new ImageNotSupportedException("Compressed v5 hunks not yet supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Compressed v5 hunks not yet supported");
|
||||
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Unsupported hunk map version {_mapVersion}");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Unsupported hunk map version {_mapVersion}");
|
||||
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
if(_hunkCache.Count >= _maxBlockCache)
|
||||
_hunkCache.Clear();
|
||||
|
||||
_hunkCache.Add(hunkNo, hunk);
|
||||
_hunkCache.Add(hunkNo, buffer);
|
||||
|
||||
return hunk;
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -66,7 +66,8 @@ namespace Aaru.DiscImages
|
||||
if(_isHdd)
|
||||
return null;
|
||||
|
||||
throw new NotImplementedException();
|
||||
// TODO: Implement
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,6 @@ using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.CommonTypes.Structs.Devices.ATA;
|
||||
@@ -339,7 +338,7 @@ namespace Aaru.DiscImages
|
||||
// TODO: Check why reading is misaligned
|
||||
AaruConsole.ErrorWriteLine("CHD version 5 is not yet supported.");
|
||||
|
||||
return ErrorNumber.NotSupported;
|
||||
return ErrorNumber.NotImplemented;
|
||||
|
||||
HeaderV5 hdrV5 = Marshal.ByteArrayToStructureBigEndian<HeaderV5>(buffer);
|
||||
|
||||
@@ -1359,7 +1358,10 @@ namespace Aaru.DiscImages
|
||||
ulong hunkNo = sectorAddress / _sectorsPerHunk;
|
||||
ulong secOff = sectorAddress * sectorSize % (_sectorsPerHunk * sectorSize);
|
||||
|
||||
byte[] hunk = GetHunk(hunkNo);
|
||||
ErrorNumber errno = GetHunk(hunkNo, out byte[] hunk);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
|
||||
sector = new byte[_imageInfo.SectorSize];
|
||||
Array.Copy(hunk, (int)secOff, sector, 0, sector.Length);
|
||||
@@ -1490,7 +1492,10 @@ namespace Aaru.DiscImages
|
||||
ulong hunkNo = sectorAddress / _sectorsPerHunk;
|
||||
ulong secOff = sectorAddress * sectorSize % (_sectorsPerHunk * sectorSize);
|
||||
|
||||
byte[] hunk = GetHunk(hunkNo);
|
||||
ErrorNumber errno = GetHunk(hunkNo, out byte[] hunk);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
|
||||
sector = new byte[_imageInfo.SectorSize];
|
||||
Array.Copy(hunk, (int)secOff, sector, 0, sector.Length);
|
||||
@@ -1795,7 +1800,10 @@ namespace Aaru.DiscImages
|
||||
ulong hunkNo = sectorAddress / _sectorsPerHunk;
|
||||
ulong secOff = sectorAddress * sectorSize % (_sectorsPerHunk * sectorSize);
|
||||
|
||||
byte[] hunk = GetHunk(hunkNo);
|
||||
ErrorNumber errno = GetHunk(hunkNo, out byte[] hunk);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
|
||||
sector = new byte[_imageInfo.SectorSize];
|
||||
Array.Copy(hunk, (int)secOff, sector, 0, sector.Length);
|
||||
@@ -1921,22 +1929,11 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<Track> GetSessionTracks(Session session)
|
||||
{
|
||||
if(_isHdd)
|
||||
throw new FeaturedNotSupportedByDiscImageException("Cannot access optical tracks on a hard disk image");
|
||||
|
||||
return GetSessionTracks(session.Sequence);
|
||||
}
|
||||
public List<Track> GetSessionTracks(Session session) => _isHdd ? null : GetSessionTracks(session.Sequence);
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<Track> GetSessionTracks(ushort session)
|
||||
{
|
||||
if(_isHdd)
|
||||
throw new FeaturedNotSupportedByDiscImageException("Cannot access optical tracks on a hard disk image");
|
||||
|
||||
return _tracks.Values.Where(track => track.Session == session).ToList();
|
||||
}
|
||||
public List<Track> GetSessionTracks(ushort session) =>
|
||||
_isHdd ? null : _tracks.Values.Where(track => track.Session == session).ToList();
|
||||
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadSector(ulong sectorAddress, uint track, out byte[] buffer)
|
||||
|
||||
@@ -145,7 +145,14 @@ namespace Aaru.DiscImages
|
||||
var sha1Ctx = new Sha1Context();
|
||||
|
||||
for(uint i = 0; i < _totalHunks; i++)
|
||||
sha1Ctx.Update(GetHunk(i));
|
||||
{
|
||||
ErrorNumber errno = GetHunk(i, out byte[] buffer);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return null;
|
||||
|
||||
sha1Ctx.Update(buffer);
|
||||
}
|
||||
|
||||
calculated = sha1Ctx.Final();
|
||||
}
|
||||
@@ -154,7 +161,14 @@ namespace Aaru.DiscImages
|
||||
var md5Ctx = new Md5Context();
|
||||
|
||||
for(uint i = 0; i < _totalHunks; i++)
|
||||
md5Ctx.Update(GetHunk(i));
|
||||
{
|
||||
ErrorNumber errno = GetHunk(i, out byte[] buffer);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return null;
|
||||
|
||||
md5Ctx.Update(buffer);
|
||||
}
|
||||
|
||||
calculated = md5Ctx.Final();
|
||||
}
|
||||
|
||||
@@ -34,7 +34,6 @@ using System;
|
||||
using System.IO;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
@@ -67,7 +66,10 @@ namespace Aaru.DiscImages
|
||||
tracks = 160;
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Incorrect disk type {(byte)type}");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Incorrect disk type {(byte)type}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
byte[] trackBytes = new byte[tracks];
|
||||
@@ -76,7 +78,11 @@ namespace Aaru.DiscImages
|
||||
var cmpr = (Compression)stream.ReadByte();
|
||||
|
||||
if(cmpr != Compression.None)
|
||||
throw new FeatureSupportedButNotImplementedImageException("Compressed images are not supported.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Compressed images are not supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
int trackSize = 0;
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ namespace Aaru.DiscImages
|
||||
|
||||
var hdr = new Regex(CCD_IDENTIFIER);
|
||||
|
||||
Match hdm = hdr.Match(line ?? throw new InvalidOperationException());
|
||||
Match hdm = hdr.Match(line ?? "");
|
||||
|
||||
return hdm.Success;
|
||||
}
|
||||
|
||||
@@ -1385,7 +1385,7 @@ namespace Aaru.DiscImages
|
||||
if(Sessions.Contains(session))
|
||||
return GetSessionTracks(session.Sequence);
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -355,7 +355,11 @@ namespace Aaru.DiscImages
|
||||
_descriptorStream.WriteLine("PreGapMode=2");
|
||||
|
||||
break;
|
||||
default: throw new ArgumentOutOfRangeException();
|
||||
default:
|
||||
ErrorMessage =
|
||||
$"Unexpected first session track type {firstSessionTrack?.Type.ToString() ?? "null"}";
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
_descriptorStream.WriteLine("PreGapSubC=0");
|
||||
|
||||
@@ -35,7 +35,6 @@ using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Compression;
|
||||
using Aaru.Console;
|
||||
@@ -161,7 +160,9 @@ namespace Aaru.DiscImages
|
||||
temp = new byte[l];
|
||||
stream.Read(temp, 0, temp.Length);
|
||||
|
||||
throw new ImageNotSupportedException("LZH Compressed images not yet supported");
|
||||
AaruConsole.ErrorWriteLine("LZH Compressed images not yet supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -328,7 +329,8 @@ namespace Aaru.DiscImages
|
||||
ReadSectors(sectorAddress, 1, out buffer);
|
||||
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadSectorTag(ulong sectorAddress, SectorTagType tag, out byte[] buffer) => ReadSectorsTag(sectorAddress, 1, tag, out buffer);
|
||||
public ErrorNumber ReadSectorTag(ulong sectorAddress, SectorTagType tag, out byte[] buffer) =>
|
||||
ReadSectorsTag(sectorAddress, 1, tag, out buffer);
|
||||
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadSectors(ulong sectorAddress, uint length, out byte[] buffer)
|
||||
@@ -394,7 +396,7 @@ namespace Aaru.DiscImages
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
|
||||
errno = ReadSectorsTag(sectorAddress, length, SectorTagType.AppleSectorTag, out byte[] tags);
|
||||
errno = ReadSectorsTag(sectorAddress, length, SectorTagType.AppleSectorTag, out byte[] tags);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
|
||||
@@ -41,12 +41,6 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
public sealed partial class Dim
|
||||
{
|
||||
public List<Partition> Partitions =>
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
public List<Track> Tracks =>
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
public List<Session> Sessions =>
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
/// <inheritdoc />
|
||||
public string Name => "DIM Disk Image";
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -37,7 +37,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.Console;
|
||||
@@ -390,7 +389,10 @@ namespace Aaru.DiscImages
|
||||
currentOffset += trackLen * (ulong)(track.RawBytesPerSector + 96);
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Unknown read mode {readMode}");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Unknown read mode {readMode}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -416,8 +418,9 @@ namespace Aaru.DiscImages
|
||||
|
||||
break;
|
||||
case 1:
|
||||
throw
|
||||
new ImageNotSupportedException($"Invalid read mode {readMode} for this track");
|
||||
AaruConsole.ErrorWriteLine($"Invalid read mode {readMode} for this track");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
case 2:
|
||||
track.RawBytesPerSector = 2352;
|
||||
currentOffset += trackLen * (ulong)track.RawBytesPerSector;
|
||||
@@ -505,7 +508,10 @@ namespace Aaru.DiscImages
|
||||
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Unknown read mode {readMode}");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Unknown read mode {readMode}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -521,8 +527,9 @@ namespace Aaru.DiscImages
|
||||
switch(readMode)
|
||||
{
|
||||
case 0:
|
||||
throw
|
||||
new ImageNotSupportedException($"Invalid read mode {readMode} for this track");
|
||||
AaruConsole.ErrorWriteLine($"Invalid read mode {readMode} for this track");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
case 1:
|
||||
track.RawBytesPerSector = 2336;
|
||||
|
||||
@@ -584,11 +591,17 @@ namespace Aaru.DiscImages
|
||||
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Unknown read mode {readMode}");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Unknown read mode {readMode}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Unknown track mode {trackMode}");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Unknown track mode {trackMode}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
track.File = imageFilter.Filename;
|
||||
@@ -1340,7 +1353,7 @@ namespace Aaru.DiscImages
|
||||
if(Sessions.Contains(session))
|
||||
return GetSessionTracks(session.Sequence);
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
public sealed partial class Gdi
|
||||
{
|
||||
// Due to .gdi format, this method must parse whole file, ignoring errors (those will be thrown by OpenImage()).
|
||||
// Due to .gdi format, this method must parse whole file, ignoring errors (those will be returned by OpenImage()).
|
||||
/// <inheritdoc />
|
||||
public bool Identify(IFilter imageFilter)
|
||||
{
|
||||
@@ -95,7 +95,7 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
var regexTrack = new Regex(REGEX_TRACK);
|
||||
|
||||
Match trackMatch = regexTrack.Match(line ?? throw new InvalidOperationException());
|
||||
Match trackMatch = regexTrack.Match(line ?? "");
|
||||
|
||||
if(!trackMatch.Success)
|
||||
return false;
|
||||
|
||||
@@ -37,7 +37,6 @@ using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.Console;
|
||||
@@ -85,14 +84,22 @@ namespace Aaru.DiscImages
|
||||
if(lineNumber == 1)
|
||||
{
|
||||
if(!int.TryParse(line, out _))
|
||||
throw new ImageNotSupportedException("Not a correct Dreamcast GDI image");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Not a correct Dreamcast GDI image");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Match trackMatch = regexTrack.Match(line ?? throw new InvalidOperationException());
|
||||
Match trackMatch = regexTrack.Match(line ?? "");
|
||||
|
||||
if(!trackMatch.Success)
|
||||
throw new ImageNotSupportedException($"Unknown line \"{line}\" at line {lineNumber}");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Unknown line \"{line}\" at line {lineNumber}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine("GDI plugin",
|
||||
"Found track {0} starts at {1} flags {2} type {3} file {4} offset {5} at line {6}",
|
||||
@@ -132,7 +139,11 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
if((currentTrack.TrackFilter.DataForkLength - currentTrack.Offset) % currentTrack.Bps != 0)
|
||||
throw new ImageNotSupportedException("Track size not a multiple of sector size");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Track size not a multiple of sector size");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
currentTrack.Sectors = (ulong)((currentTrack.TrackFilter.DataForkLength - currentTrack.Offset) /
|
||||
currentTrack.Bps);
|
||||
@@ -257,7 +268,11 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
if(_discImage.Tracks[i].Sequence == 1 &&
|
||||
i != 0)
|
||||
throw new ImageNotSupportedException("Unordered tracks");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Unordered tracks");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
// Index 01
|
||||
var partition = new Partition
|
||||
@@ -856,7 +871,7 @@ namespace Aaru.DiscImages
|
||||
if(_discImage.Sessions.Contains(session))
|
||||
return GetSessionTracks(session.Sequence);
|
||||
|
||||
throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -875,7 +890,7 @@ namespace Aaru.DiscImages
|
||||
expectedDensity = true;
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException("Session does not exist in disc image");
|
||||
default: return null;
|
||||
}
|
||||
|
||||
foreach(GdiTrack gdiTrack in _discImage.Tracks)
|
||||
|
||||
@@ -31,14 +31,17 @@
|
||||
// ****************************************************************************/
|
||||
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
|
||||
namespace Aaru.DiscImages
|
||||
{
|
||||
public sealed partial class Gdi
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadMediaTag(MediaTagType tag, out byte[] buffer) =>
|
||||
throw new FeatureSupportedButNotImplementedImageException("Feature not supported by image format");
|
||||
public ErrorNumber ReadMediaTag(MediaTagType tag, out byte[] buffer)
|
||||
{
|
||||
buffer = null;
|
||||
|
||||
return ErrorNumber.NoData;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,6 +33,8 @@
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.Console;
|
||||
|
||||
namespace Aaru.DiscImages
|
||||
{
|
||||
@@ -96,14 +98,18 @@ namespace Aaru.DiscImages
|
||||
return true;
|
||||
}
|
||||
|
||||
void ReadTrackIntoCache(Stream stream, int trackNum)
|
||||
ErrorNumber ReadTrackIntoCache(Stream stream, int trackNum)
|
||||
{
|
||||
byte[] trackData = new byte[_imageInfo.SectorSize * _imageInfo.SectorsPerTrack];
|
||||
byte[] blkHeader = new byte[3];
|
||||
|
||||
// check that track is present
|
||||
if(_trackOffset[trackNum] == -1)
|
||||
throw new InvalidDataException("Tried reading a track that is not present in image");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Tried reading a track that is not present in image");
|
||||
|
||||
return ErrorNumber.SectorNotFound;
|
||||
}
|
||||
|
||||
stream.Seek(_trackOffset[trackNum], SeekOrigin.Begin);
|
||||
|
||||
@@ -135,10 +141,16 @@ namespace Aaru.DiscImages
|
||||
|
||||
// check that the number of bytes decompressed matches a whole track
|
||||
if(dIndex != _imageInfo.SectorSize * _imageInfo.SectorsPerTrack)
|
||||
throw new InvalidDataException("Track decompression yielded incomplete data");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Track decompression yielded incomplete data");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
// store track in cache
|
||||
_trackCache[trackNum] = trackData;
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -137,7 +137,12 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
// track is present in file, make sure it has been loaded
|
||||
if(!_trackCache.ContainsKey(trackNum))
|
||||
ReadTrackIntoCache(_hdcpImageFilter.GetDataForkStream(), trackNum);
|
||||
{
|
||||
ErrorNumber errno = ReadTrackIntoCache(_hdcpImageFilter.GetDataForkStream(), trackNum);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
}
|
||||
|
||||
Array.Copy(_trackCache[trackNum], sectorOffset * _imageInfo.SectorSize, buffer, 0,
|
||||
_imageInfo.SectorSize);
|
||||
|
||||
@@ -35,7 +35,6 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
@@ -158,7 +157,10 @@ namespace Aaru.DiscImages
|
||||
track.Add(idmap[i], data);
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Invalid sector type {(byte)type}");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Invalid sector type {(byte)type}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,12 +219,14 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadSector(ulong sectorAddress, out byte[] buffer) => ReadSectors(sectorAddress, 1, out buffer);
|
||||
public ErrorNumber ReadSector(ulong sectorAddress, out byte[] buffer) =>
|
||||
ReadSectors(sectorAddress, 1, out buffer);
|
||||
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadSectors(ulong sectorAddress, uint length, out byte[] buffer)
|
||||
{
|
||||
buffer = null;
|
||||
|
||||
if(sectorAddress > _imageInfo.Sectors - 1)
|
||||
return ErrorNumber.OutOfRange;
|
||||
|
||||
|
||||
@@ -125,10 +125,11 @@ namespace Aaru.DiscImages
|
||||
break;
|
||||
}
|
||||
|
||||
var trackFilter = new ZZZNoFilter();
|
||||
var trackFilter = new ZZZNoFilter();
|
||||
ErrorNumber errno = trackFilter.Open(trackfile);
|
||||
|
||||
if(trackFilter.Open(trackfile) != ErrorNumber.NoError)
|
||||
throw new IOException("Could not open KryoFlux track file.");
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
|
||||
_imageInfo.CreationTime = DateTime.MaxValue;
|
||||
_imageInfo.LastModificationTime = DateTime.MinValue;
|
||||
|
||||
@@ -36,7 +36,6 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Compression;
|
||||
using Aaru.Console;
|
||||
@@ -149,13 +148,17 @@ namespace Aaru.DiscImages
|
||||
switch(bChnk.type)
|
||||
{
|
||||
case CHUNK_TYPE_KENCODE:
|
||||
throw new
|
||||
ImageNotSupportedException("Chunks compressed with KenCode are not yet supported.");
|
||||
AaruConsole.ErrorWriteLine("Chunks compressed with KenCode are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
case CHUNK_TYPE_LZH:
|
||||
throw new ImageNotSupportedException("Chunks compressed with LZH are not yet supported.");
|
||||
AaruConsole.ErrorWriteLine("Chunks compressed with LZH are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
case CHUNK_TYPE_STUFFIT:
|
||||
throw new
|
||||
ImageNotSupportedException("Chunks compressed with StuffIt! are not yet supported.");
|
||||
AaruConsole.ErrorWriteLine("Chunks compressed with StuffIt! are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
// TODO: Handle compressed chunks
|
||||
@@ -163,7 +166,11 @@ namespace Aaru.DiscImages
|
||||
(bChnk.type > CHUNK_TYPE_ADC && bChnk.type < CHUNK_TYPE_STUFFIT) ||
|
||||
(bChnk.type > CHUNK_TYPE_STUFFIT && bChnk.type < CHUNK_TYPE_END) ||
|
||||
bChnk.type == 1)
|
||||
throw new ImageNotSupportedException($"Unsupported chunk type 0x{bChnk.type:X8} found");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Unsupported chunk type 0x{bChnk.type:X8} found");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_chunks.Add(bChnk.sector, bChnk);
|
||||
}
|
||||
@@ -172,10 +179,18 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
if(_header.segmented > 0)
|
||||
throw new ImageNotSupportedException("Segmented images are not yet supported.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Segmented images are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
if(_header.encrypted > 0)
|
||||
throw new ImageNotSupportedException("Encrypted images are not yet supported.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Encrypted images are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
switch(_imageInfo.Sectors)
|
||||
{
|
||||
|
||||
@@ -113,8 +113,7 @@ namespace Aaru.DiscImages
|
||||
buffer = null;
|
||||
|
||||
if(sectorAddress > _imageInfo.Sectors - 1)
|
||||
throw new ArgumentOutOfRangeException(nameof(sectorAddress),
|
||||
$"Sector address {sectorAddress} not found");
|
||||
return ErrorNumber.OutOfRange;
|
||||
|
||||
if(_empty)
|
||||
{
|
||||
|
||||
@@ -36,7 +36,6 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Extents;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
@@ -82,7 +81,11 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("PartClone plugin", "pHdr.bitmagic = {0}", StringHandlers.CToString(bitmagic));
|
||||
|
||||
if(!_biTmAgIc.SequenceEqual(bitmagic))
|
||||
throw new ImageNotSupportedException("Could not find partclone BiTmAgIc, not continuing...");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Could not find partclone BiTmAgIc, not continuing...");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_dataOff = stream.Position;
|
||||
AaruConsole.DebugWriteLine("PartClone plugin", "pHdr.dataOff = {0}", _dataOff);
|
||||
|
||||
@@ -35,7 +35,6 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Extents;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
@@ -72,7 +71,11 @@ namespace Aaru.DiscImages
|
||||
|
||||
// TODO: Support multifile volumes
|
||||
if(_cVolumeHeader.volumeNumber > 0)
|
||||
throw new FeatureSupportedButNotImplementedImageException("Support for multiple volumes not supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Support for multiple volumes not supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
hdrB = new byte[Marshal.SizeOf<MainHeader>()];
|
||||
stream.Read(hdrB, 0, Marshal.SizeOf<MainHeader>());
|
||||
@@ -204,7 +207,11 @@ namespace Aaru.DiscImages
|
||||
|
||||
// partimage 0.6.1 does not support them either
|
||||
if(_cMainHeader.dwEncryptAlgo != PEncryption.None)
|
||||
throw new ImageNotSupportedException("Encrypted images are currently not supported.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Encrypted images are currently not supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
string magic;
|
||||
|
||||
@@ -216,7 +223,11 @@ namespace Aaru.DiscImages
|
||||
magic = StringHandlers.CToString(hdrB);
|
||||
|
||||
if(!magic.Equals(MAGIC_BEGIN_MBRBACKUP))
|
||||
throw new ImageNotSupportedException("Cannot find MBRs");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cannot find MBRs");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
stream.Seek(_cMainHeader.dwMbrSize * _cMainHeader.dwMbrCount, SeekOrigin.Current);
|
||||
}
|
||||
@@ -229,7 +240,11 @@ namespace Aaru.DiscImages
|
||||
magic = StringHandlers.CToString(hdrB);
|
||||
|
||||
if(!magic.Equals(MAGIC_BEGIN_LOCALHEADER))
|
||||
throw new ImageNotSupportedException("Cannot find local header");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cannot find local header");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
hdrB = new byte[Marshal.SizeOf<CLocalHeader>()];
|
||||
stream.Read(hdrB, 0, Marshal.SizeOf<CLocalHeader>());
|
||||
@@ -259,7 +274,11 @@ namespace Aaru.DiscImages
|
||||
magic = StringHandlers.CToString(hdrB);
|
||||
|
||||
if(!magic.Equals(MAGIC_BEGIN_BITMAP))
|
||||
throw new ImageNotSupportedException("Cannot find bitmap");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cannot find bitmap");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_bitmap = new byte[localHeader.qwBitmapSize];
|
||||
stream.Read(_bitmap, 0, (int)localHeader.qwBitmapSize);
|
||||
@@ -269,7 +288,11 @@ namespace Aaru.DiscImages
|
||||
magic = StringHandlers.CToString(hdrB);
|
||||
|
||||
if(!magic.Equals(MAGIC_BEGIN_INFO))
|
||||
throw new ImageNotSupportedException("Cannot find info block");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cannot find info block");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
// Skip info block and its checksum
|
||||
stream.Seek(16384 + 4, SeekOrigin.Current);
|
||||
@@ -279,7 +302,11 @@ namespace Aaru.DiscImages
|
||||
magic = StringHandlers.CToString(hdrB);
|
||||
|
||||
if(!magic.Equals(MAGIC_BEGIN_DATABLOCKS))
|
||||
throw new ImageNotSupportedException("Cannot find data blocks");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cannot find data blocks");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_dataOff = stream.Position;
|
||||
|
||||
@@ -293,8 +320,11 @@ namespace Aaru.DiscImages
|
||||
magic = StringHandlers.CToString(hdrB);
|
||||
|
||||
if(!magic.Equals(MAGIC_BEGIN_TAIL))
|
||||
throw new
|
||||
ImageNotSupportedException("Cannot find tail. Multiple volumes are not supported or image is corrupt.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cannot find tail. Multiple volumes are not supported or image is corrupt.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine("Partimage plugin", "Filling extents");
|
||||
DateTime start = DateTime.Now;
|
||||
|
||||
@@ -73,31 +73,57 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("QCOW plugin", "qHdr.l1_table_offset = {0}", _qHdr.l1_table_offset);
|
||||
|
||||
if(_qHdr.size <= 1)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.size), "Image size is too small");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Image size is too small");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_qHdr.cluster_bits < 9 ||
|
||||
_qHdr.cluster_bits > 16)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_bits),
|
||||
"Cluster size must be between 512 bytes and 64 Kbytes");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cluster size must be between 512 bytes and 64 Kbytes");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_qHdr.l2_bits < 9 - 3 ||
|
||||
_qHdr.l2_bits > 16 - 3)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.l2_bits),
|
||||
"L2 size must be between 512 bytes and 64 Kbytes");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("L2 size must be between 512 bytes and 64 Kbytes");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_qHdr.crypt_method > QCOW_ENCRYPTION_AES)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.crypt_method), "Invalid encryption method");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Invalid encryption method");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_qHdr.crypt_method > QCOW_ENCRYPTION_NONE)
|
||||
throw new NotImplementedException("AES encrypted images not yet supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("AES encrypted images not yet supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
if(_qHdr.backing_file_offset != 0)
|
||||
throw new NotImplementedException("Differencing images not yet supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Differencing images not yet supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
int shift = _qHdr.cluster_bits + _qHdr.l2_bits;
|
||||
|
||||
if(_qHdr.size > ulong.MaxValue - (ulong)(1 << shift))
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.size), "Image is too large");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Image is too large");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_clusterSize = 1 << _qHdr.cluster_bits;
|
||||
_clusterSectors = 1 << (_qHdr.cluster_bits - 9);
|
||||
|
||||
@@ -185,8 +185,11 @@ namespace Aaru.DiscImages
|
||||
ulong l1Off = (byteAddress & _l1Mask) >> _l1Shift;
|
||||
|
||||
if((long)l1Off >= _l1Table.LongLength)
|
||||
throw new ArgumentOutOfRangeException(nameof(l1Off),
|
||||
$"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}");
|
||||
{
|
||||
ErrorMessage = $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}";
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if(_l1Table[l1Off] == 0)
|
||||
{
|
||||
|
||||
@@ -36,7 +36,6 @@ using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
@@ -87,26 +86,49 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("QCOW plugin", "qHdr.header_length = {0}", _qHdr.header_length);
|
||||
|
||||
if((_qHdr.features & QCOW_FEATURE_MASK) != 0)
|
||||
throw new
|
||||
ImageNotSupportedException($"Unknown incompatible features {_qHdr.features & QCOW_FEATURE_MASK:X} enabled, not proceeding.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Unknown incompatible features {_qHdr.features & QCOW_FEATURE_MASK:X} enabled, not proceeding.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
if(_qHdr.size <= 1)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.size), "Image size is too small");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Image size is too small");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_qHdr.cluster_bits < 9 ||
|
||||
_qHdr.cluster_bits > 16)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_bits),
|
||||
"Cluster size must be between 512 bytes and 64 Kbytes");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cluster size must be between 512 bytes and 64 Kbytes");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_qHdr.crypt_method > QCOW_ENCRYPTION_AES)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.crypt_method), "Invalid encryption method");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Invalid encryption method");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_qHdr.crypt_method > QCOW_ENCRYPTION_NONE)
|
||||
throw new NotImplementedException("AES encrypted images not yet supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("AES encrypted images not yet supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
if(_qHdr.backing_file_offset != 0)
|
||||
throw new NotImplementedException("Differencing images not yet supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Differencing images not yet supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
_clusterSize = 1 << (int)_qHdr.cluster_bits;
|
||||
_clusterSectors = 1 << ((int)_qHdr.cluster_bits - 9);
|
||||
|
||||
@@ -213,8 +213,11 @@ namespace Aaru.DiscImages
|
||||
ulong l1Off = (byteAddress & _l1Mask) >> _l1Shift;
|
||||
|
||||
if((long)l1Off >= _l1Table.LongLength)
|
||||
throw new ArgumentOutOfRangeException(nameof(l1Off),
|
||||
$"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}");
|
||||
{
|
||||
ErrorMessage = $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}";
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if(_l1Table[l1Off] == 0)
|
||||
{
|
||||
|
||||
@@ -70,31 +70,46 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("QED plugin", "qHdr.backing_file_size = {0}", _qHdr.backing_file_size);
|
||||
|
||||
if(_qHdr.image_size <= 1)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.image_size), "Image size is too small");
|
||||
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Image size is too small");
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
if(!IsPowerOfTwo(_qHdr.cluster_size))
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_size), "Cluster size must be a power of 2");
|
||||
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cluster size must be a power of 2");
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
if(_qHdr.cluster_size < 4096 ||
|
||||
_qHdr.cluster_size > 67108864)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.cluster_size),
|
||||
"Cluster size must be between 4 Kbytes and 64 Mbytes");
|
||||
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cluster size must be between 4 Kbytes and 64 Mbytes");
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
if(!IsPowerOfTwo(_qHdr.table_size))
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.table_size), "Table size must be a power of 2");
|
||||
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Table size must be a power of 2");
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
if(_qHdr.table_size < 1 ||
|
||||
_qHdr.table_size > 16)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.table_size),
|
||||
{
|
||||
AaruConsole.ErrorWriteLine(
|
||||
"Table size must be between 1 and 16 clusters");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
if((_qHdr.features & QED_FEATURE_MASK) > 0)
|
||||
throw new ArgumentOutOfRangeException(nameof(_qHdr.features),
|
||||
{
|
||||
AaruConsole.ErrorWriteLine(
|
||||
$"Image uses unknown incompatible features {_qHdr.features & QED_FEATURE_MASK:X}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
if((_qHdr.features & QED_FEATURE_BACKING_FILE) == QED_FEATURE_BACKING_FILE)
|
||||
throw new NotImplementedException("Differencing images not yet supported");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Differencing images not yet supported");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
_clusterSectors = _qHdr.cluster_size / 512;
|
||||
_tableSize = _qHdr.cluster_size * _qHdr.table_size / 8;
|
||||
|
||||
|
||||
@@ -176,8 +176,11 @@ namespace Aaru.DiscImages
|
||||
ulong l1Off = (byteAddress & _l1Mask) >> _l1Shift;
|
||||
|
||||
if((long)l1Off >= _l1Table.LongLength)
|
||||
throw new ArgumentOutOfRangeException(nameof(l1Off),
|
||||
$"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}");
|
||||
{
|
||||
ErrorMessage = $"Trying to write past L1 table, position {l1Off} of a max {_l1Table.LongLength}";
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if(_l1Table[l1Off] == 0)
|
||||
{
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
using System;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
|
||||
@@ -69,9 +69,10 @@ namespace Aaru.DiscImages
|
||||
return crc;
|
||||
}
|
||||
|
||||
static byte[] DecodeTeleDiskData(byte sectorSize, byte encodingType, byte[] encodedData)
|
||||
static ErrorNumber DecodeTeleDiskData(byte sectorSize, byte encodingType, byte[] encodedData,
|
||||
out byte[] decodedData)
|
||||
{
|
||||
byte[] decodedData;
|
||||
decodedData = null;
|
||||
|
||||
switch(sectorSize)
|
||||
{
|
||||
@@ -103,7 +104,10 @@ namespace Aaru.DiscImages
|
||||
decodedData = new byte[8192];
|
||||
|
||||
break;
|
||||
default: throw new ImageNotSupportedException($"Sector size {sectorSize} is incorrect.");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Sector size {sectorSize} is incorrect.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
switch(encodingType)
|
||||
@@ -189,10 +193,13 @@ namespace Aaru.DiscImages
|
||||
|
||||
break;
|
||||
}
|
||||
default: throw new ImageNotSupportedException($"Data encoding {encodingType} is incorrect.");
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Data encoding {encodingType} is incorrect.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
return decodedData;
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
|
||||
MediaType DecodeTeleDiskDiskType()
|
||||
|
||||
@@ -34,7 +34,6 @@ using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Compression;
|
||||
using Aaru.Console;
|
||||
@@ -281,7 +280,11 @@ namespace Aaru.DiscImages
|
||||
|
||||
if(totalCylinders <= 0 ||
|
||||
totalHeads <= 0)
|
||||
throw new ImageNotSupportedException("No cylinders or heads found");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("No cylinders or heads found");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
bool hasLeadOutOnHead0 = false;
|
||||
bool hasLeadOutOnHead1 = false;
|
||||
@@ -451,7 +454,11 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("TeleDisk plugin", "\t\tData encoding: 0x{0:X2}",
|
||||
teleDiskData.DataEncoding);
|
||||
|
||||
decodedData = DecodeTeleDiskData(teleDiskSector.SectorSize, teleDiskData.DataEncoding, data);
|
||||
ErrorNumber errno = DecodeTeleDiskData(teleDiskSector.SectorSize, teleDiskData.DataEncoding,
|
||||
data, out decodedData);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
|
||||
byte tdSectorCalculatedCrc = (byte)(TeleDiskCrc(0, decodedData) & 0xFF);
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Compression;
|
||||
using Aaru.Console;
|
||||
@@ -77,7 +76,11 @@ namespace Aaru.DiscImages
|
||||
_footer = Marshal.ByteArrayToStructureBigEndian<Footer>(footerB);
|
||||
|
||||
if(_footer.signature != UDIF_SIGNATURE)
|
||||
throw new Exception("Unable to find UDIF signature.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Unable to find UDIF signature.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
AaruConsole.VerboseWriteLine("Found obsolete UDIF format.");
|
||||
}
|
||||
@@ -134,18 +137,30 @@ namespace Aaru.DiscImages
|
||||
var rsrc = new ResourceFork(rsrcB);
|
||||
|
||||
if(!rsrc.ContainsKey(BLOCK_OS_TYPE))
|
||||
throw new
|
||||
ImageNotSupportedException("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
Resource blkxRez = rsrc.GetResource(BLOCK_OS_TYPE);
|
||||
|
||||
if(blkxRez == null)
|
||||
throw new
|
||||
ImageNotSupportedException("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(blkxRez.GetIds().Length == 0)
|
||||
throw new
|
||||
ImageNotSupportedException("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
blkxList.AddRange(blkxRez.GetIds().Select(blkxId => blkxRez.GetResource(blkxId)));
|
||||
|
||||
@@ -165,25 +180,45 @@ namespace Aaru.DiscImages
|
||||
var plist = (NSDictionary)XmlPropertyListParser.Parse(plistB);
|
||||
|
||||
if(plist == null)
|
||||
throw new Exception("Could not parse property list.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Could not parse property list.");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
if(!plist.TryGetValue(RESOURCE_FORK_KEY, out NSObject rsrcObj))
|
||||
throw new Exception("Could not retrieve resource fork.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Could not retrieve resource fork.");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
var rsrc = (NSDictionary)rsrcObj;
|
||||
|
||||
if(!rsrc.TryGetValue(BLOCK_KEY, out NSObject blkxObj))
|
||||
throw new Exception("Could not retrieve block chunks array.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Could not retrieve block chunks array.");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
NSObject[] blkx = ((NSArray)blkxObj).GetArray();
|
||||
|
||||
foreach(NSDictionary part in blkx.Cast<NSDictionary>())
|
||||
{
|
||||
if(!part.TryGetValue("Name", out _))
|
||||
throw new Exception("Could not retrieve Name");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Could not retrieve Name");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
if(!part.TryGetValue("Data", out NSObject dataObj))
|
||||
throw new Exception("Could not retrieve Data");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Could not retrieve Data");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
blkxList.Add(((NSData)dataObj).Bytes);
|
||||
}
|
||||
@@ -199,7 +234,11 @@ namespace Aaru.DiscImages
|
||||
else
|
||||
{
|
||||
if(imageFilter.ResourceForkLength == 0)
|
||||
throw new Exception("This image needs the resource fork to work.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("This image needs the resource fork to work.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine("UDIF plugin", "Reading resource fork.");
|
||||
Stream rsrcStream = imageFilter.GetResourceForkStream();
|
||||
@@ -211,18 +250,30 @@ namespace Aaru.DiscImages
|
||||
var rsrc = new ResourceFork(rsrcB);
|
||||
|
||||
if(!rsrc.ContainsKey(BLOCK_OS_TYPE))
|
||||
throw new
|
||||
ImageNotSupportedException("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
Resource blkxRez = rsrc.GetResource(BLOCK_OS_TYPE);
|
||||
|
||||
if(blkxRez == null)
|
||||
throw new
|
||||
ImageNotSupportedException("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(blkxRez.GetIds().Length == 0)
|
||||
throw new
|
||||
ImageNotSupportedException("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("Image resource fork doesn't contain UDIF block chunks. Please fill an issue and send it to us.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
blkxList.AddRange(blkxRez.GetIds().Select(blkxId => blkxRez.GetResource(blkxId)));
|
||||
|
||||
@@ -287,8 +338,11 @@ namespace Aaru.DiscImages
|
||||
_imageInfo.Sectors = 0;
|
||||
|
||||
if(blkxList.Count == 0)
|
||||
throw new
|
||||
ImageNotSupportedException("Could not retrieve block chunks. Please fill an issue and send it to us.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Could not retrieve block chunks. Please fill an issue and send it to us.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_buffersize = 0;
|
||||
|
||||
@@ -354,19 +408,30 @@ namespace Aaru.DiscImages
|
||||
|
||||
// TODO: Handle compressed chunks
|
||||
case CHUNK_TYPE_KENCODE:
|
||||
throw new
|
||||
ImageNotSupportedException("Chunks compressed with KenCode are not yet supported.");
|
||||
AaruConsole.ErrorWriteLine("Chunks compressed with KenCode are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
case CHUNK_TYPE_LZH:
|
||||
throw new ImageNotSupportedException("Chunks compressed with LZH are not yet supported.");
|
||||
AaruConsole.ErrorWriteLine("Chunks compressed with LZH are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
case CHUNK_TYPE_LZFSE:
|
||||
throw new ImageNotSupportedException("Chunks compressed with lzfse are not yet supported.");
|
||||
AaruConsole.ErrorWriteLine("Chunks compressed with lzfse are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
case CHUNK_TYPE_LZMA:
|
||||
throw new ImageNotSupportedException("Chunks compressed with lzma are not yet supported.");
|
||||
AaruConsole.ErrorWriteLine("Chunks compressed with lzma are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
if((bChnk.type > CHUNK_TYPE_NOCOPY && bChnk.type < CHUNK_TYPE_COMMNT) ||
|
||||
(bChnk.type > CHUNK_TYPE_LZMA && bChnk.type < CHUNK_TYPE_END))
|
||||
throw new ImageNotSupportedException($"Unsupported chunk type 0x{bChnk.type:X8} found");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Unsupported chunk type 0x{bChnk.type:X8} found");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(bChnk.sectors > 0)
|
||||
_chunks.Add(bChnk.sector, bChnk);
|
||||
|
||||
@@ -36,7 +36,6 @@ using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Marshal = Aaru.Helpers.Marshal;
|
||||
@@ -89,8 +88,11 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("VirtualBox plugin", "vHdr.logicalSectorSize = {0}", _vHdr.logicalSectorSize);
|
||||
|
||||
if(_vHdr.imageType != VdiImageType.Normal)
|
||||
throw new
|
||||
FeatureSupportedButNotImplementedImageException($"Support for image type {_vHdr.imageType} not yet implemented");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Support for image type {_vHdr.imageType} not yet implemented");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
DateTime start = DateTime.UtcNow;
|
||||
AaruConsole.DebugWriteLine("VirtualBox plugin", "Reading Image Block Map");
|
||||
|
||||
@@ -37,7 +37,6 @@ using System.Text;
|
||||
using Aaru.Checksums;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
@@ -108,8 +107,12 @@ namespace Aaru.DiscImages
|
||||
usableChecksum = footerChecksum;
|
||||
}
|
||||
else
|
||||
throw new
|
||||
ImageNotSupportedException("(VirtualPC plugin): Both header and footer are corrupt, image cannot be opened.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("(VirtualPC plugin): Both header and footer are corrupt, image cannot be opened.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_thisFooter = new HardDiskFooter
|
||||
{
|
||||
@@ -176,8 +179,12 @@ namespace Aaru.DiscImages
|
||||
if(_thisFooter.Version == VERSION1)
|
||||
_imageInfo.Version = "1.0";
|
||||
else
|
||||
throw new
|
||||
ImageNotSupportedException($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
switch(_thisFooter.CreatorApplication)
|
||||
{
|
||||
@@ -360,8 +367,12 @@ namespace Aaru.DiscImages
|
||||
dynamicChecksumCalculated);
|
||||
|
||||
if(dynamicChecksum != dynamicChecksumCalculated)
|
||||
throw new
|
||||
ImageNotSupportedException("(VirtualPC plugin): Both header and footer are corrupt, image cannot be opened.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("(VirtualPC plugin): Both header and footer are corrupt, image cannot be opened.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_thisDynamic = new DynamicDiskHeader
|
||||
{
|
||||
@@ -457,8 +468,12 @@ namespace Aaru.DiscImages
|
||||
AaruConsole.DebugWriteLine("VirtualPC plugin", "dynamic.reserved2's SHA1 = 0x{0}", sha1Ctx.End());
|
||||
|
||||
if(_thisDynamic.HeaderVersion != VERSION1)
|
||||
throw new
|
||||
ImageNotSupportedException($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
DateTime startTime = DateTime.UtcNow;
|
||||
|
||||
@@ -603,8 +618,12 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
if(!locatorFound)
|
||||
throw new
|
||||
FileNotFoundException("(VirtualPC plugin): Cannot find parent file for differencing disk image");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("(VirtualPC plugin): Cannot find parent file for differencing disk image");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
|
||||
{
|
||||
_parentImage = new Vhd();
|
||||
@@ -613,15 +632,26 @@ namespace Aaru.DiscImages
|
||||
new FiltersList().GetFilter(Path.Combine(imageFilter.ParentFolder, parentPath));
|
||||
|
||||
if(parentFilter == null)
|
||||
throw new ImageNotSupportedException("(VirtualPC plugin): Cannot find parent image filter");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("(VirtualPC plugin): Cannot find parent image filter");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
/* PluginBase plugins = new PluginBase();
|
||||
plugins.RegisterAllPlugins();
|
||||
if (!plugins.ImagePluginsList.TryGetValue(Name.ToLower(), out parentImage))
|
||||
throw new SystemException("(VirtualPC plugin): Unable to open myself");*/
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("(VirtualPC plugin): Unable to open myself");
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}*/
|
||||
|
||||
if(!_parentImage.Identify(parentFilter))
|
||||
throw new
|
||||
ImageNotSupportedException("(VirtualPC plugin): Parent image is not a Virtual PC disk image");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("(VirtualPC plugin): Parent image is not a Virtual PC disk image");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
ErrorNumber parentError = _parentImage.Open(parentFilter);
|
||||
|
||||
@@ -638,9 +668,12 @@ namespace Aaru.DiscImages
|
||||
// the parent never stored itself. So the only real way to know that images are related is
|
||||
// because the parent IS found and SAME SIZE. Ugly...
|
||||
// More funny even, tested parent images show an empty host OS, and child images a correct one.
|
||||
if(_parentImage.Info.Sectors != _imageInfo.Sectors)
|
||||
throw new
|
||||
ImageNotSupportedException("(VirtualPC plugin): Parent image is of different size");
|
||||
if(_parentImage.Info.Sectors == _imageInfo.Sectors)
|
||||
return ErrorNumber.NoError;
|
||||
|
||||
AaruConsole.ErrorWriteLine("(VirtualPC plugin): Parent image is of different size");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
@@ -649,16 +682,16 @@ namespace Aaru.DiscImages
|
||||
case TYPE_DEPRECATED1:
|
||||
case TYPE_DEPRECATED2:
|
||||
case TYPE_DEPRECATED3:
|
||||
{
|
||||
throw new
|
||||
ImageNotSupportedException("(VirtualPC plugin): Deprecated image type found. Please submit a bug with an example image.");
|
||||
}
|
||||
AaruConsole.
|
||||
ErrorWriteLine("(VirtualPC plugin): Deprecated image type found. Please submit a bug with an example image.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
|
||||
default:
|
||||
{
|
||||
throw new
|
||||
ImageNotSupportedException($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
}
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -846,16 +879,16 @@ namespace Aaru.DiscImages
|
||||
case TYPE_DEPRECATED1:
|
||||
case TYPE_DEPRECATED2:
|
||||
case TYPE_DEPRECATED3:
|
||||
{
|
||||
throw new
|
||||
ImageNotSupportedException("(VirtualPC plugin): Deprecated image type found. Please submit a bug with an example image.");
|
||||
}
|
||||
AaruConsole.
|
||||
ErrorWriteLine("(VirtualPC plugin): Deprecated image type found. Please submit a bug with an example image.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
|
||||
default:
|
||||
{
|
||||
throw new
|
||||
ImageNotSupportedException($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
}
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"(VirtualPC plugin): Unknown image type {_thisFooter.DiskType} found. Please submit a bug with an example image.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ using System.IO;
|
||||
using System.Text;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
@@ -76,7 +75,11 @@ namespace Aaru.DiscImages
|
||||
_vHdr = Marshal.ByteArrayToStructureLittleEndian<Header>(vHdrB);
|
||||
|
||||
if(_vHdr.Signature != VHDX_HEADER_SIG)
|
||||
throw new ImageNotSupportedException("VHDX header not found");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("VHDX header not found");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
stream.Seek(192 * 1024, SeekOrigin.Begin);
|
||||
@@ -92,7 +95,11 @@ namespace Aaru.DiscImages
|
||||
_vRegHdr = Marshal.ByteArrayToStructureLittleEndian<RegionTableHeader>(vRegTableB);
|
||||
|
||||
if(_vRegHdr.signature != VHDX_REGION_SIG)
|
||||
throw new ImageNotSupportedException("VHDX region table not found");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("VHDX region table not found");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
_vRegs = new RegionTableEntry[_vRegHdr.entries];
|
||||
@@ -108,15 +115,27 @@ namespace Aaru.DiscImages
|
||||
else if(_vRegs[i].guid == _metadataGuid)
|
||||
_metadataOffset = (long)_vRegs[i].offset;
|
||||
else if((_vRegs[i].flags & REGION_FLAGS_REQUIRED) == REGION_FLAGS_REQUIRED)
|
||||
throw new
|
||||
ImageNotSupportedException($"Found unsupported and required region Guid {_vRegs[i].guid}, not proceeding with image.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found unsupported and required region Guid {_vRegs[i].guid}, not proceeding with image.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
if(_batOffset == 0)
|
||||
throw new Exception("BAT not found, cannot continue.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("BAT not found, cannot continue.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(_metadataOffset == 0)
|
||||
throw new Exception("Metadata not found, cannot continue.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Metadata not found, cannot continue.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
uint fileParamsOff = 0, vdSizeOff = 0, p83Off = 0, logOff = 0, physOff = 0, parentOff = 0;
|
||||
|
||||
@@ -146,8 +165,12 @@ namespace Aaru.DiscImages
|
||||
else if(_vMets[i].itemId == _parentLocatorGuid)
|
||||
parentOff = _vMets[i].offset;
|
||||
else if((_vMets[i].flags & METADATA_FLAGS_REQUIRED) == METADATA_FLAGS_REQUIRED)
|
||||
throw new
|
||||
ImageNotSupportedException($"Found unsupported and required metadata Guid {_vMets[i].itemId}, not proceeding with image.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found unsupported and required metadata Guid {_vMets[i].itemId}, not proceeding with image.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
byte[] tmp;
|
||||
@@ -165,7 +188,11 @@ namespace Aaru.DiscImages
|
||||
};
|
||||
}
|
||||
else
|
||||
throw new Exception("File parameters not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("File parameters not found.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(vdSizeOff != 0)
|
||||
{
|
||||
@@ -175,7 +202,11 @@ namespace Aaru.DiscImages
|
||||
_virtualDiskSize = BitConverter.ToUInt64(tmp, 0);
|
||||
}
|
||||
else
|
||||
throw new Exception("Virtual disk size not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Virtual disk size not found.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(p83Off != 0)
|
||||
{
|
||||
@@ -193,7 +224,11 @@ namespace Aaru.DiscImages
|
||||
_logicalSectorSize = BitConverter.ToUInt32(tmp, 0);
|
||||
}
|
||||
else
|
||||
throw new Exception("Logical sector size not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Logical sector size not found.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(physOff != 0)
|
||||
{
|
||||
@@ -203,7 +238,11 @@ namespace Aaru.DiscImages
|
||||
_physicalSectorSize = BitConverter.ToUInt32(tmp, 0);
|
||||
}
|
||||
else
|
||||
throw new Exception("Physical sector size not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Physical sector size not found.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(parentOff != 0 &&
|
||||
(_vFileParms.flags & FILE_FLAGS_HAS_PARENT) == FILE_FLAGS_HAS_PARENT)
|
||||
@@ -214,8 +253,12 @@ namespace Aaru.DiscImages
|
||||
_vParHdr = Marshal.ByteArrayToStructureLittleEndian<ParentLocatorHeader>(vParHdrB);
|
||||
|
||||
if(_vParHdr.locatorType != _parentTypeVhdxGuid)
|
||||
throw new
|
||||
ImageNotSupportedException($"Found unsupported and required parent locator type {_vParHdr.locatorType}, not proceeding with image.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Found unsupported and required parent locator type {_vParHdr.locatorType}, not proceeding with image.");
|
||||
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
_vPars = new ParentLocatorEntry[_vParHdr.keyValueCount];
|
||||
|
||||
@@ -227,7 +270,11 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
}
|
||||
else if((_vFileParms.flags & FILE_FLAGS_HAS_PARENT) == FILE_FLAGS_HAS_PARENT)
|
||||
throw new Exception("Parent locator not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Parent locator not found.");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
|
||||
if((_vFileParms.flags & FILE_FLAGS_HAS_PARENT) == FILE_FLAGS_HAS_PARENT &&
|
||||
_vParHdr.locatorType == _parentTypeVhdxGuid)
|
||||
@@ -318,7 +365,11 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
if(!parentWorks)
|
||||
throw new Exception("Image is differential but parent cannot be opened.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Image is differential but parent cannot be opened.");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
_hasParent = true;
|
||||
}
|
||||
@@ -392,8 +443,12 @@ namespace Aaru.DiscImages
|
||||
break;
|
||||
default:
|
||||
if((pt & BAT_FLAGS_MASK) != 0)
|
||||
throw new
|
||||
ImageNotSupportedException($"Unsupported sector bitmap block flags (0x{pt & BAT_FLAGS_MASK:X16}) found, not proceeding.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Unsupported sector bitmap block flags (0x{pt & BAT_FLAGS_MASK:X16}) found, not proceeding.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -447,8 +502,11 @@ namespace Aaru.DiscImages
|
||||
ulong blkFlags = blkPtr & BAT_FLAGS_MASK;
|
||||
|
||||
if((blkPtr & BAT_RESERVED_MASK) != 0)
|
||||
throw new
|
||||
ImageNotSupportedException($"Unknown flags (0x{blkPtr & BAT_RESERVED_MASK:X16}) set in block pointer");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Unknown flags (0x{blkPtr & BAT_RESERVED_MASK:X16}) set in block pointer");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
switch(blkFlags & BAT_FLAGS_MASK)
|
||||
{
|
||||
|
||||
@@ -38,7 +38,6 @@ using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.Console;
|
||||
using Aaru.Helpers;
|
||||
@@ -84,7 +83,11 @@ namespace Aaru.DiscImages
|
||||
|
||||
if(_vmEHdr.descriptorOffset == 0 ||
|
||||
_vmEHdr.descriptorSize == 0)
|
||||
throw new Exception("Please open VMDK descriptor.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Please open VMDK descriptor.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
byte[] ddfEmbed = new byte[_vmEHdr.descriptorSize * SECTOR_SIZE];
|
||||
|
||||
@@ -106,7 +109,11 @@ namespace Aaru.DiscImages
|
||||
stream.Read(ddfMagic, 0, 0x15);
|
||||
|
||||
if(!_ddfMagicBytes.SequenceEqual(ddfMagic))
|
||||
throw new Exception("Not a descriptor.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Not a descriptor.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
byte[] ddfExternal = new byte[imageFilter.DataForkLength];
|
||||
@@ -274,7 +281,11 @@ namespace Aaru.DiscImages
|
||||
}
|
||||
|
||||
if(_extents.Count == 0)
|
||||
throw new Exception("Did not find any extent");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Did not find any extent");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
switch(_imageType)
|
||||
{
|
||||
@@ -296,9 +307,14 @@ namespace Aaru.DiscImages
|
||||
case VMFS_TYPE_RDMP: //"vmfsRDMP";
|
||||
case VMFS_TYPE_RDMP_OLD: //"vmfsPassthroughRawDeviceMap";
|
||||
case VMFS_TYPE_RAW: //"vmfsRaw";
|
||||
throw new
|
||||
ImageNotSupportedException("Raw device image files are not supported, try accessing the device directly.");
|
||||
default: throw new ImageNotSupportedException($"Dunno how to handle \"{_imageType}\" extents.");
|
||||
AaruConsole.
|
||||
ErrorWriteLine("Raw device image files are not supported, try accessing the device directly.");
|
||||
|
||||
return ErrorNumber.NotSupported;
|
||||
default:
|
||||
AaruConsole.ErrorWriteLine($"Dunno how to handle \"{_imageType}\" extents.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
bool oneNoFlat = cowD;
|
||||
@@ -306,10 +322,18 @@ namespace Aaru.DiscImages
|
||||
foreach(Extent extent in _extents.Values)
|
||||
{
|
||||
if(extent.Filter == null)
|
||||
throw new Exception($"Extent file {extent.Filename} not found.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Extent file {extent.Filename} not found.");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
|
||||
if(extent.Access == "NOACCESS")
|
||||
throw new Exception("Cannot access NOACCESS extents ;).");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Cannot access NOACCESS extents ;).");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(extent.Type == "FLAT" ||
|
||||
extent.Type == "ZERO" ||
|
||||
@@ -321,22 +345,38 @@ namespace Aaru.DiscImages
|
||||
extentStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
if(extentStream.Length < SECTOR_SIZE)
|
||||
throw new Exception($"Extent {extent.Filename} is too small.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Extent {extent.Filename} is too small.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
byte[] extentHdrB = new byte[Marshal.SizeOf<ExtentHeader>()];
|
||||
extentStream.Read(extentHdrB, 0, Marshal.SizeOf<ExtentHeader>());
|
||||
ExtentHeader extentHdr = Marshal.ByteArrayToStructureLittleEndian<ExtentHeader>(extentHdrB);
|
||||
|
||||
if(extentHdr.magic != VMWARE_EXTENT_MAGIC)
|
||||
throw new Exception($"{extent.Filter} is not an VMware extent.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"{extent.Filter} is not an VMware extent.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
if(extentHdr.capacity < extent.Sectors)
|
||||
throw new
|
||||
Exception($"Extent contains incorrect number of sectors, {extentHdr.capacity}. {extent.Sectors} were expected");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Extent contains incorrect number of sectors, {extentHdr.capacity}. {extent.Sectors} were expected");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
// TODO: Support compressed extents
|
||||
if(extentHdr.compression != COMPRESSION_NONE)
|
||||
throw new ImageNotSupportedException("Compressed extents are not yet supported.");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Compressed extents are not yet supported.");
|
||||
|
||||
return ErrorNumber.NotImplemented;
|
||||
}
|
||||
|
||||
if(!vmEHdrSet)
|
||||
{
|
||||
@@ -351,8 +391,12 @@ namespace Aaru.DiscImages
|
||||
if(oneNoFlat &&
|
||||
!vmEHdrSet &&
|
||||
!cowD)
|
||||
throw new
|
||||
Exception("There are sparse extents but there is no header to find the grain tables, cannot proceed.");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine("There are sparse extents but there is no header to find the grain tables, cannot proceed.");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
_imageInfo.Sectors = currentSector;
|
||||
|
||||
@@ -437,7 +481,11 @@ namespace Aaru.DiscImages
|
||||
{
|
||||
if(grains == 0 ||
|
||||
gdEntries == 0)
|
||||
throw new Exception("Some error occurred setting GD sizes");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine("Some error occurred setting GD sizes");
|
||||
|
||||
return ErrorNumber.InOutError;
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine("VMware plugin", "{0} sectors in {1} grains in {2} tables",
|
||||
_imageInfo.Sectors, grains, gdEntries);
|
||||
@@ -485,7 +533,11 @@ namespace Aaru.DiscImages
|
||||
IFilter parentFilter = new FiltersList().GetFilter(Path.Combine(imageFilter.ParentFolder, _parentName));
|
||||
|
||||
if(parentFilter == null)
|
||||
throw new Exception($"Cannot find parent \"{_parentName}\".");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Cannot find parent \"{_parentName}\".");
|
||||
|
||||
return ErrorNumber.NoSuchFile;
|
||||
}
|
||||
|
||||
_parentImage = new VMware();
|
||||
ErrorNumber parentError = _parentImage.Open(parentFilter);
|
||||
|
||||
@@ -82,7 +82,12 @@ namespace Aaru.DiscImages
|
||||
for(int cyl = 0; cyl < _imageInfo.Cylinders; cyl++)
|
||||
{
|
||||
for(int head = 0; head < _imageInfo.Heads; head++)
|
||||
ReadTrack(stream, cyl, head);
|
||||
{
|
||||
var errno =ReadTrack(stream, cyl, head);
|
||||
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return errno;
|
||||
}
|
||||
}
|
||||
|
||||
/* if there are extra tracks, read them as well */
|
||||
@@ -129,7 +134,11 @@ namespace Aaru.DiscImages
|
||||
SectorHeader sheader = Marshal.ByteArrayToStructureLittleEndian<SectorHeader>(sheaderBuffer);
|
||||
|
||||
if(sheader.flag != SectorFlag.Comment)
|
||||
throw new InvalidDataException($"Invalid sector type '{sheader.flag.ToString()}' encountered");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Invalid sector type '{sheader.flag.ToString()}' encountered");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
byte[] comm = new byte[sheader.crc];
|
||||
stream.Read(comm, 0, sheader.crc);
|
||||
@@ -145,7 +154,11 @@ namespace Aaru.DiscImages
|
||||
SectorHeader sheader = Marshal.ByteArrayToStructureLittleEndian<SectorHeader>(sheaderBuffer);
|
||||
|
||||
if(sheader.flag != SectorFlag.Directory)
|
||||
throw new InvalidDataException($"Invalid sector type '{sheader.flag.ToString()}' encountered");
|
||||
{
|
||||
AaruConsole.ErrorWriteLine($"Invalid sector type '{sheader.flag.ToString()}' encountered");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
byte[] dir = new byte[sheader.crc];
|
||||
stream.Read(dir, 0, sheader.crc);
|
||||
@@ -226,7 +239,7 @@ namespace Aaru.DiscImages
|
||||
/// <param name="stream">The stream to read from</param>
|
||||
/// <param name="cyl">The cylinder number of the track being read.</param>
|
||||
/// <param name="head">The head number of the track being read.</param>
|
||||
void ReadTrack(Stream stream, int cyl, int head)
|
||||
ErrorNumber ReadTrack(Stream stream, int cyl, int head)
|
||||
{
|
||||
byte[] sectorData;
|
||||
byte[] crc;
|
||||
@@ -244,8 +257,12 @@ namespace Aaru.DiscImages
|
||||
if(sheader.cylinder != cyl ||
|
||||
sheader.head != head ||
|
||||
sheader.sector != sect)
|
||||
throw new
|
||||
InvalidDataException($"Unexpected sector encountered. Found CHS {sheader.cylinder},{sheader.head},{sheader.sector} but expected {cyl},{head},{sect}");
|
||||
{
|
||||
AaruConsole.
|
||||
ErrorWriteLine($"Unexpected sector encountered. Found CHS {sheader.cylinder},{sheader.head},{sheader.sector} but expected {cyl},{head},{sect}");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
|
||||
sectorData = new byte[512];
|
||||
|
||||
@@ -290,9 +307,13 @@ namespace Aaru.DiscImages
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new InvalidDataException($"Invalid sector type '{sheader.flag.ToString()}' encountered");
|
||||
AaruConsole.ErrorWriteLine($"Invalid sector type '{sheader.flag.ToString()}' encountered");
|
||||
|
||||
return ErrorNumber.InvalidArgument;
|
||||
}
|
||||
}
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -114,7 +114,7 @@ namespace Aaru.DiscImages
|
||||
get
|
||||
{
|
||||
if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
return null;
|
||||
|
||||
var sess = new Session
|
||||
{
|
||||
|
||||
@@ -37,7 +37,6 @@ using System.Linq;
|
||||
using System.Xml.Serialization;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Exceptions;
|
||||
using Aaru.CommonTypes.Interfaces;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using Aaru.CommonTypes.Structs.Devices.ATA;
|
||||
@@ -1217,7 +1216,7 @@ namespace Aaru.DiscImages
|
||||
buffer = null;
|
||||
|
||||
if(_differentTrackZeroSize)
|
||||
throw new NotImplementedException("Not yet implemented");
|
||||
return ErrorNumber.NotImplemented;
|
||||
|
||||
if(sectorAddress > _imageInfo.Sectors - 1)
|
||||
return ErrorNumber.OutOfRange;
|
||||
@@ -1281,10 +1280,10 @@ namespace Aaru.DiscImages
|
||||
public List<Track> GetSessionTracks(Session session)
|
||||
{
|
||||
if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
return null;
|
||||
|
||||
if(session.Sequence != 1)
|
||||
throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported");
|
||||
return null;
|
||||
|
||||
var trk = new Track
|
||||
{
|
||||
@@ -1314,10 +1313,10 @@ namespace Aaru.DiscImages
|
||||
public List<Track> GetSessionTracks(ushort session)
|
||||
{
|
||||
if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
return null;
|
||||
|
||||
if(session != 1)
|
||||
throw new ArgumentOutOfRangeException(nameof(session), "Only a single session is supported");
|
||||
return null;
|
||||
|
||||
var trk = new Track
|
||||
{
|
||||
@@ -1390,9 +1389,11 @@ namespace Aaru.DiscImages
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadSectorTag(ulong sectorAddress, SectorTagType tag, out byte[] buffer)
|
||||
{
|
||||
buffer = null;
|
||||
|
||||
if(_imageInfo.XmlMediaType != XmlMediaType.OpticalDisc ||
|
||||
(!_rawCompactDisc && tag != SectorTagType.CdTrackFlags))
|
||||
throw new FeatureUnsupportedImageException("Feature not supported by image format");
|
||||
return ErrorNumber.NotSupported;
|
||||
|
||||
return ReadSectorsTag(sectorAddress, 1, tag, out buffer);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user