For DiscImageChef format, compressend length should include the lzma properties 5-byte field.

This commit is contained in:
2018-01-24 13:49:21 +00:00
parent f4180a7e6d
commit 34bceca8fb

View File

@@ -220,6 +220,8 @@ namespace DiscImageChef.DiscImages
index.Add(entry); index.Add(entry);
} }
imageInfo.ImageSize = 0;
bool foundUserDataDdt = false; bool foundUserDataDdt = false;
mediaTags = new Dictionary<MediaTagType, byte[]>(); mediaTags = new Dictionary<MediaTagType, byte[]>();
foreach(IndexEntry entry in index) foreach(IndexEntry entry in index)
@@ -243,7 +245,7 @@ namespace DiscImageChef.DiscImages
Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(blockHeader)); Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(blockHeader));
blockHeader = (BlockHeader)Marshal.PtrToStructure(structurePointer, typeof(BlockHeader)); blockHeader = (BlockHeader)Marshal.PtrToStructure(structurePointer, typeof(BlockHeader));
Marshal.FreeHGlobal(structurePointer); Marshal.FreeHGlobal(structurePointer);
imageInfo.ImageSize = blockHeader.cmpLength; imageInfo.ImageSize += blockHeader.cmpLength;
if(blockHeader.identifier != entry.blockType) if(blockHeader.identifier != entry.blockType)
{ {
@@ -269,10 +271,10 @@ namespace DiscImageChef.DiscImages
if(blockHeader.compression == CompressionType.Lzma) if(blockHeader.compression == CompressionType.Lzma)
{ {
byte[] compressedTag = new byte[blockHeader.cmpLength]; byte[] compressedTag = new byte[blockHeader.cmpLength - LZMA_PROPERTIES_LENGTH];
byte[] lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; byte[] lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH];
imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH);
imageStream.Read(compressedTag, 0, (int)blockHeader.cmpLength); imageStream.Read(compressedTag, 0, compressedTag.Length);
MemoryStream compressedTagMs = new MemoryStream(compressedTag); MemoryStream compressedTagMs = new MemoryStream(compressedTag);
LzmaStream lzmaBlock = new LzmaStream(lzmaProperties, compressedTagMs); LzmaStream lzmaBlock = new LzmaStream(lzmaProperties, compressedTagMs);
data = new byte[blockHeader.length]; data = new byte[blockHeader.length];
@@ -325,7 +327,7 @@ namespace DiscImageChef.DiscImages
Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(ddtHeader)); Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(ddtHeader));
ddtHeader = (DdtHeader)Marshal.PtrToStructure(structurePointer, typeof(DdtHeader)); ddtHeader = (DdtHeader)Marshal.PtrToStructure(structurePointer, typeof(DdtHeader));
Marshal.FreeHGlobal(structurePointer); Marshal.FreeHGlobal(structurePointer);
imageInfo.ImageSize = ddtHeader.cmpLength; imageInfo.ImageSize += ddtHeader.cmpLength;
if(ddtHeader.identifier != BlockType.DeDuplicationTable) break; if(ddtHeader.identifier != BlockType.DeDuplicationTable) break;
@@ -338,10 +340,10 @@ namespace DiscImageChef.DiscImages
case CompressionType.Lzma: case CompressionType.Lzma:
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Decompressing DDT..."); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Decompressing DDT...");
DateTime ddtStart = DateTime.UtcNow; DateTime ddtStart = DateTime.UtcNow;
byte[] compressedDdt = new byte[ddtHeader.cmpLength]; byte[] compressedDdt = new byte[ddtHeader.cmpLength - LZMA_PROPERTIES_LENGTH];
byte[] lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; byte[] lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH];
imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH);
imageStream.Read(compressedDdt, 0, (int)ddtHeader.cmpLength); imageStream.Read(compressedDdt, 0, compressedDdt.Length);
MemoryStream compressedDdtMs = new MemoryStream(compressedDdt); MemoryStream compressedDdtMs = new MemoryStream(compressedDdt);
LzmaStream lzmaDdt = new LzmaStream(lzmaProperties, compressedDdtMs); LzmaStream lzmaDdt = new LzmaStream(lzmaProperties, compressedDdtMs);
byte[] decompressedDdt = new byte[ddtHeader.length]; byte[] decompressedDdt = new byte[ddtHeader.length];
@@ -468,10 +470,10 @@ namespace DiscImageChef.DiscImages
imageStream.Read(block, 0, (int)blockHeader.length); imageStream.Read(block, 0, (int)blockHeader.length);
break; break;
case CompressionType.Lzma: case CompressionType.Lzma:
byte[] compressedBlock = new byte[blockHeader.cmpLength]; byte[] compressedBlock = new byte[blockHeader.cmpLength - LZMA_PROPERTIES_LENGTH];
byte[] lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; byte[] lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH];
imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH);
imageStream.Read(compressedBlock, 0, (int)blockHeader.cmpLength); imageStream.Read(compressedBlock, 0, compressedBlock.Length);
MemoryStream compressedBlockMs = new MemoryStream(compressedBlock); MemoryStream compressedBlockMs = new MemoryStream(compressedBlock);
LzmaStream lzmaBlock = new LzmaStream(lzmaProperties, compressedBlockMs); LzmaStream lzmaBlock = new LzmaStream(lzmaProperties, compressedBlockMs);
block = new byte[blockHeader.length]; block = new byte[blockHeader.length];
@@ -781,7 +783,7 @@ namespace DiscImageChef.DiscImages
currentBlockHeader.crc64 = BitConverter.ToUInt64(crc64.Final(), 0); currentBlockHeader.crc64 = BitConverter.ToUInt64(crc64.Final(), 0);
byte[] lzmaProperties = compressedBlockStream.Properties; byte[] lzmaProperties = compressedBlockStream.Properties;
compressedBlockStream.Close(); compressedBlockStream.Close();
currentBlockHeader.cmpLength = (uint)blockStream.Length; currentBlockHeader.cmpLength = (uint)blockStream.Length + LZMA_PROPERTIES_LENGTH;
Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64); Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64);
currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0); currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0);
@@ -895,7 +897,7 @@ namespace DiscImageChef.DiscImages
currentBlockHeader.crc64 = BitConverter.ToUInt64(crc64.Final(), 0); currentBlockHeader.crc64 = BitConverter.ToUInt64(crc64.Final(), 0);
byte[] lzmaProperties = compressedBlockStream.Properties; byte[] lzmaProperties = compressedBlockStream.Properties;
compressedBlockStream.Close(); compressedBlockStream.Close();
currentBlockHeader.cmpLength = (uint)blockStream.Length; currentBlockHeader.cmpLength = (uint)blockStream.Length + LZMA_PROPERTIES_LENGTH;
Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64); Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64);
currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0); currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0);
@@ -955,7 +957,7 @@ namespace DiscImageChef.DiscImages
{ {
tagData = blockStream.ToArray(); tagData = blockStream.ToArray();
Crc64Context.Data(tagData, out tagCrc); Crc64Context.Data(tagData, out tagCrc);
tagBlock.cmpLength = (uint)tagData.Length; tagBlock.cmpLength = (uint)tagData.Length + LZMA_PROPERTIES_LENGTH;
tagBlock.cmpCrc64 = BitConverter.ToUInt64(tagCrc, 0); tagBlock.cmpCrc64 = BitConverter.ToUInt64(tagCrc, 0);
tagBlock.compression = CompressionType.Lzma; tagBlock.compression = CompressionType.Lzma;
} }
@@ -1033,7 +1035,7 @@ namespace DiscImageChef.DiscImages
byte[] lzmaProperties = compressedBlockStream.Properties; byte[] lzmaProperties = compressedBlockStream.Properties;
compressedBlockStream.Close(); compressedBlockStream.Close();
ddtHeader.cmpLength = (uint)blockStream.Length; ddtHeader.cmpLength = (uint)blockStream.Length + LZMA_PROPERTIES_LENGTH;
Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64); Crc64Context.Data(blockStream.ToArray(), out byte[] cmpCrc64);
ddtHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0); ddtHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64, 0);