mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Use new marshaller in 2MG disk images.
This commit is contained in:
@@ -30,9 +30,9 @@
|
|||||||
// Copyright © 2011-2019 Natalia Portillo
|
// Copyright © 2011-2019 Natalia Portillo
|
||||||
// ****************************************************************************/
|
// ****************************************************************************/
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using DiscImageChef.CommonTypes.Interfaces;
|
using DiscImageChef.CommonTypes.Interfaces;
|
||||||
|
using DiscImageChef.Helpers;
|
||||||
|
|
||||||
namespace DiscImageChef.DiscImages
|
namespace DiscImageChef.DiscImages
|
||||||
{
|
{
|
||||||
@@ -48,28 +48,23 @@ namespace DiscImageChef.DiscImages
|
|||||||
byte[] header = new byte[64];
|
byte[] header = new byte[64];
|
||||||
stream.Read(header, 0, 64);
|
stream.Read(header, 0, 64);
|
||||||
|
|
||||||
uint magic = BitConverter.ToUInt32(header, 0x00);
|
A2ImgHeader hdr = Marshal.SpanToStructureLittleEndian<A2ImgHeader>(header);
|
||||||
if(magic != MAGIC) return false;
|
|
||||||
|
|
||||||
uint dataoff = BitConverter.ToUInt32(header, 0x18);
|
if(hdr.Magic != MAGIC) return false;
|
||||||
if(dataoff > stream.Length) return false;
|
|
||||||
|
if(hdr.DataOffset > stream.Length) return false;
|
||||||
|
|
||||||
uint datasize = BitConverter.ToUInt32(header, 0x1C);
|
|
||||||
// There seems to be incorrect endian in some images on the wild
|
// There seems to be incorrect endian in some images on the wild
|
||||||
if(datasize == 0x00800C00) datasize = 0x000C8000;
|
if(hdr.DataSize == 0x00800C00) hdr.DataSize = 0x000C8000;
|
||||||
if(dataoff + datasize > stream.Length) return false;
|
if(hdr.DataOffset + hdr.DataSize > stream.Length) return false;
|
||||||
|
|
||||||
uint commentoff = BitConverter.ToUInt32(header, 0x20);
|
if(hdr.CommentOffset > stream.Length) return false;
|
||||||
if(commentoff > stream.Length) return false;
|
|
||||||
|
|
||||||
uint commentsize = BitConverter.ToUInt32(header, 0x24);
|
if(hdr.CommentOffset + hdr.CommentSize > stream.Length) return false;
|
||||||
if(commentoff + commentsize > stream.Length) return false;
|
|
||||||
|
|
||||||
uint creatoroff = BitConverter.ToUInt32(header, 0x28);
|
if(hdr.CreatorSpecificOffset > stream.Length) return false;
|
||||||
if(creatoroff > stream.Length) return false;
|
|
||||||
|
|
||||||
uint creatorsize = BitConverter.ToUInt32(header, 0x2C);
|
return hdr.CreatorSpecificOffset + hdr.CreatorSpecificSize <= stream.Length;
|
||||||
return creatoroff + creatorsize <= stream.Length;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -38,6 +38,7 @@ using DiscImageChef.CommonTypes.Enums;
|
|||||||
using DiscImageChef.CommonTypes.Interfaces;
|
using DiscImageChef.CommonTypes.Interfaces;
|
||||||
using DiscImageChef.Console;
|
using DiscImageChef.Console;
|
||||||
using DiscImageChef.Filters;
|
using DiscImageChef.Filters;
|
||||||
|
using DiscImageChef.Helpers;
|
||||||
|
|
||||||
namespace DiscImageChef.DiscImages
|
namespace DiscImageChef.DiscImages
|
||||||
{
|
{
|
||||||
@@ -58,23 +59,7 @@ namespace DiscImageChef.DiscImages
|
|||||||
Array.Copy(header, 0, magic, 0, 4);
|
Array.Copy(header, 0, magic, 0, 4);
|
||||||
Array.Copy(header, 4, creator, 0, 4);
|
Array.Copy(header, 4, creator, 0, 4);
|
||||||
|
|
||||||
imageHeader.Magic = BitConverter.ToUInt32(header, 0x00);
|
imageHeader = Marshal.SpanToStructureLittleEndian<A2ImgHeader>(header);
|
||||||
imageHeader.Creator = BitConverter.ToUInt32(header, 0x04);
|
|
||||||
imageHeader.HeaderSize = BitConverter.ToUInt16(header, 0x08);
|
|
||||||
imageHeader.Version = BitConverter.ToUInt16(header, 0x0A);
|
|
||||||
imageHeader.ImageFormat = (SectorOrder)BitConverter.ToUInt32(header, 0x0C);
|
|
||||||
imageHeader.Flags = BitConverter.ToUInt32(header, 0x10);
|
|
||||||
imageHeader.Blocks = BitConverter.ToUInt32(header, 0x14);
|
|
||||||
imageHeader.DataOffset = BitConverter.ToUInt32(header, 0x18);
|
|
||||||
imageHeader.DataSize = BitConverter.ToUInt32(header, 0x1C);
|
|
||||||
imageHeader.CommentOffset = BitConverter.ToUInt32(header, 0x20);
|
|
||||||
imageHeader.CommentSize = BitConverter.ToUInt32(header, 0x24);
|
|
||||||
imageHeader.CreatorSpecificOffset = BitConverter.ToUInt32(header, 0x28);
|
|
||||||
imageHeader.CreatorSpecificSize = BitConverter.ToUInt32(header, 0x2C);
|
|
||||||
imageHeader.Reserved1 = BitConverter.ToUInt32(header, 0x30);
|
|
||||||
imageHeader.Reserved2 = BitConverter.ToUInt32(header, 0x34);
|
|
||||||
imageHeader.Reserved3 = BitConverter.ToUInt32(header, 0x38);
|
|
||||||
imageHeader.Reserved4 = BitConverter.ToUInt32(header, 0x3C);
|
|
||||||
|
|
||||||
if(imageHeader.DataSize == 0x00800C00)
|
if(imageHeader.DataSize == 0x00800C00)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user