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

View File

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