diff --git a/DiscImageChef.DiscImages/Apple2MG/Identify.cs b/DiscImageChef.DiscImages/Apple2MG/Identify.cs index ae7ebf7c1..170b88286 100644 --- a/DiscImageChef.DiscImages/Apple2MG/Identify.cs +++ b/DiscImageChef.DiscImages/Apple2MG/Identify.cs @@ -30,9 +30,9 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using DiscImageChef.CommonTypes.Interfaces; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -48,28 +48,23 @@ namespace DiscImageChef.DiscImages byte[] header = new byte[64]; stream.Read(header, 0, 64); - uint magic = BitConverter.ToUInt32(header, 0x00); - if(magic != MAGIC) return false; + A2ImgHeader hdr = Marshal.SpanToStructureLittleEndian(header); - uint dataoff = BitConverter.ToUInt32(header, 0x18); - if(dataoff > stream.Length) return false; + if(hdr.Magic != MAGIC) 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 - if(datasize == 0x00800C00) datasize = 0x000C8000; - if(dataoff + datasize > stream.Length) return false; + if(hdr.DataSize == 0x00800C00) hdr.DataSize = 0x000C8000; + if(hdr.DataOffset + hdr.DataSize > stream.Length) return false; - uint commentoff = BitConverter.ToUInt32(header, 0x20); - if(commentoff > stream.Length) return false; + if(hdr.CommentOffset > stream.Length) return false; - uint commentsize = BitConverter.ToUInt32(header, 0x24); - if(commentoff + commentsize > stream.Length) return false; + if(hdr.CommentOffset + hdr.CommentSize > stream.Length) return false; - uint creatoroff = BitConverter.ToUInt32(header, 0x28); - if(creatoroff > stream.Length) return false; + if(hdr.CreatorSpecificOffset > stream.Length) return false; - uint creatorsize = BitConverter.ToUInt32(header, 0x2C); - return creatoroff + creatorsize <= stream.Length; + return hdr.CreatorSpecificOffset + hdr.CreatorSpecificSize <= stream.Length; } } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/Apple2MG/Read.cs b/DiscImageChef.DiscImages/Apple2MG/Read.cs index 172fa3b6c..4757466df 100644 --- a/DiscImageChef.DiscImages/Apple2MG/Read.cs +++ b/DiscImageChef.DiscImages/Apple2MG/Read.cs @@ -38,6 +38,7 @@ using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; using DiscImageChef.Filters; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -58,23 +59,7 @@ namespace DiscImageChef.DiscImages Array.Copy(header, 0, magic, 0, 4); Array.Copy(header, 4, creator, 0, 4); - imageHeader.Magic = BitConverter.ToUInt32(header, 0x00); - 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); + imageHeader = Marshal.SpanToStructureLittleEndian(header); if(imageHeader.DataSize == 0x00800C00) {