From bbc209c1219f73bd4d529c501428f712ecc6dbda Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 9 Nov 2015 19:42:00 +0000 Subject: [PATCH] * DiscImageChef.DiscImages/CDRWin.cs: Corrected partition start and length calculations. * DiscImageChef.Filesystems/BFS.cs: Corrected decoding fields. Added supports for boot sector smaller than device size as in some Be CDs. * DiscImageChef/Main.cs: Forgot to define Console.Write() --- DiscImageChef.DiscImages/CDRWin.cs | 7 ++- DiscImageChef.DiscImages/ChangeLog | 5 +++ DiscImageChef.Filesystems/BFS.cs | 67 ++++++++++++++++++----------- DiscImageChef.Filesystems/ChangeLog | 7 +++ DiscImageChef/ChangeLog | 5 +++ DiscImageChef/Main.cs | 1 + 6 files changed, 66 insertions(+), 26 deletions(-) diff --git a/DiscImageChef.DiscImages/CDRWin.cs b/DiscImageChef.DiscImages/CDRWin.cs index 9bc972b45..5e2e488ae 100644 --- a/DiscImageChef.DiscImages/CDRWin.cs +++ b/DiscImageChef.DiscImages/CDRWin.cs @@ -1055,6 +1055,8 @@ namespace DiscImageChef.ImagePlugins for (int i = 0; i < discimage.tracks.Count; i++) { + ulong index0_len = 0; + if (discimage.tracks[i].sequence == 1 && i != 0) throw new ImageNotSupportedException("Unordered tracks"); @@ -1111,6 +1113,7 @@ namespace DiscImageChef.ImagePlugins sector_offset += partition.PartitionSectors; byte_offset += partition.PartitionLength; + index0_len = partition.PartitionSectors; partitionSequence++; if (!offsetmap.ContainsKey(discimage.tracks[i].sequence)) @@ -1135,8 +1138,8 @@ namespace DiscImageChef.ImagePlugins partition.PartitionDescription = String.Format("Track {0}.", discimage.tracks[i].sequence); partition.PartitionName = discimage.tracks[i].title; partition.PartitionStartSector = sector_offset; - partition.PartitionLength = (discimage.tracks[i].sectors - (index_one_offset - index_zero_offset)) * discimage.tracks[i].bps; - partition.PartitionSectors = (discimage.tracks[i].sectors - (index_one_offset - index_zero_offset)); + partition.PartitionLength = (discimage.tracks[i].sectors - index0_len) * discimage.tracks[i].bps; + partition.PartitionSectors = (discimage.tracks[i].sectors - index0_len); partition.PartitionSequence = partitionSequence; partition.PartitionStart = byte_offset; partition.PartitionType = discimage.tracks[i].tracktype; diff --git a/DiscImageChef.DiscImages/ChangeLog b/DiscImageChef.DiscImages/ChangeLog index e68a78617..482260c1f 100644 --- a/DiscImageChef.DiscImages/ChangeLog +++ b/DiscImageChef.DiscImages/ChangeLog @@ -1,3 +1,8 @@ +2015-11-09 Natalia Portillo + + * CDRWin.cs: + Corrected partition start and length calculations. + 2015-10-19 Natalia Portillo * DiscImageChef.DiscImages.csproj: diff --git a/DiscImageChef.Filesystems/BFS.cs b/DiscImageChef.Filesystems/BFS.cs index fed93b993..78a38c3f5 100644 --- a/DiscImageChef.Filesystems/BFS.cs +++ b/DiscImageChef.Filesystems/BFS.cs @@ -78,6 +78,13 @@ namespace DiscImageChef.Plugins if (magic == BEFS_MAGIC1 || magic_be == BEFS_MAGIC1) return true; + + magic = BitConverter.ToUInt32(sb_sector, 0x220); + magic_be = BigEndianBitConverter.ToUInt32(sb_sector, 0x220); + + if (magic == BEFS_MAGIC1 || magic_be == BEFS_MAGIC1) + return true; + sb_sector = imagePlugin.ReadSector(1 + partitionStart); magic = BitConverter.ToUInt32(sb_sector, 0x20); @@ -116,35 +123,47 @@ namespace DiscImageChef.Plugins BigEndianBitConverter.IsLittleEndian &= besb.magic1 != BEFS_CIGAM1; } else - return; + { + byte[] temp = imagePlugin.ReadSector(0 + partitionStart); + besb.magic1 = BigEndianBitConverter.ToUInt32(temp, 0x220); + + if (besb.magic1 == BEFS_MAGIC1 || besb.magic1 == BEFS_CIGAM1) // There is a boot sector + { + BigEndianBitConverter.IsLittleEndian &= besb.magic1 != BEFS_CIGAM1; + sb_sector = new byte[0x200]; + Array.Copy(temp, 0x200, sb_sector, 0, 0x200); + } + else + return; + } } Array.Copy(sb_sector, 0x000, name_bytes, 0, 0x20); besb.name = StringHandlers.CToString(name_bytes); besb.magic1 = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); - besb.fs_byte_order = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); - besb.block_size = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); - besb.block_shift = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); - besb.num_blocks = BigEndianBitConverter.ToInt64(sb_sector, 0x20); - besb.used_blocks = BigEndianBitConverter.ToInt64(sb_sector, 0x20); - besb.inode_size = BigEndianBitConverter.ToInt32(sb_sector, 0x20); - besb.magic2 = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); - besb.blocks_per_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x20); - besb.ag_shift = BigEndianBitConverter.ToInt32(sb_sector, 0x20); - besb.num_ags = BigEndianBitConverter.ToInt32(sb_sector, 0x20); - besb.flags = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); - besb.log_blocks_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x20); - besb.log_blocks_start = BigEndianBitConverter.ToUInt16(sb_sector, 0x20); - besb.log_blocks_len = BigEndianBitConverter.ToUInt16(sb_sector, 0x20); - besb.log_start = BigEndianBitConverter.ToInt64(sb_sector, 0x20); - besb.log_end = BigEndianBitConverter.ToInt64(sb_sector, 0x20); - besb.magic3 = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); - besb.root_dir_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x20); - besb.root_dir_start = BigEndianBitConverter.ToUInt16(sb_sector, 0x20); - besb.root_dir_len = BigEndianBitConverter.ToUInt16(sb_sector, 0x20); - besb.indices_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x20); - besb.indices_start = BigEndianBitConverter.ToUInt16(sb_sector, 0x20); - besb.indices_len = BigEndianBitConverter.ToUInt16(sb_sector, 0x20); + besb.fs_byte_order = BigEndianBitConverter.ToUInt32(sb_sector, 0x24); + besb.block_size = BigEndianBitConverter.ToUInt32(sb_sector, 0x28); + besb.block_shift = BigEndianBitConverter.ToUInt32(sb_sector, 0x2C); + besb.num_blocks = BigEndianBitConverter.ToInt64(sb_sector, 0x30); + besb.used_blocks = BigEndianBitConverter.ToInt64(sb_sector, 0x38); + besb.inode_size = BigEndianBitConverter.ToInt32(sb_sector, 0x40); + besb.magic2 = BigEndianBitConverter.ToUInt32(sb_sector, 0x44); + besb.blocks_per_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x48); + besb.ag_shift = BigEndianBitConverter.ToInt32(sb_sector, 0x4C); + besb.num_ags = BigEndianBitConverter.ToInt32(sb_sector, 0x50); + besb.flags = BigEndianBitConverter.ToUInt32(sb_sector, 0x54); + besb.log_blocks_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x58); + besb.log_blocks_start = BigEndianBitConverter.ToUInt16(sb_sector, 0x5C); + besb.log_blocks_len = BigEndianBitConverter.ToUInt16(sb_sector, 0x5E); + besb.log_start = BigEndianBitConverter.ToInt64(sb_sector, 0x60); + besb.log_end = BigEndianBitConverter.ToInt64(sb_sector, 0x68); + besb.magic3 = BigEndianBitConverter.ToUInt32(sb_sector, 0x70); + besb.root_dir_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x74); + besb.root_dir_start = BigEndianBitConverter.ToUInt16(sb_sector, 0x78); + besb.root_dir_len = BigEndianBitConverter.ToUInt16(sb_sector, 0x7A); + besb.indices_ag = BigEndianBitConverter.ToInt32(sb_sector, 0x7C); + besb.indices_start = BigEndianBitConverter.ToUInt16(sb_sector, 0x80); + besb.indices_len = BigEndianBitConverter.ToUInt16(sb_sector, 0x82); if (!BigEndianBitConverter.IsLittleEndian) // Big-endian filesystem sb.AppendLine("Big-endian BeFS"); diff --git a/DiscImageChef.Filesystems/ChangeLog b/DiscImageChef.Filesystems/ChangeLog index 624b80f7f..aa6129c65 100644 --- a/DiscImageChef.Filesystems/ChangeLog +++ b/DiscImageChef.Filesystems/ChangeLog @@ -1,3 +1,10 @@ +2015-11-09 Natalia Portillo + + * BFS.cs: + Corrected decoding fields. + Added supports for boot sector smaller than device size as in + some Be CDs. + 2015-10-19 Natalia Portillo * DiscImageChef.Filesystems.csproj: diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index bb53d7679..0217d90d8 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,8 @@ +2015-11-09 Natalia Portillo + + * Main.cs: + Forgot to define Console.Write() + 2015-11-05 Natalia Portillo * Commands/DeviceInfo.cs: diff --git a/DiscImageChef/Main.cs b/DiscImageChef/Main.cs index 44e960b44..c65b4b726 100644 --- a/DiscImageChef/Main.cs +++ b/DiscImageChef/Main.cs @@ -73,6 +73,7 @@ namespace DiscImageChef string AssemblyCopyright = ((AssemblyCopyrightAttribute) attributes[0]).Copyright; DicConsole.WriteLineEvent += System.Console.WriteLine; + DicConsole.WriteEvent += System.Console.Write; DicConsole.ErrorWriteLineEvent += System.Console.Error.WriteLine; DicConsole.WriteLine("{0} {1}", AssemblyTitle, AssemblyVersion);