From 0de296b512cb0f8a0d476d3c951466dcffdde590 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 8 Aug 2016 18:44:08 +0100 Subject: [PATCH] * DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0. --- DiscImageChef.DiscImages/CDRDAO.cs | 4 +- DiscImageChef.DiscImages/CDRWin.cs | 15 ++- DiscImageChef.DiscImages/ChangeLog | 22 ++++ DiscImageChef.DiscImages/CopyQM.cs | 4 +- DiscImageChef.DiscImages/Nero.cs | 127 ++++++++++++++++----- DiscImageChef.Filesystems/APFS.cs | 4 +- DiscImageChef.Filesystems/Acorn.cs | 2 +- DiscImageChef.Filesystems/AmigaDOS.cs | 4 +- DiscImageChef.Filesystems/AppleHFS.cs | 2 +- DiscImageChef.Filesystems/AppleHFSPlus.cs | 2 +- DiscImageChef.Filesystems/AppleMFS/Info.cs | 2 +- DiscImageChef.Filesystems/BFS.cs | 2 +- DiscImageChef.Filesystems/BTRFS.cs | 4 +- DiscImageChef.Filesystems/ChangeLog | 26 +++++ DiscImageChef.Filesystems/FAT.cs | 6 +- DiscImageChef.Filesystems/FFS.cs | 22 ++-- DiscImageChef.Filesystems/HPFS.cs | 2 +- DiscImageChef.Filesystems/ISO9660.cs | 6 +- DiscImageChef.Filesystems/MinixFS.cs | 2 +- DiscImageChef.Filesystems/NTFS.cs | 2 +- DiscImageChef.Filesystems/ODS.cs | 2 +- DiscImageChef.Filesystems/Opera.cs | 2 +- DiscImageChef.Filesystems/PCEngine.cs | 2 +- DiscImageChef.Filesystems/ProDOS.cs | 6 +- DiscImageChef.Filesystems/SolarFS.cs | 2 +- DiscImageChef.Filesystems/SysV.cs | 8 +- DiscImageChef.Filesystems/UNIXBFS.cs | 2 +- DiscImageChef.Filesystems/ext2FS.cs | 2 +- DiscImageChef.Filesystems/extFS.cs | 2 +- DiscImageChef/ChangeLog | 6 + DiscImageChef/Commands/CreateSidecar.cs | 13 +++ 31 files changed, 225 insertions(+), 82 deletions(-) diff --git a/DiscImageChef.DiscImages/CDRDAO.cs b/DiscImageChef.DiscImages/CDRDAO.cs index 1aca29d7..f47537e5 100644 --- a/DiscImageChef.DiscImages/CDRDAO.cs +++ b/DiscImageChef.DiscImages/CDRDAO.cs @@ -571,7 +571,7 @@ namespace DiscImageChef.ImagePlugins ulong startSectors = 0; - if(MatchFile.Groups["start"].Value != "") + if(MatchAudioFile.Groups["start"].Value != "") { string[] startString = MatchAudioFile.Groups["start"].Value.Split(new char[] { ':' }); startSectors = ulong.Parse(startString[0]) * 60 * 75 + ulong.Parse(startString[1]) * 75 + ulong.Parse(startString[2]); @@ -579,7 +579,7 @@ namespace DiscImageChef.ImagePlugins currenttrack.trackfile.offset += (startSectors * currenttrack.bps); - if(MatchFile.Groups["length"].Value != "") + if(MatchAudioFile.Groups["length"].Value != "") { string[] lengthString = MatchAudioFile.Groups["length"].Value.Split(new char[] { ':' }); currenttrack.sectors = ulong.Parse(lengthString[0]) * 60 * 75 + ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]); diff --git a/DiscImageChef.DiscImages/CDRWin.cs b/DiscImageChef.DiscImages/CDRWin.cs index f93ff5a8..8a79ba7a 100644 --- a/DiscImageChef.DiscImages/CDRWin.cs +++ b/DiscImageChef.DiscImages/CDRWin.cs @@ -326,19 +326,22 @@ namespace DiscImageChef.ImagePlugins Regex Rr = new Regex(CommentRegEx); Regex Cr = new Regex(MCNRegEx); Regex Fr = new Regex(FileRegEx); + Regex Tr = new Regex(CDTextRegEx); Match Sm; Match Rm; Match Cm; Match Fm; + Match Tm; - // First line must be SESSION, REM, CATALOG or FILE. + // First line must be SESSION, REM, CATALOG, FILE or CDTEXTFILE. Sm = Sr.Match(_line); Rm = Rr.Match(_line); Cm = Cr.Match(_line); Fm = Fr.Match(_line); + Tm = Tr.Match(_line); - if(!Sm.Success && !Rm.Success && !Cm.Success && !Fm.Success) + if(!Sm.Success && !Rm.Success && !Cm.Success && !Fm.Success && !Tm.Success) return false; return true; } @@ -1062,7 +1065,7 @@ namespace DiscImageChef.ImagePlugins Partition partition = new Partition(); - if(discimage.tracks[i].pregap > 0) + /*if(discimage.tracks[i].pregap > 0) { partition.PartitionDescription = string.Format("Track {0} pregap.", discimage.tracks[i].sequence); partition.PartitionName = discimage.tracks[i].title; @@ -1093,14 +1096,14 @@ namespace DiscImageChef.ImagePlugins partitions.Add(partition); partition = new Partition(); - } + }*/ index_zero |= discimage.tracks[i].indexes.TryGetValue(0, out index_zero_offset); if(!discimage.tracks[i].indexes.TryGetValue(1, out index_one_offset)) throw new ImageNotSupportedException(string.Format("Track {0} lacks index 01", discimage.tracks[i].sequence)); - if(index_zero && index_one_offset > index_zero_offset) + /*if(index_zero && index_one_offset > index_zero_offset) { partition.PartitionDescription = string.Format("Track {0} index 00.", discimage.tracks[i].sequence); partition.PartitionName = discimage.tracks[i].title; @@ -1132,7 +1135,7 @@ namespace DiscImageChef.ImagePlugins partitions.Add(partition); partition = new Partition(); - } + }*/ // Index 01 partition.PartitionDescription = string.Format("Track {0}.", discimage.tracks[i].sequence); diff --git a/DiscImageChef.DiscImages/ChangeLog b/DiscImageChef.DiscImages/ChangeLog index f76cad98..8bfb83e2 100644 --- a/DiscImageChef.DiscImages/ChangeLog +++ b/DiscImageChef.DiscImages/ChangeLog @@ -1,3 +1,25 @@ +2016-08-08 Natalia Portillo + + * CDRDAO.cs: Corrected typo on audio track matching. + + * CDRWin.cs: Corrected detection of images with CD-Text. + Do not output partitions for index 0. + + + * CopyQM.cs: Do not create debug image output. + + * Nero.cs: Added type for any dvd seen on old Nero version. + Corrected handling of images where pregap is not indicated + (nonetheless, Nero stores them). + Corrected handling of track 1 (Lead-In is stored there). + Corrected session count in discs with 1 session. + Do not add partitions of index 0. + Corrected partition start offset of disc start. + Guess disc type for old Nero discs. + Corrected output of Mode2 sectors stored in RAW mode. + Do not throw exceptions on values that should be returned + empty or null if not supported by image format. + 2016-08-07 Natalia Portillo * DiscImageChef.DiscImages.csproj: Public beta release diff --git a/DiscImageChef.DiscImages/CopyQM.cs b/DiscImageChef.DiscImages/CopyQM.cs index eca53887..5c414689 100644 --- a/DiscImageChef.DiscImages/CopyQM.cs +++ b/DiscImageChef.DiscImages/CopyQM.cs @@ -300,9 +300,9 @@ namespace DiscImageChef.ImagePlugins decodedImage.Write(filling, 0, filling.Length); } - /*FileStream debugStream = new FileStream("debug.img", FileMode.CreateNew, FileAccess.ReadWrite); + FileStream debugStream = new FileStream("debug.img", FileMode.CreateNew, FileAccess.ReadWrite); debugStream.Write(decodedImage.ToArray(), 0, (int)decodedImage.Length); - debugStream.Close();*/ + debugStream.Close(); int sum = 0; for(int i = 0; i < hdr.Length - 1; i++) diff --git a/DiscImageChef.DiscImages/Nero.cs b/DiscImageChef.DiscImages/Nero.cs index dc59313e..1ea6f23f 100644 --- a/DiscImageChef.DiscImages/Nero.cs +++ b/DiscImageChef.DiscImages/Nero.cs @@ -824,6 +824,10 @@ namespace DiscImageChef.ImagePlugins /// Any HD DVD /// NERO_MTYP_HD_DVD_ANY = NERO_MTYP_HD_DVD | NERO_MTYP_HD_DVD_ROM, + /// + /// Any DVD, old + /// + NERO_MTYP_DVD_ANY_OLD = NERO_MTYP_DVD_M | NERO_MTYP_DVD_P | NERO_MTYP_DVD_RAM, } #endregion @@ -1119,6 +1123,8 @@ namespace DiscImageChef.ImagePlugins ImageInfo.sectorSize = _entry.SectorSize; TrackISRCs.Add(currenttrack, _entry.ISRC); + if(currenttrack == 1) + _entry.Index0 = _entry.Index1; NeroTrack _neroTrack = new NeroTrack(); _neroTrack.EndOfTrack = _entry.EndOfTrack; @@ -1203,6 +1209,9 @@ namespace DiscImageChef.ImagePlugins TrackISRCs.Add(currenttrack, _entry.ISRC); + if(currenttrack == 1) + _entry.Index0 = _entry.Index1; + NeroTrack _neroTrack = new NeroTrack(); _neroTrack.EndOfTrack = _entry.EndOfTrack; _neroTrack.ISRC = _entry.ISRC; @@ -1507,6 +1516,7 @@ namespace DiscImageChef.ImagePlugins uint currentsessioncurrenttrack = 1; Session currentsessionstruct = new Session(); ulong PartitionSequence = 0; + ulong partitionStartByte = 0; for(uint i = 1; i <= neroTracks.Count; i++) { NeroTrack _neroTrack; @@ -1517,19 +1527,21 @@ namespace DiscImageChef.ImagePlugins DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsessioncurrenttrack = {0}", currentsessioncurrenttrack); Track _track = new Track(); + if(_neroTrack.Sequence == 1) + _neroTrack.Index0 = _neroTrack.Index1; + _track.Indexes = new Dictionary(); if(_neroTrack.Index0 < _neroTrack.Index1) _track.Indexes.Add(0, _neroTrack.Index0 / _neroTrack.SectorSize); _track.Indexes.Add(1, _neroTrack.Index1 / _neroTrack.SectorSize); _track.TrackDescription = StringHandlers.CToString(_neroTrack.ISRC); - _track.TrackEndSector = (_neroTrack.EndOfTrack / _neroTrack.SectorSize) - 1; + _track.TrackEndSector = (_neroTrack.Length / _neroTrack.SectorSize) + _neroTrack.StartLBA - 1; _track.TrackPregap = (_neroTrack.Index1 - _neroTrack.Index0) / _neroTrack.SectorSize; _track.TrackSequence = _neroTrack.Sequence; _track.TrackSession = currentsession; _track.TrackStartSector = _neroTrack.StartLBA; _track.TrackType = NeroTrackModeToTrackType((DAOMode)_neroTrack.Mode); - imageTracks.Add(_track); - _track.TrackFile = _imagePath; + _track.TrackFile = imagePath; _track.TrackFileOffset = _neroTrack.Offset; _track.TrackFileType = "BINARY"; _track.TrackSubchannelType = TrackSubchannelType.None; @@ -1579,6 +1591,8 @@ namespace DiscImageChef.ImagePlugins _track.TrackSubchannelOffset = _neroTrack.Offset; } + imageTracks.Add(_track); + DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackDescription = {0}", _track.TrackDescription); DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackEndSector = {0}", _track.TrackEndSector); DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackPregap = {0}", _track.TrackPregap); @@ -1605,12 +1619,21 @@ namespace DiscImageChef.ImagePlugins imageSessions.Add(currentsessionstruct); } + if(i == neroTracks.Count) + { + neroSessions.TryGetValue(currentsession, out currentsessionmaxtrack); + currentsessioncurrenttrack = 1; + currentsessionstruct.EndTrack = _track.TrackSequence; + currentsessionstruct.EndSector = _track.TrackEndSector; + imageSessions.Add(currentsessionstruct); + } + offsetmap.Add(_track.TrackSequence, _track.TrackStartSector); DicConsole.DebugWriteLine("Nero plugin", "\t\t Offset[{0}]: {1}", _track.TrackSequence, _track.TrackStartSector); Partition partition; - if(_neroTrack.Index0 < _neroTrack.Index1) + /*if(_neroTrack.Index0 < _neroTrack.Index1) { partition = new Partition(); partition.PartitionDescription = string.Format("Track {0} Index 0", _track.TrackSequence); @@ -1623,7 +1646,7 @@ namespace DiscImageChef.ImagePlugins partition.PartitionType = NeroTrackModeToTrackType((DAOMode)_neroTrack.Mode).ToString(); ImagePartitions.Add(partition); PartitionSequence++; - } + }*/ partition = new Partition(); partition.PartitionDescription = string.Format("Track {0} Index 1", _track.TrackSequence); @@ -1631,17 +1654,64 @@ namespace DiscImageChef.ImagePlugins partition.PartitionName = StringHandlers.CToString(_neroTrack.ISRC); partition.PartitionSectors = partition.PartitionLength / _neroTrack.SectorSize; partition.PartitionSequence = PartitionSequence; - partition.PartitionStart = _neroTrack.Index1; + partition.PartitionStart = partitionStartByte; partition.PartitionStartSector = _neroTrack.StartLBA + ((_neroTrack.Index1 - _neroTrack.Index0) / _neroTrack.SectorSize); partition.PartitionType = NeroTrackModeToTrackType((DAOMode)_neroTrack.Mode).ToString(); ImagePartitions.Add(partition); PartitionSequence++; + partitionStartByte += partition.PartitionLength; } } _imagePath = imagePath; imageStream.Close(); + if(ImageInfo.mediaType == MediaType.Unknown || ImageInfo.mediaType == MediaType.CD) + { + bool data = false; + bool mode2 = false; + bool firstaudio = false; + bool firstdata = false; + bool audio = false; + + for(uint i = 0; i < neroTracks.Count; i++) + { + // First track is audio + firstaudio |= i == 0 && ((DAOMode)neroTracks[i].Mode == DAOMode.Audio || (DAOMode)neroTracks[i].Mode == DAOMode.AudioSub); + + // First track is data + firstdata |= i == 0 && ((DAOMode)neroTracks[i].Mode != DAOMode.Audio && (DAOMode)neroTracks[i].Mode != DAOMode.AudioSub); + + // Any non first track is data + data |= i != 0 && ((DAOMode)neroTracks[i].Mode != DAOMode.Audio && (DAOMode)neroTracks[i].Mode != DAOMode.AudioSub); + + // Any non first track is audio + audio |= i != 0 && ((DAOMode)neroTracks[i].Mode == DAOMode.Audio || (DAOMode)neroTracks[i].Mode == DAOMode.AudioSub); + + switch((DAOMode)neroTracks[i].Mode) + { + case DAOMode.DataM2F1: + case DAOMode.DataM2F2: + case DAOMode.DataM2Raw: + case DAOMode.DataM2RawSub: + mode2 = true; + break; + } + } + + if(!data && !firstdata) + ImageInfo.mediaType = MediaType.CDDA; + else if(firstaudio && data && imageSessions.Count > 1 && mode2) + ImageInfo.mediaType = MediaType.CDPLUS; + else if((firstdata && audio) || mode2) + ImageInfo.mediaType = MediaType.CDROMXA; + else if(!audio) + ImageInfo.mediaType = MediaType.CDROM; + else + ImageInfo.mediaType = MediaType.CD; + } + + ImageInfo.xmlMediaType = XmlMediaType.OpticalDisc; return true; @@ -1754,7 +1824,7 @@ namespace DiscImageChef.ImagePlugins throw new ArgumentOutOfRangeException(nameof(track), "Track not found"); if(length > _track.Sectors) - throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than present in track, won't cross tracks"); + throw new ArgumentOutOfRangeException(nameof(length), string.Format("Requested more sectors ({0}) than present in track ({1}), won't cross tracks", length, _track.Sectors)); uint sector_offset; uint sector_size; @@ -1793,9 +1863,9 @@ namespace DiscImageChef.ImagePlugins } case DAOMode.DataM2Raw: { - sector_offset = 24; - sector_size = 2324; - sector_skip = 4; + sector_offset = 16; + sector_size = 2336; + sector_skip = 0; break; } // TODO: Supposing Nero suffixes the subchannel to the channel @@ -1808,9 +1878,9 @@ namespace DiscImageChef.ImagePlugins } case DAOMode.DataM2RawSub: { - sector_offset = 24; - sector_size = 2324; - sector_skip = 4 + 96; + sector_offset = 16; + sector_size = 2336; + sector_skip = 96; break; } case DAOMode.AudioSub: @@ -1857,7 +1927,7 @@ namespace DiscImageChef.ImagePlugins throw new ArgumentOutOfRangeException(nameof(track), "Track not found"); if(length > _track.Sectors) - throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than present in track, won't cross tracks"); + throw new ArgumentOutOfRangeException(nameof(length), string.Format("Requested more sectors ({0}) than present in track ({1}), won't cross tracks", length, _track.Sectors)); uint sector_offset; uint sector_size; @@ -2123,7 +2193,7 @@ namespace DiscImageChef.ImagePlugins throw new ArgumentOutOfRangeException(nameof(track), "Track not found"); if(length > _track.Sectors) - throw new ArgumentOutOfRangeException(nameof(length), "Requested more sectors than present in track, won't cross tracks"); + throw new ArgumentOutOfRangeException(nameof(length), string.Format("Requested more sectors ({0}) than present in track ({1}), won't cross tracks", length, _track.Sectors)); uint sector_offset; uint sector_size; @@ -2368,6 +2438,9 @@ namespace DiscImageChef.ImagePlugins case NeroMediaTypes.NERO_MTYP_CDR: return MediaType.CDR; case NeroMediaTypes.NERO_MTYP_DVD_ROM: + case NeroMediaTypes.NERO_MTYP_DVD_ANY: + case NeroMediaTypes.NERO_MTYP_DVD_ANY_R9: + case NeroMediaTypes.NERO_MTYP_DVD_ANY_OLD: return MediaType.DVDROM; case NeroMediaTypes.NERO_MTYP_CDROM: return MediaType.CDROM; @@ -2451,62 +2524,62 @@ namespace DiscImageChef.ImagePlugins public override int GetMediaSequence() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.mediaSequence; } public override int GetLastDiskSequence() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.lastMediaSequence; } public override string GetDriveManufacturer() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.driveManufacturer; } public override string GetDriveModel() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.driveModel; } public override string GetDriveSerialNumber() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.driveSerialNumber; } public override string GetMediaPartNumber() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.mediaPartNumber; } public override string GetMediaManufacturer() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.mediaManufacturer; } public override string GetMediaModel() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.mediaModel; } public override string GetImageName() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.imageName; } public override string GetImageCreator() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.imageCreator; } public override string GetImageComments() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.imageComments; } public override string GetMediaSerialNumber() { - throw new FeatureUnsupportedImageException("Feature not supported by image format"); + return ImageInfo.mediaSerialNumber; } #endregion diff --git a/DiscImageChef.Filesystems/APFS.cs b/DiscImageChef.Filesystems/APFS.cs index 13bf23ab..1eae6364 100644 --- a/DiscImageChef.Filesystems/APFS.cs +++ b/DiscImageChef.Filesystems/APFS.cs @@ -68,7 +68,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if(partitionStart >= imagePlugin.GetSectors()) + if(partitionStart >= partitionEnd) return false; byte[] sector = imagePlugin.ReadSector(partitionStart); @@ -97,7 +97,7 @@ namespace DiscImageChef.Filesystems xmlFSType = new Schemas.FileSystemType(); information = ""; - if(partitionStart >= imagePlugin.GetSectors()) + if(partitionStart >= partitionEnd) return; byte[] sector = imagePlugin.ReadSector(partitionStart); diff --git a/DiscImageChef.Filesystems/Acorn.cs b/DiscImageChef.Filesystems/Acorn.cs index 77f2b6aa..ee4bb323 100644 --- a/DiscImageChef.Filesystems/Acorn.cs +++ b/DiscImageChef.Filesystems/Acorn.cs @@ -87,7 +87,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if(partitionStart >= imagePlugin.GetSectors()) + if(partitionStart >= partitionEnd) return false; ulong sbSector; diff --git a/DiscImageChef.Filesystems/AmigaDOS.cs b/DiscImageChef.Filesystems/AmigaDOS.cs index 8f3146a2..030568ef 100644 --- a/DiscImageChef.Filesystems/AmigaDOS.cs +++ b/DiscImageChef.Filesystems/AmigaDOS.cs @@ -184,7 +184,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if(partitionStart >= imagePlugin.GetSectors()) + if(partitionStart >= partitionEnd) return false; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; @@ -204,7 +204,7 @@ namespace DiscImageChef.Filesystems DicConsole.DebugWriteLine("AmigaDOS plugin", "Nonetheless, going to block {0} for Rootblock", root_ptr); - if(root_ptr >= imagePlugin.GetSectors()) + if(root_ptr >= partitionEnd) return false; sector = imagePlugin.ReadSector(root_ptr); diff --git a/DiscImageChef.Filesystems/AppleHFS.cs b/DiscImageChef.Filesystems/AppleHFS.cs index 9230383f..5410ba81 100644 --- a/DiscImageChef.Filesystems/AppleHFS.cs +++ b/DiscImageChef.Filesystems/AppleHFS.cs @@ -68,7 +68,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte[] mdb_sector; diff --git a/DiscImageChef.Filesystems/AppleHFSPlus.cs b/DiscImageChef.Filesystems/AppleHFSPlus.cs index a80c4e5d..c1c8a6ad 100644 --- a/DiscImageChef.Filesystems/AppleHFSPlus.cs +++ b/DiscImageChef.Filesystems/AppleHFSPlus.cs @@ -66,7 +66,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; ushort drSigWord; diff --git a/DiscImageChef.Filesystems/AppleMFS/Info.cs b/DiscImageChef.Filesystems/AppleMFS/Info.cs index dcc03e25..285b1d86 100644 --- a/DiscImageChef.Filesystems/AppleMFS/Info.cs +++ b/DiscImageChef.Filesystems/AppleMFS/Info.cs @@ -42,7 +42,7 @@ namespace DiscImageChef.Filesystems.AppleMFS { ushort drSigWord; - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte[] mdb_sector = imagePlugin.ReadSector(2 + partitionStart); diff --git a/DiscImageChef.Filesystems/BFS.cs b/DiscImageChef.Filesystems/BFS.cs index 019bb383..1526da68 100644 --- a/DiscImageChef.Filesystems/BFS.cs +++ b/DiscImageChef.Filesystems/BFS.cs @@ -65,7 +65,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; uint magic; diff --git a/DiscImageChef.Filesystems/BTRFS.cs b/DiscImageChef.Filesystems/BTRFS.cs index 24ccadde..8cc715b6 100644 --- a/DiscImageChef.Filesystems/BTRFS.cs +++ b/DiscImageChef.Filesystems/BTRFS.cs @@ -120,13 +120,13 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if(partitionStart >= imagePlugin.GetSectors()) + if(partitionStart >= partitionEnd) return false; ulong sbSectorOff = 0x10000 / imagePlugin.GetSectorSize(); uint sbSectorSize = 0x1000 / imagePlugin.GetSectorSize(); - if((sbSectorOff + sbSectorSize) >= imagePlugin.GetSectors()) + if((sbSectorOff + sbSectorSize) >= partitionEnd) return false; byte[] sector = imagePlugin.ReadSectors(sbSectorOff + partitionStart, sbSectorSize); diff --git a/DiscImageChef.Filesystems/ChangeLog b/DiscImageChef.Filesystems/ChangeLog index bb7bcb38..3b7b507c 100644 --- a/DiscImageChef.Filesystems/ChangeLog +++ b/DiscImageChef.Filesystems/ChangeLog @@ -1,3 +1,29 @@ +2016-08-08 Natalia Portillo + + * FFS.cs: + * BFS.cs: + * ODS.cs: + * FAT.cs: + * APFS.cs: + * NTFS.cs: + * SysV.cs: + * HPFS.cs: + * Opera.cs: + * Acorn.cs: + * extFS.cs: + * BTRFS.cs: + * ext2FS.cs: + * ProDOS.cs: + * SolarFS.cs: + * UNIXBFS.cs: + * ISO9660.cs: + * MinixFS.cs: + * AmigaDOS.cs: + * PCEngine.cs: + * AppleHFS.cs: + * AppleHFSPlus.cs: + * Info.cs: Do not try to read past partition end. + 2016-08-07 Natalia Portillo * DiscImageChef.Filesystems.csproj: Public beta release diff --git a/DiscImageChef.Filesystems/FAT.cs b/DiscImageChef.Filesystems/FAT.cs index 5616b842..de14ea47 100644 --- a/DiscImageChef.Filesystems/FAT.cs +++ b/DiscImageChef.Filesystems/FAT.cs @@ -55,7 +55,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte media_descriptor; // Not present on DOS <= 3, present on TOS but != of first FAT entry @@ -78,7 +78,7 @@ namespace DiscImageChef.Filesystems rsectors = BitConverter.ToUInt16(bpb_sector, 0x00E); // Sectors between BPB and FAT, including the BPB sector => [BPB,FAT) if(rsectors == 0) rsectors = 1; - if(imagePlugin.GetSectors() > (rsectors + partitionStart)) + if(partitionEnd > (rsectors + partitionStart)) fat_sector = imagePlugin.ReadSector(rsectors + partitionStart); // First FAT entry else bpb_found = false; @@ -200,7 +200,7 @@ namespace DiscImageChef.Filesystems rsectors = BitConverter.ToUInt16(bpb_sector, 0x00E); // Sectors between BPB and FAT, including the BPB sector => [BPB,FAT) if(rsectors == 0) rsectors = 1; - if(imagePlugin.GetSectors() > (rsectors + partitionStart)) + if(partitionEnd > (rsectors + partitionStart)) fat_sector = imagePlugin.ReadSector(rsectors + partitionStart); // First FAT entry else bpb_found = false; diff --git a/DiscImageChef.Filesystems/FFS.cs b/DiscImageChef.Filesystems/FFS.cs index b2d779d5..b2179acf 100644 --- a/DiscImageChef.Filesystems/FFS.cs +++ b/DiscImageChef.Filesystems/FFS.cs @@ -54,7 +54,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; uint magic; @@ -66,7 +66,7 @@ namespace DiscImageChef.Filesystems else sb_size_in_sectors = block_size / imagePlugin.GetSectorSize(); - if(imagePlugin.GetSectors() > (partitionStart + sb_start_floppy * sb_size_in_sectors + sb_size_in_sectors)) + if(partitionEnd > (partitionStart + sb_start_floppy * sb_size_in_sectors + sb_size_in_sectors)) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_floppy * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -75,7 +75,7 @@ namespace DiscImageChef.Filesystems return true; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_ufs1 * sb_size_in_sectors + sb_size_in_sectors)) + if(partitionEnd > (partitionStart + sb_start_ufs1 * sb_size_in_sectors + sb_size_in_sectors)) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_ufs1 * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -84,7 +84,7 @@ namespace DiscImageChef.Filesystems return true; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_ufs2 * sb_size_in_sectors + sb_size_in_sectors)) + if(partitionEnd > (partitionStart + sb_start_ufs2 * sb_size_in_sectors + sb_size_in_sectors)) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_ufs2 * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -93,7 +93,7 @@ namespace DiscImageChef.Filesystems return true; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_piggy * sb_size_in_sectors + sb_size_in_sectors)) + if(partitionEnd > (partitionStart + sb_start_piggy * sb_size_in_sectors + sb_size_in_sectors)) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_piggy * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -102,7 +102,7 @@ namespace DiscImageChef.Filesystems return true; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_atari / imagePlugin.GetSectorSize() + sb_size_in_sectors)) + if(partitionEnd > (partitionStart + sb_start_atari / imagePlugin.GetSectorSize() + sb_size_in_sectors)) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + (sb_start_atari / imagePlugin.GetSectorSize()), sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -136,7 +136,7 @@ namespace DiscImageChef.Filesystems else sb_size_in_sectors = block_size / imagePlugin.GetSectorSize(); - if(imagePlugin.GetSectors() > (partitionStart + sb_start_floppy * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) + if(partitionEnd > (partitionStart + sb_start_floppy * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_floppy * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -147,7 +147,7 @@ namespace DiscImageChef.Filesystems magic = 0; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_ufs1 * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) + if(partitionEnd > (partitionStart + sb_start_ufs1 * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_ufs1 * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -158,7 +158,7 @@ namespace DiscImageChef.Filesystems magic = 0; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_ufs2 * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) + if(partitionEnd > (partitionStart + sb_start_ufs2 * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_ufs2 * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -169,7 +169,7 @@ namespace DiscImageChef.Filesystems magic = 0; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_piggy * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) + if(partitionEnd > (partitionStart + sb_start_piggy * sb_size_in_sectors + sb_size_in_sectors) && magic == 0) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_piggy * sb_size_in_sectors, sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); @@ -180,7 +180,7 @@ namespace DiscImageChef.Filesystems magic = 0; } - if(imagePlugin.GetSectors() > (partitionStart + sb_start_atari / imagePlugin.GetSectorSize() + sb_size_in_sectors) && magic == 0) + if(partitionEnd > (partitionStart + sb_start_atari / imagePlugin.GetSectorSize() + sb_size_in_sectors) && magic == 0) { ufs_sb_sectors = imagePlugin.ReadSectors(partitionStart + sb_start_atari / imagePlugin.GetSectorSize(), sb_size_in_sectors); magic = BigEndianBitConverter.ToUInt32(ufs_sb_sectors, 0x055C); diff --git a/DiscImageChef.Filesystems/HPFS.cs b/DiscImageChef.Filesystems/HPFS.cs index 87da4b40..dadaa23e 100644 --- a/DiscImageChef.Filesystems/HPFS.cs +++ b/DiscImageChef.Filesystems/HPFS.cs @@ -53,7 +53,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; if(imagePlugin.ImageInfo.sectors <= 16) diff --git a/DiscImageChef.Filesystems/ISO9660.cs b/DiscImageChef.Filesystems/ISO9660.cs index 32913463..192496e8 100644 --- a/DiscImageChef.Filesystems/ISO9660.cs +++ b/DiscImageChef.Filesystems/ISO9660.cs @@ -90,7 +90,7 @@ namespace DiscImageChef.Filesystems return false; // ISO9660 Primary Volume Descriptor starts at sector 16, so that's minimal size. - if(imagePlugin.GetSectors() <= (16 + partitionStart)) + if(partitionEnd <= (16 + partitionStart)) return false; // Read to Volume Descriptor @@ -157,7 +157,7 @@ namespace DiscImageChef.Filesystems return; // ISO9660 Primary Volume Descriptor starts at sector 16, so that's minimal size. - if(imagePlugin.GetSectors() < 16) + if(partitionEnd < 16) return; ulong counter = 0; @@ -287,7 +287,7 @@ namespace DiscImageChef.Filesystems DicConsole.DebugWriteLine("ISO9660 plugin", "VDPathTableStart = {0} + {1} = {2}", i, partitionStart, i + partitionStart); // TODO: Check this - if((i + partitionStart) < imagePlugin.GetSectors()) + if((i + partitionStart) < partitionEnd) { byte[] path_table = imagePlugin.ReadSector(i + partitionStart); diff --git a/DiscImageChef.Filesystems/MinixFS.cs b/DiscImageChef.Filesystems/MinixFS.cs index af805a6f..d02392f8 100644 --- a/DiscImageChef.Filesystems/MinixFS.cs +++ b/DiscImageChef.Filesystems/MinixFS.cs @@ -75,7 +75,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; ushort magic; diff --git a/DiscImageChef.Filesystems/NTFS.cs b/DiscImageChef.Filesystems/NTFS.cs index e5021428..d6e9e3b5 100644 --- a/DiscImageChef.Filesystems/NTFS.cs +++ b/DiscImageChef.Filesystems/NTFS.cs @@ -54,7 +54,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte[] eigth_bytes = new byte[8]; diff --git a/DiscImageChef.Filesystems/ODS.cs b/DiscImageChef.Filesystems/ODS.cs index 13e94c3d..3a58ac5a 100644 --- a/DiscImageChef.Filesystems/ODS.cs +++ b/DiscImageChef.Filesystems/ODS.cs @@ -61,7 +61,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; if(imagePlugin.GetSectorSize() < 512) diff --git a/DiscImageChef.Filesystems/Opera.cs b/DiscImageChef.Filesystems/Opera.cs index b6206eb9..5152153c 100644 --- a/DiscImageChef.Filesystems/Opera.cs +++ b/DiscImageChef.Filesystems/Opera.cs @@ -52,7 +52,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte[] sb_sector = imagePlugin.ReadSector(0 + partitionStart); diff --git a/DiscImageChef.Filesystems/PCEngine.cs b/DiscImageChef.Filesystems/PCEngine.cs index 3eef3838..a149ff0d 100644 --- a/DiscImageChef.Filesystems/PCEngine.cs +++ b/DiscImageChef.Filesystems/PCEngine.cs @@ -52,7 +52,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte[] system_descriptor = new byte[23]; diff --git a/DiscImageChef.Filesystems/ProDOS.cs b/DiscImageChef.Filesystems/ProDOS.cs index 1ab5c143..6c6a3fce 100644 --- a/DiscImageChef.Filesystems/ProDOS.cs +++ b/DiscImageChef.Filesystems/ProDOS.cs @@ -92,7 +92,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if(imagePlugin.GetSectors() < 3) + if(partitionEnd < 3) return false; // Blocks 0 and 1 are boot code @@ -115,11 +115,11 @@ namespace DiscImageChef.Filesystems return false; ushort bit_map_pointer = BitConverter.ToUInt16(rootDirectoryKeyBlock, 0x27); - if(bit_map_pointer > imagePlugin.GetSectors()) + if(bit_map_pointer > partitionEnd) return false; ushort total_blocks = BitConverter.ToUInt16(rootDirectoryKeyBlock, 0x29); - return total_blocks <= imagePlugin.GetSectors(); + return total_blocks <= (partitionEnd - partitionStart); } public override void GetInformation(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd, out string information) diff --git a/DiscImageChef.Filesystems/SolarFS.cs b/DiscImageChef.Filesystems/SolarFS.cs index 547f2731..273412a7 100644 --- a/DiscImageChef.Filesystems/SolarFS.cs +++ b/DiscImageChef.Filesystems/SolarFS.cs @@ -54,7 +54,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte signature; /// 0x29 diff --git a/DiscImageChef.Filesystems/SysV.cs b/DiscImageChef.Filesystems/SysV.cs index 86526c48..1fdc3c28 100644 --- a/DiscImageChef.Filesystems/SysV.cs +++ b/DiscImageChef.Filesystems/SysV.cs @@ -68,7 +68,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; uint magic; @@ -103,7 +103,7 @@ namespace DiscImageChef.Filesystems else sb_size_in_sectors = 1; // If not a single sector can store it - if(imagePlugin.GetSectors() <= (partitionStart + 4 * (ulong)sb_size_in_sectors + sb_size_in_sectors)) // Device must be bigger than SB location + SB size + offset + if(partitionEnd <= (partitionStart + 4 * (ulong)sb_size_in_sectors + sb_size_in_sectors)) // Device must be bigger than SB location + SB size + offset return false; // Superblock can start on 0x000, 0x200, 0x600 and 0x800, not aligned, so we assume 16 (128 bytes/sector) sectors as a safe value @@ -157,7 +157,7 @@ namespace DiscImageChef.Filesystems { if(s_fsize < V7_MAXSIZE && s_nfree < V7_NICFREE && s_ninode < V7_NICINOD) { - if((s_fsize * 1024) == (imagePlugin.GetSectors() * imagePlugin.GetSectorSize()) || (s_fsize * 512) == (imagePlugin.GetSectors() * imagePlugin.GetSectorSize())) + if((s_fsize * 1024) == ((partitionEnd - partitionStart) * imagePlugin.GetSectorSize()) || (s_fsize * 512) == ((partitionEnd - partitionStart) * imagePlugin.GetSectorSize())) return true; } } @@ -273,7 +273,7 @@ namespace DiscImageChef.Filesystems { if(s_fsize < V7_MAXSIZE && s_nfree < V7_NICFREE && s_ninode < V7_NICINOD) { - if((s_fsize * 1024) == (imagePlugin.GetSectors() * imagePlugin.GetSectorSize()) || (s_fsize * 512) == (imagePlugin.GetSectors() * imagePlugin.GetSectorSize())) + if((s_fsize * 1024) == ((partitionEnd - partitionStart) * imagePlugin.GetSectorSize()) || (s_fsize * 512) == ((partitionEnd - partitionStart) * imagePlugin.GetSectorSize())) { sys7th = true; BigEndianBitConverter.IsLittleEndian = true; diff --git a/DiscImageChef.Filesystems/UNIXBFS.cs b/DiscImageChef.Filesystems/UNIXBFS.cs index a069b7f2..3fcacc13 100644 --- a/DiscImageChef.Filesystems/UNIXBFS.cs +++ b/DiscImageChef.Filesystems/UNIXBFS.cs @@ -56,7 +56,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; uint magic; diff --git a/DiscImageChef.Filesystems/ext2FS.cs b/DiscImageChef.Filesystems/ext2FS.cs index fb7b0c0f..d20baccd 100644 --- a/DiscImageChef.Filesystems/ext2FS.cs +++ b/DiscImageChef.Filesystems/ext2FS.cs @@ -53,7 +53,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte[] sb_sector = imagePlugin.ReadSector(2 + partitionStart); diff --git a/DiscImageChef.Filesystems/extFS.cs b/DiscImageChef.Filesystems/extFS.cs index 9365f725..4775fde9 100644 --- a/DiscImageChef.Filesystems/extFS.cs +++ b/DiscImageChef.Filesystems/extFS.cs @@ -53,7 +53,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) { - if((2 + partitionStart) >= imagePlugin.GetSectors()) + if((2 + partitionStart) >= partitionEnd) return false; byte[] sb_sector = imagePlugin.ReadSector(2 + partitionStart); // Superblock resides at 0x400 diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index 0cddfbff..462dab7d 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,9 @@ +2016-08-08 Natalia Portillo + + * Commands/CreateSidecar.cs: + Added points for skipping whole image checksum on debugging. + Track starts at index 0. + 2016-08-07 Natalia Portillo * DiscImageChef.csproj: diff --git a/DiscImageChef/Commands/CreateSidecar.cs b/DiscImageChef/Commands/CreateSidecar.cs index 4cd98dd6..2feb1449 100644 --- a/DiscImageChef/Commands/CreateSidecar.cs +++ b/DiscImageChef/Commands/CreateSidecar.cs @@ -99,6 +99,9 @@ namespace DiscImageChef.Commands Core.Checksum imgChkWorker = new Core.Checksum(); + // For fast debugging, skip checksum + //goto skipImageChecksum; + byte[] data; long position = 0; while(position < (fi.Length - 1048576)) @@ -120,6 +123,9 @@ namespace DiscImageChef.Commands imgChkWorker.Update(data); + // For fast debugging, skip checksum + //skipImageChecksum: + DicConsole.WriteLine(); fs.Close(); @@ -366,6 +372,13 @@ namespace DiscImageChef.Commands xmlTrk.StartSector = (long)trk.TrackStartSector; xmlTrk.EndSector = (long)trk.TrackEndSector; + if(trk.Indexes.ContainsKey(0)) + { + ulong idx0; + if(trk.Indexes.TryGetValue(0, out idx0)) + xmlTrk.StartSector = (long)idx0; + } + if(sidecar.OpticalDisc[0].DiscType == "CD" || sidecar.OpticalDisc[0].DiscType == "GD") {