* DiscImageChef.DiscImages/NDIF.cs:

Corrected sector calculation.
	Added support for multiple block chunk resources.

	* DiscImageChef.DiscImages/UDIF.cs:
	  Corrected sector calculation.
This commit is contained in:
2016-09-10 01:39:43 +01:00
parent b453752155
commit 3c520c3216
2 changed files with 77 additions and 65 deletions

View File

@@ -85,9 +85,9 @@ namespace DiscImageChef.DiscImages
/// </summary> /// </summary>
public uint maxSectorsPerChunk; public uint maxSectorsPerChunk;
/// <summary> /// <summary>
/// Always 0? /// Offset to add to every chunk offset
/// </summary> /// </summary>
public uint zeroOffset; public uint dataOffset;
/// <summary> /// <summary>
/// CRC28 of whole image /// CRC28 of whole image
/// </summary> /// </summary>
@@ -135,7 +135,7 @@ namespace DiscImageChef.DiscImages
/// </summary> /// </summary>
public byte type; public byte type;
/// <summary> /// <summary>
/// Offset in image to start of chunk /// Offset in start of chunk
/// </summary> /// </summary>
public uint offset; public uint offset;
/// <summary> /// <summary>
@@ -255,7 +255,7 @@ namespace DiscImageChef.DiscImages
ResourceFork rsrcFork; ResourceFork rsrcFork;
Resource rsrc; Resource rsrc;
byte[] bcem; short[] bcems;
try try
{ {
@@ -265,16 +265,21 @@ namespace DiscImageChef.DiscImages
rsrc = rsrcFork.GetResource(NDIF_Resource); rsrc = rsrcFork.GetResource(NDIF_Resource);
if(!rsrc.ContainsId(NDIF_ResourceID)) bcems = rsrc.GetIds();
return false;
bcem = rsrc.GetResource(NDIF_ResourceID); if(bcems == null || bcems.Length == 0)
return false;
} }
catch(InvalidCastException) catch(InvalidCastException)
{ {
return false; return false;
} }
ImageInfo.sectors = 0;
foreach(short id in bcems)
{
byte[] bcem = rsrc.GetResource(NDIF_ResourceID);
if(bcem.Length < 128) if(bcem.Length < 128)
return false; return false;
@@ -285,7 +290,7 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("NDIF plugin", "footer.name = {0}", StringHandlers.PascalToString(header.name)); DicConsole.DebugWriteLine("NDIF plugin", "footer.name = {0}", StringHandlers.PascalToString(header.name));
DicConsole.DebugWriteLine("NDIF plugin", "footer.sectors = {0}", header.sectors); DicConsole.DebugWriteLine("NDIF plugin", "footer.sectors = {0}", header.sectors);
DicConsole.DebugWriteLine("NDIF plugin", "footer.maxSectorsPerChunk = {0}", header.maxSectorsPerChunk); DicConsole.DebugWriteLine("NDIF plugin", "footer.maxSectorsPerChunk = {0}", header.maxSectorsPerChunk);
DicConsole.DebugWriteLine("NDIF plugin", "footer.zeroOffset = {0}", header.zeroOffset); DicConsole.DebugWriteLine("NDIF plugin", "footer.dataOffset = {0}", header.dataOffset);
DicConsole.DebugWriteLine("NDIF plugin", "footer.crc = 0x{0:X7}", header.crc); DicConsole.DebugWriteLine("NDIF plugin", "footer.crc = 0x{0:X7}", header.crc);
DicConsole.DebugWriteLine("NDIF plugin", "footer.segmented = {0}", header.segmented); DicConsole.DebugWriteLine("NDIF plugin", "footer.segmented = {0}", header.segmented);
DicConsole.DebugWriteLine("NDIF plugin", "footer.p1 = 0x{0:X8}", header.p1); DicConsole.DebugWriteLine("NDIF plugin", "footer.p1 = 0x{0:X8}", header.p1);
@@ -304,6 +309,8 @@ namespace DiscImageChef.DiscImages
BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;
ImageInfo.sectors += header.sectors;
for(int i = 0; i < header.chunks; i++) for(int i = 0; i < header.chunks; i++)
{ {
// Obsolete read-only NDIF only prepended the header and then put the image without any kind of block references. // Obsolete read-only NDIF only prepended the header and then put the image without any kind of block references.
@@ -322,10 +329,10 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("NDIF plugin", "bHdr.chunk[{0}].length = {1}", i, bChnk.length); DicConsole.DebugWriteLine("NDIF plugin", "bHdr.chunk[{0}].length = {1}", i, bChnk.length);
if(bChnk.type == ChunkType_End) if(bChnk.type == ChunkType_End)
{
ImageInfo.sectors = bChnk.sector;
break; break;
}
bChnk.offset += header.dataOffset;
bChnk.sector += (uint)ImageInfo.sectors;
// TODO: Handle compressed chunks // TODO: Handle compressed chunks
if((bChnk.type & ChunkType_CompressedMask) == ChunkType_CompressedMask) if((bChnk.type & ChunkType_CompressedMask) == ChunkType_CompressedMask)
@@ -336,6 +343,7 @@ namespace DiscImageChef.DiscImages
chunks.Add(bChnk.sector, bChnk); chunks.Add(bChnk.sector, bChnk);
} }
}
if(header.segmented > 0) if(header.segmented > 0)
throw new ImageNotSupportedException("Segmented images are not yet supported."); throw new ImageNotSupportedException("Segmented images are not yet supported.");

View File

@@ -405,6 +405,7 @@ namespace DiscImageChef.DiscImages
ImageInfo.imageApplication = "DiskCopy"; ImageInfo.imageApplication = "DiskCopy";
DicConsole.DebugWriteLine("UDIF plugin", "Image application = {0} version {1}", ImageInfo.imageApplication, ImageInfo.imageApplicationVersion); DicConsole.DebugWriteLine("UDIF plugin", "Image application = {0} version {1}", ImageInfo.imageApplication, ImageInfo.imageApplicationVersion);
ImageInfo.sectors = 0;
if(!fakeBlockChunks) if(!fakeBlockChunks)
{ {
if(blkxList.Count == 0) if(blkxList.Count == 0)
@@ -452,10 +453,13 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("UDIF plugin", "bHdr.chunk[{0}].length = {1}", i, bChnk.length); DicConsole.DebugWriteLine("UDIF plugin", "bHdr.chunk[{0}].length = {1}", i, bChnk.length);
if(bChnk.type == ChunkType_End) if(bChnk.type == ChunkType_End)
{
ImageInfo.sectors = bChnk.sector;
break; break;
}
ImageInfo.sectors += bChnk.sectors;
// Chunk offset is relative
bChnk.sector += bHdr.sectorStart;
bChnk.offset += bHdr.dataOffset;
// TODO: Handle comments // TODO: Handle comments
if(bChnk.type == ChunkType_Commnt) if(bChnk.type == ChunkType_Commnt)