For DiscImageChef format, calculate image size without headers and sector size (biggest found), by indexing all data blocks.

This commit is contained in:
2018-01-24 15:35:13 +00:00
parent 9c6df48e87
commit 18067f8485

View File

@@ -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);