From 18067f8485e05ef49b8f2cf4a6b2d32caaf46753 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 24 Jan 2018 15:35:13 +0000 Subject: [PATCH] For DiscImageChef format, calculate image size without headers and sector size (biggest found), by indexing all data blocks. --- DiscImageChef.DiscImages/DiscImageChef.cs | 32 ++++++++++++++++------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/DiscImageChef.DiscImages/DiscImageChef.cs b/DiscImageChef.DiscImages/DiscImageChef.cs index 0fd387f5f..9da94dd25 100644 --- a/DiscImageChef.DiscImages/DiscImageChef.cs +++ b/DiscImageChef.DiscImages/DiscImageChef.cs @@ -233,9 +233,7 @@ namespace DiscImageChef.DiscImages // TODO: Non-deduplicatable sector tags are data blocks case BlockType.DataBlock: // NOP block, skip - if(entry.dataType == DataType.NoData || - // Unused, skip - entry.dataType == DataType.UserData) break; + if(entry.dataType == DataType.NoData) break; imageStream.Position = (long)entry.offset; @@ -248,6 +246,14 @@ namespace DiscImageChef.DiscImages Marshal.FreeHGlobal(structurePointer); imageInfo.ImageSize += blockHeader.cmpLength; + // Unused, skip + if(entry.dataType == DataType.UserData) + { + if(blockHeader.sectorSize > imageInfo.SectorSize) + imageInfo.SectorSize = blockHeader.sectorSize; + break; + } + if(blockHeader.identifier != entry.blockType) { DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -568,18 +574,12 @@ namespace DiscImageChef.DiscImages if(!foundUserDataDdt) throw new ImageNotSupportedException("Could not find user data deduplication table."); - // TODO: Sector size! - imageInfo.SectorSize = 512; - imageInfo.CreationTime = DateTime.FromFileTimeUtc(header.creationTime); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Image created on", imageInfo.CreationTime); imageInfo.LastModificationTime = DateTime.FromFileTimeUtc(header.lastWrittenTime); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Image last written on", imageInfo.LastModificationTime); - // TODO: Calculate - //imageInfo.ImageSize = qHdr.size; - if(geometryBlock.identifier != BlockType.GeometryBlock && imageInfo.XmlMediaType == XmlMediaType.BlockMedia) { imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); @@ -964,6 +964,13 @@ namespace DiscImageChef.DiscImages Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64); currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0); + index.Add(new IndexEntry + { + blockType = BlockType.DataBlock, + dataType = DataType.UserData, + offset = (ulong)imageStream.Position + }); + structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(currentBlockHeader)); structureBytes = new byte[Marshal.SizeOf(currentBlockHeader)]; Marshal.StructureToPtr(currentBlockHeader, structurePointer, true); @@ -1078,6 +1085,13 @@ namespace DiscImageChef.DiscImages Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64); currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0); + index.Add(new IndexEntry + { + blockType = BlockType.DataBlock, + dataType = DataType.UserData, + offset = (ulong)imageStream.Position + }); + structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(currentBlockHeader)); structureBytes = new byte[Marshal.SizeOf(currentBlockHeader)]; Marshal.StructureToPtr(currentBlockHeader, structurePointer, true);