diff --git a/DiscImageChef.DiscImages/Alcohol120/Identify.cs b/DiscImageChef.DiscImages/Alcohol120/Identify.cs index 62bf6d864..337db7168 100644 --- a/DiscImageChef.DiscImages/Alcohol120/Identify.cs +++ b/DiscImageChef.DiscImages/Alcohol120/Identify.cs @@ -30,11 +30,10 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -48,10 +47,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[88]; stream.Read(hdr, 0, 88); - IntPtr hdrPtr = Marshal.AllocHGlobal(88); - Marshal.Copy(hdr, 0, hdrPtr, 88); - AlcoholHeader header = (AlcoholHeader)Marshal.PtrToStructure(hdrPtr, typeof(AlcoholHeader)); - Marshal.FreeHGlobal(hdrPtr); + AlcoholHeader header = Marshal.ByteArrayToStructureLittleEndian(hdr); return header.signature.SequenceEqual(alcoholSignature); } diff --git a/DiscImageChef.DiscImages/Alcohol120/Read.cs b/DiscImageChef.DiscImages/Alcohol120/Read.cs index a171bf1ea..af5a52eb3 100644 --- a/DiscImageChef.DiscImages/Alcohol120/Read.cs +++ b/DiscImageChef.DiscImages/Alcohol120/Read.cs @@ -34,7 +34,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; @@ -44,6 +43,7 @@ using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; using DiscImageChef.Decoders.CD; using DiscImageChef.Decoders.DVD; +using DiscImageChef.Helpers; using DMI = DiscImageChef.Decoders.Xbox.DMI; using Session = DiscImageChef.CommonTypes.Structs.Session; @@ -60,10 +60,7 @@ namespace DiscImageChef.DiscImages isDvd = false; byte[] hdr = new byte[88]; stream.Read(hdr, 0, 88); - IntPtr hdrPtr = Marshal.AllocHGlobal(88); - Marshal.Copy(hdr, 0, hdrPtr, 88); - AlcoholHeader header = (AlcoholHeader)Marshal.PtrToStructure(hdrPtr, typeof(AlcoholHeader)); - Marshal.FreeHGlobal(hdrPtr); + AlcoholHeader header = Marshal.ByteArrayToStructureLittleEndian(hdr); DicConsole.DebugWriteLine("Alcohol 120% plugin", "header.signature = {0}", Encoding.ASCII.GetString(header.signature)); @@ -99,10 +96,7 @@ namespace DiscImageChef.DiscImages { byte[] sesHdr = new byte[24]; stream.Read(sesHdr, 0, 24); - IntPtr sesPtr = Marshal.AllocHGlobal(24); - Marshal.Copy(sesHdr, 0, sesPtr, 24); - AlcoholSession session = (AlcoholSession)Marshal.PtrToStructure(sesPtr, typeof(AlcoholSession)); - Marshal.FreeHGlobal(sesPtr); + AlcoholSession session = Marshal.ByteArrayToStructureLittleEndian(sesHdr); DicConsole.DebugWriteLine("Alcohol 120% plugin", "session[{1}].sessionStart = {0}", session.sessionStart, i); @@ -138,10 +132,7 @@ namespace DiscImageChef.DiscImages { byte[] trkHdr = new byte[80]; stream.Read(trkHdr, 0, 80); - IntPtr trkPtr = Marshal.AllocHGlobal(80); - Marshal.Copy(trkHdr, 0, trkPtr, 80); - AlcoholTrack track = (AlcoholTrack)Marshal.PtrToStructure(trkPtr, typeof(AlcoholTrack)); - Marshal.FreeHGlobal(trkPtr); + AlcoholTrack track = Marshal.ByteArrayToStructureLittleEndian(trkHdr); if(track.mode == AlcoholTrackMode.Mode2F1Alt || track.mode == AlcoholTrackMode.Mode2F1Alt) oldIncorrectImage = true; @@ -216,11 +207,7 @@ namespace DiscImageChef.DiscImages byte[] extHdr = new byte[8]; stream.Seek(track.extraOffset, SeekOrigin.Begin); stream.Read(extHdr, 0, 8); - IntPtr extPtr = Marshal.AllocHGlobal(8); - Marshal.Copy(extHdr, 0, extPtr, 8); - AlcoholTrackExtra extra = - (AlcoholTrackExtra)Marshal.PtrToStructure(extPtr, typeof(AlcoholTrackExtra)); - Marshal.FreeHGlobal(extPtr); + AlcoholTrackExtra extra = Marshal.ByteArrayToStructureLittleEndian(extHdr); DicConsole.DebugWriteLine("Alcohol 120% plugin", "track[{1}].extra.pregap = {0}", extra.pregap, track.point); @@ -240,11 +227,7 @@ namespace DiscImageChef.DiscImages byte[] footer = new byte[16]; stream.Seek(footerOff, SeekOrigin.Begin); stream.Read(footer, 0, 16); - alcFooter = new AlcoholFooter(); - IntPtr footPtr = Marshal.AllocHGlobal(16); - Marshal.Copy(footer, 0, footPtr, 16); - alcFooter = (AlcoholFooter)Marshal.PtrToStructure(footPtr, typeof(AlcoholFooter)); - Marshal.FreeHGlobal(footPtr); + alcFooter = Marshal.ByteArrayToStructureLittleEndian(footer); DicConsole.DebugWriteLine("Alcohol 120% plugin", "footer.filenameOffset = {0}", alcFooter.filenameOffset); diff --git a/DiscImageChef.DiscImages/Anex86/Identify.cs b/DiscImageChef.DiscImages/Anex86/Identify.cs index 7a2153a1d..de9801123 100644 --- a/DiscImageChef.DiscImages/Anex86/Identify.cs +++ b/DiscImageChef.DiscImages/Anex86/Identify.cs @@ -51,9 +51,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(fdihdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - fdihdr = (Anex86Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Anex86Header)); - handle.Free(); + fdihdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.unknown = {0}", fdihdr.unknown); DicConsole.DebugWriteLine("Anex86 plugin", "fdihdr.hddtype = {0}", fdihdr.hddtype); diff --git a/DiscImageChef.DiscImages/Anex86/Read.cs b/DiscImageChef.DiscImages/Anex86/Read.cs index d4758e0b9..ec902cf8f 100644 --- a/DiscImageChef.DiscImages/Anex86/Read.cs +++ b/DiscImageChef.DiscImages/Anex86/Read.cs @@ -54,9 +54,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(fdihdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - fdihdr = (Anex86Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Anex86Header)); - handle.Free(); + fdihdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); imageInfo.MediaType = Geometry.GetMediaType(((ushort)fdihdr.cylinders, (byte)fdihdr.heads, (ushort)fdihdr.spt, (uint)fdihdr.bps, MediaEncoding.MFM, diff --git a/DiscImageChef.DiscImages/Apridisk/Read.cs b/DiscImageChef.DiscImages/Apridisk/Read.cs index 508f74ebe..15146690f 100644 --- a/DiscImageChef.DiscImages/Apridisk/Read.cs +++ b/DiscImageChef.DiscImages/Apridisk/Read.cs @@ -62,10 +62,7 @@ namespace DiscImageChef.DiscImages byte[] recB = new byte[recordSize]; stream.Read(recB, 0, recordSize); - GCHandle handle = GCHandle.Alloc(recB, GCHandleType.Pinned); - ApridiskRecord record = - (ApridiskRecord)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ApridiskRecord)); - handle.Free(); + ApridiskRecord record = Helpers.Marshal.ByteArrayToStructureLittleEndian(recB); switch(record.type) { @@ -152,10 +149,7 @@ namespace DiscImageChef.DiscImages byte[] recB = new byte[recordSize]; stream.Read(recB, 0, recordSize); - GCHandle handle = GCHandle.Alloc(recB, GCHandleType.Pinned); - ApridiskRecord record = - (ApridiskRecord)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ApridiskRecord)); - handle.Free(); + ApridiskRecord record = Helpers.Marshal.ByteArrayToStructureLittleEndian(recB); switch(record.type) { @@ -206,8 +200,8 @@ namespace DiscImageChef.DiscImages imageInfo.SectorsPerTrack); imageInfo.MediaType = Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads, - (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, - false)); + (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, + false)); imageInfo.ImageSize = (ulong)stream.Length - headersizes; imageInfo.CreationTime = imageFilter.GetCreationTime(); diff --git a/DiscImageChef.DiscImages/BlindWrite5/Read.cs b/DiscImageChef.DiscImages/BlindWrite5/Read.cs index 344c3a048..e6fb8f45e 100644 --- a/DiscImageChef.DiscImages/BlindWrite5/Read.cs +++ b/DiscImageChef.DiscImages/BlindWrite5/Read.cs @@ -35,7 +35,6 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; @@ -47,6 +46,7 @@ using DiscImageChef.Decoders.CD; using DiscImageChef.Decoders.DVD; using DiscImageChef.Decoders.SCSI; using DiscImageChef.Decoders.SCSI.MMC; +using DiscImageChef.Helpers; using DMI = DiscImageChef.Decoders.Xbox.DMI; using Session = DiscImageChef.CommonTypes.Structs.Session; @@ -62,11 +62,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[260]; stream.Read(hdr, 0, 260); - header = new Bw5Header(); - IntPtr hdrPtr = Marshal.AllocHGlobal(260); - Marshal.Copy(hdr, 0, hdrPtr, 260); - header = (Bw5Header)Marshal.PtrToStructure(hdrPtr, typeof(Bw5Header)); - Marshal.FreeHGlobal(hdrPtr); + header = Marshal.ByteArrayToStructureLittleEndian(hdr); DicConsole.DebugWriteLine("BlindWrite5 plugin", "header.signature = {0}", StringHandlers.CToString(header.signature)); @@ -328,12 +324,7 @@ namespace DiscImageChef.DiscImages { byte[] trk = new byte[72]; stream.Read(trk, 0, 72); - session.Tracks[tSeq] = new Bw5TrackDescriptor(); - IntPtr trkPtr = Marshal.AllocHGlobal(72); - Marshal.Copy(trk, 0, trkPtr, 72); - session.Tracks[tSeq] = - (Bw5TrackDescriptor)Marshal.PtrToStructure(trkPtr, typeof(Bw5TrackDescriptor)); - Marshal.FreeHGlobal(trkPtr); + session.Tracks[tSeq] = Marshal.ByteArrayToStructureLittleEndian(trk); if(session.Tracks[tSeq].type == Bw5TrackType.Dvd || session.Tracks[tSeq].type == Bw5TrackType.NotData) diff --git a/DiscImageChef.DiscImages/CHD/Read.cs b/DiscImageChef.DiscImages/CHD/Read.cs index 5f201fae3..22099b990 100644 --- a/DiscImageChef.DiscImages/CHD/Read.cs +++ b/DiscImageChef.DiscImages/CHD/Read.cs @@ -34,7 +34,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using DiscImageChef.CommonTypes; @@ -44,7 +43,7 @@ using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; using DiscImageChef.Decoders.ATA; -using Marshal = DiscImageChef.Helpers.Marshal; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -111,12 +110,7 @@ namespace DiscImageChef.DiscImages stream.Read(hunkSectorBytes, 0, 512); // This does the big-endian trick but reverses the order of elements also Array.Reverse(hunkSectorBytes); - GCHandle handle = GCHandle.Alloc(hunkSectorBytes, GCHandleType.Pinned); - HunkSector hunkSector = - (HunkSector) - System.Runtime.InteropServices.Marshal.PtrToStructure(handle.AddrOfPinnedObject(), - typeof(HunkSector)); - handle.Free(); + HunkSector hunkSector = Marshal.ByteArrayToStructureLittleEndian(hunkSectorBytes); // This restores the order of elements Array.Reverse(hunkSector.hunkEntry); if(hunkTable.Length >= i * 512 / 8 + 512 / 8) @@ -186,12 +180,7 @@ namespace DiscImageChef.DiscImages stream.Read(hunkSectorBytes, 0, 512); // This does the big-endian trick but reverses the order of elements also Array.Reverse(hunkSectorBytes); - GCHandle handle = GCHandle.Alloc(hunkSectorBytes, GCHandleType.Pinned); - HunkSector hunkSector = - (HunkSector) - System.Runtime.InteropServices.Marshal.PtrToStructure(handle.AddrOfPinnedObject(), - typeof(HunkSector)); - handle.Free(); + HunkSector hunkSector = Marshal.ByteArrayToStructureLittleEndian(hunkSectorBytes); // This restores the order of elements Array.Reverse(hunkSector.hunkEntry); if(hunkTable.Length >= i * 512 / 8 + 512 / 8) @@ -369,12 +358,8 @@ namespace DiscImageChef.DiscImages stream.Read(hunkSectorBytes, 0, 512); // This does the big-endian trick but reverses the order of elements also Array.Reverse(hunkSectorBytes); - GCHandle handle = GCHandle.Alloc(hunkSectorBytes, GCHandleType.Pinned); HunkSectorSmall hunkSector = - (HunkSectorSmall) - System.Runtime.InteropServices.Marshal.PtrToStructure(handle.AddrOfPinnedObject(), - typeof(HunkSectorSmall)); - handle.Free(); + Marshal.ByteArrayToStructureLittleEndian(hunkSectorBytes); // This restores the order of elements Array.Reverse(hunkSector.hunkEntry); if(hunkTableSmall.Length >= i * 512 / 4 + 512 / 4) diff --git a/DiscImageChef.DiscImages/CPCDSK/Identify.cs b/DiscImageChef.DiscImages/CPCDSK/Identify.cs index a3e1d1559..29b762d37 100644 --- a/DiscImageChef.DiscImages/CPCDSK/Identify.cs +++ b/DiscImageChef.DiscImages/CPCDSK/Identify.cs @@ -30,12 +30,11 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -50,10 +49,7 @@ namespace DiscImageChef.DiscImages byte[] headerB = new byte[256]; stream.Read(headerB, 0, 256); - IntPtr headerPtr = Marshal.AllocHGlobal(256); - Marshal.Copy(headerB, 0, headerPtr, 256); - CpcDiskInfo header = (CpcDiskInfo)Marshal.PtrToStructure(headerPtr, typeof(CpcDiskInfo)); - Marshal.FreeHGlobal(headerPtr); + CpcDiskInfo header = Marshal.ByteArrayToStructureLittleEndian(headerB); DicConsole.DebugWriteLine("CPCDSK plugin", "header.magic = \"{0}\"", StringHandlers.CToString(header.magic)); diff --git a/DiscImageChef.DiscImages/CPCDSK/Read.cs b/DiscImageChef.DiscImages/CPCDSK/Read.cs index c33d11df5..9bdfc0ac3 100644 --- a/DiscImageChef.DiscImages/CPCDSK/Read.cs +++ b/DiscImageChef.DiscImages/CPCDSK/Read.cs @@ -34,7 +34,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using DiscImageChef.Checksums; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; @@ -42,6 +41,7 @@ using DiscImageChef.CommonTypes.Exceptions; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; using DiscImageChef.Decoders.Floppy; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -56,10 +56,7 @@ namespace DiscImageChef.DiscImages byte[] headerB = new byte[256]; stream.Read(headerB, 0, 256); - IntPtr headerPtr = Marshal.AllocHGlobal(256); - Marshal.Copy(headerB, 0, headerPtr, 256); - CpcDiskInfo header = (CpcDiskInfo)Marshal.PtrToStructure(headerPtr, typeof(CpcDiskInfo)); - Marshal.FreeHGlobal(headerPtr); + CpcDiskInfo header = Marshal.ByteArrayToStructureLittleEndian(headerB); if(!cpcdskId.SequenceEqual(header.magic) && !edskId.SequenceEqual(header.magic) && !du54Id.SequenceEqual(header.magic)) return false; @@ -103,10 +100,7 @@ namespace DiscImageChef.DiscImages byte[] trackB = new byte[256]; stream.Read(trackB, 0, 256); - IntPtr trackPtr = Marshal.AllocHGlobal(256); - Marshal.Copy(trackB, 0, trackPtr, 256); - CpcTrackInfo trackInfo = (CpcTrackInfo)Marshal.PtrToStructure(trackPtr, typeof(CpcTrackInfo)); - Marshal.FreeHGlobal(trackPtr); + CpcTrackInfo trackInfo = Marshal.ByteArrayToStructureLittleEndian(trackB); if(!trackId.SequenceEqual(trackInfo.magic)) { diff --git a/DiscImageChef.DiscImages/CopyQM/Read.cs b/DiscImageChef.DiscImages/CopyQM/Read.cs index fbaf10967..b2c61361e 100644 --- a/DiscImageChef.DiscImages/CopyQM/Read.cs +++ b/DiscImageChef.DiscImages/CopyQM/Read.cs @@ -32,11 +32,11 @@ using System; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -50,11 +50,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[133]; stream.Read(hdr, 0, 133); - header = new CopyQmHeader(); - IntPtr hdrPtr = Marshal.AllocHGlobal(133); - Marshal.Copy(hdr, 0, hdrPtr, 133); - header = (CopyQmHeader)Marshal.PtrToStructure(hdrPtr, typeof(CopyQmHeader)); - Marshal.FreeHGlobal(hdrPtr); + header = Marshal.ByteArrayToStructureLittleEndian(hdr); DicConsole.DebugWriteLine("CopyQM plugin", "header.magic = 0x{0:X4}", header.magic); DicConsole.DebugWriteLine("CopyQM plugin", "header.mark = 0x{0:X2}", header.mark); @@ -155,8 +151,8 @@ namespace DiscImageChef.DiscImages imageInfo.SectorSize = header.sectorSize; imageInfo.MediaType = Geometry.GetMediaType(((ushort)header.totalCylinders, (byte)header.heads, - header.sectorsPerTrack, (uint)header.sectorSize, - MediaEncoding.MFM, false)); + header.sectorsPerTrack, (uint)header.sectorSize, + MediaEncoding.MFM, false)); switch(imageInfo.MediaType) { @@ -187,8 +183,6 @@ namespace DiscImageChef.DiscImages return true; } - public bool? VerifyMediaImage() => calculatedDataCrc == header.crc && headerChecksumOk; - public byte[] ReadSector(ulong sectorAddress) => ReadSectors(sectorAddress, 1); public byte[] ReadSectors(ulong sectorAddress, uint length) @@ -206,5 +200,7 @@ namespace DiscImageChef.DiscImages return buffer; } + + public bool? VerifyMediaImage() => calculatedDataCrc == header.crc && headerChecksumOk; } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/D88/Identify.cs b/DiscImageChef.DiscImages/D88/Identify.cs index 7d3cb6e7c..86480a076 100644 --- a/DiscImageChef.DiscImages/D88/Identify.cs +++ b/DiscImageChef.DiscImages/D88/Identify.cs @@ -55,9 +55,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(d88Hdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - d88Hdr = (D88Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(D88Header)); - handle.Free(); + d88Hdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("D88 plugin", "d88hdr.name = \"{0}\"", StringHandlers.CToString(d88Hdr.name, shiftjis)); diff --git a/DiscImageChef.DiscImages/D88/Read.cs b/DiscImageChef.DiscImages/D88/Read.cs index a95f2878f..c23127cc6 100644 --- a/DiscImageChef.DiscImages/D88/Read.cs +++ b/DiscImageChef.DiscImages/D88/Read.cs @@ -59,10 +59,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(d88Hdr)]; stream.Read(hdrB, 0, hdrB.Length); - - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - d88Hdr = (D88Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(D88Header)); - handle.Free(); + d88Hdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("D88 plugin", "d88hdr.name = \"{0}\"", StringHandlers.CToString(d88Hdr.name, shiftjis)); @@ -97,9 +94,7 @@ namespace DiscImageChef.DiscImages stream.Seek(d88Hdr.track_table[0], SeekOrigin.Begin); stream.Read(hdrB, 0, hdrB.Length); - handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - sechdr = (SectorHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SectorHeader)); - handle.Free(); + sechdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("D88 plugin", "sechdr.c = {0}", sechdr.c); DicConsole.DebugWriteLine("D88 plugin", "sechdr.h = {0}", sechdr.h); @@ -122,9 +117,7 @@ namespace DiscImageChef.DiscImages stream.Read(hdrB, 0, hdrB.Length); SortedDictionary sectors = new SortedDictionary(); - handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - sechdr = (SectorHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SectorHeader)); - handle.Free(); + sechdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); if(sechdr.spt != spt || sechdr.n != bps) { @@ -143,9 +136,7 @@ namespace DiscImageChef.DiscImages sectors.Add(sechdr.r, secB); stream.Read(hdrB, 0, hdrB.Length); - handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - sechdr = (SectorHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SectorHeader)); - handle.Free(); + sechdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); if(sechdr.spt == spt && sechdr.n == bps) continue; diff --git a/DiscImageChef.DiscImages/DiscImageChef/Identify.cs b/DiscImageChef.DiscImages/DiscImageChef/Identify.cs index 487d8c509..f00450eb8 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Identify.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Identify.cs @@ -48,10 +48,7 @@ namespace DiscImageChef.DiscImages header = new DicHeader(); structureBytes = new byte[Marshal.SizeOf(header)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(header)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(header)); - header = (DicHeader)Marshal.PtrToStructure(structurePointer, typeof(DicHeader)); - Marshal.FreeHGlobal(structurePointer); + header = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); return header.identifier == DIC_MAGIC && header.imageMajorVersion <= DICF_VERSION; } diff --git a/DiscImageChef.DiscImages/DiscImageChef/Read.cs b/DiscImageChef.DiscImages/DiscImageChef/Read.cs index bd5005b79..f71ec7144 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Read.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Read.cs @@ -65,10 +65,7 @@ namespace DiscImageChef.DiscImages header = new DicHeader(); structureBytes = new byte[Marshal.SizeOf(header)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(header)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(header)); - header = (DicHeader)Marshal.PtrToStructure(structurePointer, typeof(DicHeader)); - Marshal.FreeHGlobal(structurePointer); + header = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(header.imageMajorVersion > DICF_VERSION) throw new FeatureUnsupportedImageException($"Image version {header.imageMajorVersion} not recognized."); @@ -83,10 +80,7 @@ namespace DiscImageChef.DiscImages IndexHeader idxHeader = new IndexHeader(); structureBytes = new byte[Marshal.SizeOf(idxHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(idxHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(idxHeader)); - idxHeader = (IndexHeader)Marshal.PtrToStructure(structurePointer, typeof(IndexHeader)); - Marshal.FreeHGlobal(structurePointer); + idxHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(idxHeader.identifier != BlockType.Index) throw new FeatureUnsupportedImageException("Index not found!"); @@ -100,10 +94,7 @@ namespace DiscImageChef.DiscImages IndexEntry entry = new IndexEntry(); structureBytes = new byte[Marshal.SizeOf(entry)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(entry)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(entry)); - entry = (IndexEntry)Marshal.PtrToStructure(structurePointer, typeof(IndexEntry)); - Marshal.FreeHGlobal(structurePointer); + entry = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Block type {0} with data type {1} is indexed to be at {2}", entry.blockType, entry.dataType, entry.offset); @@ -128,10 +119,8 @@ namespace DiscImageChef.DiscImages BlockHeader blockHeader = new BlockHeader(); structureBytes = new byte[Marshal.SizeOf(blockHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(blockHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(blockHeader)); - blockHeader = (BlockHeader)Marshal.PtrToStructure(structurePointer, typeof(BlockHeader)); - Marshal.FreeHGlobal(structurePointer); + blockHeader = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); imageInfo.ImageSize += blockHeader.cmpLength; // Unused, skip @@ -296,10 +285,8 @@ namespace DiscImageChef.DiscImages DdtHeader ddtHeader = new DdtHeader(); structureBytes = new byte[Marshal.SizeOf(ddtHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(ddtHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(ddtHeader)); - ddtHeader = (DdtHeader)Marshal.PtrToStructure(structurePointer, typeof(DdtHeader)); - Marshal.FreeHGlobal(structurePointer); + ddtHeader = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); imageInfo.ImageSize += ddtHeader.cmpLength; if(ddtHeader.identifier != BlockType.DeDuplicationTable) break; @@ -350,10 +337,8 @@ namespace DiscImageChef.DiscImages DdtHeader ddtHeader = new DdtHeader(); structureBytes = new byte[Marshal.SizeOf(ddtHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(ddtHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(ddtHeader)); - ddtHeader = (DdtHeader)Marshal.PtrToStructure(structurePointer, typeof(DdtHeader)); - Marshal.FreeHGlobal(structurePointer); + ddtHeader = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); imageInfo.ImageSize += ddtHeader.cmpLength; if(ddtHeader.identifier != BlockType.DeDuplicationTable) break; @@ -402,10 +387,7 @@ namespace DiscImageChef.DiscImages geometryBlock = new GeometryBlock(); structureBytes = new byte[Marshal.SizeOf(geometryBlock)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(geometryBlock)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(geometryBlock)); - geometryBlock = (GeometryBlock)Marshal.PtrToStructure(structurePointer, typeof(GeometryBlock)); - Marshal.FreeHGlobal(structurePointer); + geometryBlock = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(geometryBlock.identifier == BlockType.GeometryBlock) { DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -423,10 +405,7 @@ namespace DiscImageChef.DiscImages MetadataBlock metadataBlock = new MetadataBlock(); structureBytes = new byte[Marshal.SizeOf(metadataBlock)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(metadataBlock)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(metadataBlock)); - metadataBlock = (MetadataBlock)Marshal.PtrToStructure(structurePointer, typeof(MetadataBlock)); - Marshal.FreeHGlobal(structurePointer); + metadataBlock = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(metadataBlock.identifier != entry.blockType) { @@ -594,10 +573,7 @@ namespace DiscImageChef.DiscImages TracksHeader tracksHeader = new TracksHeader(); structureBytes = new byte[Marshal.SizeOf(tracksHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(tracksHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(tracksHeader)); - tracksHeader = (TracksHeader)Marshal.PtrToStructure(structurePointer, typeof(TracksHeader)); - Marshal.FreeHGlobal(structurePointer); + tracksHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(tracksHeader.identifier != BlockType.TracksBlock) { DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -631,10 +607,7 @@ namespace DiscImageChef.DiscImages TrackEntry trackEntry = new TrackEntry(); structureBytes = new byte[Marshal.SizeOf(trackEntry)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(trackEntry)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(trackEntry)); - trackEntry = (TrackEntry)Marshal.PtrToStructure(structurePointer, typeof(TrackEntry)); - Marshal.FreeHGlobal(structurePointer); + trackEntry = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); Tracks.Add(new Track { @@ -661,11 +634,7 @@ namespace DiscImageChef.DiscImages CicmMetadataBlock cicmBlock = new CicmMetadataBlock(); structureBytes = new byte[Marshal.SizeOf(cicmBlock)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(cicmBlock)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(cicmBlock)); - cicmBlock = (CicmMetadataBlock)Marshal.PtrToStructure(structurePointer, - typeof(CicmMetadataBlock)); - Marshal.FreeHGlobal(structurePointer); + cicmBlock = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(cicmBlock.identifier != BlockType.CicmBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -694,11 +663,8 @@ namespace DiscImageChef.DiscImages DumpHardwareHeader dumpBlock = new DumpHardwareHeader(); structureBytes = new byte[Marshal.SizeOf(dumpBlock)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(dumpBlock)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(dumpBlock)); - dumpBlock = (DumpHardwareHeader)Marshal.PtrToStructure(structurePointer, - typeof(DumpHardwareHeader)); - Marshal.FreeHGlobal(structurePointer); + dumpBlock = Helpers + .Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(dumpBlock.identifier != BlockType.DumpHardwareBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -724,11 +690,8 @@ namespace DiscImageChef.DiscImages DumpHardwareEntry dumpEntry = new DumpHardwareEntry(); structureBytes = new byte[Marshal.SizeOf(dumpEntry)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(dumpEntry)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(dumpEntry)); - dumpEntry = (DumpHardwareEntry)Marshal.PtrToStructure(structurePointer, - typeof(DumpHardwareEntry)); - Marshal.FreeHGlobal(structurePointer); + dumpEntry = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); DumpHardwareType dump = new DumpHardwareType { @@ -973,10 +936,7 @@ namespace DiscImageChef.DiscImages blockHeader = new BlockHeader(); structureBytes = new byte[Marshal.SizeOf(blockHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(blockHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(blockHeader)); - blockHeader = (BlockHeader)Marshal.PtrToStructure(structurePointer, typeof(BlockHeader)); - Marshal.FreeHGlobal(structurePointer); + blockHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); // Decompress block switch(blockHeader.compression) diff --git a/DiscImageChef.DiscImages/DiscImageChef/Verify.cs b/DiscImageChef.DiscImages/DiscImageChef/Verify.cs index 6d9848617..93031f9f9 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Verify.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Verify.cs @@ -41,6 +41,170 @@ namespace DiscImageChef.DiscImages { public partial class DiscImageChef { + public bool? VerifyMediaImage() + { + // This will traverse all blocks and check their CRC64 without uncompressing them + DicConsole.DebugWriteLine("DiscImageChef format plugin", "Checking index integrity at {0}", + header.indexOffset); + imageStream.Position = (long)header.indexOffset; + + IndexHeader idxHeader = new IndexHeader(); + structureBytes = new byte[Marshal.SizeOf(idxHeader)]; + imageStream.Read(structureBytes, 0, structureBytes.Length); + idxHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); + + if(idxHeader.identifier != BlockType.Index) + { + DicConsole.DebugWriteLine("DiscImageChef format plugin", "Incorrect index identifier"); + return false; + } + + DicConsole.DebugWriteLine("DiscImageChef format plugin", "Index at {0} contains {1} entries", + header.indexOffset, idxHeader.entries); + + structureBytes = new byte[Marshal.SizeOf(typeof(IndexEntry)) * idxHeader.entries]; + imageStream.Read(structureBytes, 0, structureBytes.Length); + Crc64Context.Data(structureBytes, out byte[] verifyCrc); + + if(BitConverter.ToUInt64(verifyCrc, 0) != idxHeader.crc64) + { + DicConsole.DebugWriteLine("DiscImageChef format plugin", "Expected index CRC {0:X16} but got {1:X16}", + idxHeader.crc64, BitConverter.ToUInt64(verifyCrc, 0)); + return false; + } + + imageStream.Position -= structureBytes.Length; + + List vrIndex = new List(); + for(ushort i = 0; i < idxHeader.entries; i++) + { + IndexEntry entry = new IndexEntry(); + structureBytes = new byte[Marshal.SizeOf(entry)]; + imageStream.Read(structureBytes, 0, structureBytes.Length); + entry = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); + DicConsole.DebugWriteLine("DiscImageChef format plugin", + "Block type {0} with data type {1} is indexed to be at {2}", entry.blockType, + entry.dataType, entry.offset); + vrIndex.Add(entry); + } + + // Read up to 1MiB at a time for verification + const int VERIFY_SIZE = 1024 * 1024; + + foreach(IndexEntry entry in vrIndex) + { + imageStream.Position = (long)entry.offset; + Crc64Context crcVerify; + ulong readBytes; + byte[] verifyBytes; + + switch(entry.blockType) + { + case BlockType.DataBlock: + BlockHeader blockHeader = new BlockHeader(); + structureBytes = new byte[Marshal.SizeOf(blockHeader)]; + imageStream.Read(structureBytes, 0, structureBytes.Length); + blockHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); + + crcVerify = new Crc64Context(); + readBytes = 0; + + DicConsole.DebugWriteLine("DiscImageChef format plugin", + "Verifying data block type {0} at position {1}", entry.dataType, + entry.offset); + + while(readBytes + VERIFY_SIZE < blockHeader.cmpLength) + { + verifyBytes = new byte[VERIFY_SIZE]; + imageStream.Read(verifyBytes, 0, verifyBytes.Length); + crcVerify.Update(verifyBytes); + readBytes += (ulong)verifyBytes.LongLength; + } + + verifyBytes = new byte[blockHeader.cmpLength - readBytes]; + imageStream.Read(verifyBytes, 0, verifyBytes.Length); + crcVerify.Update(verifyBytes); + + verifyCrc = crcVerify.Final(); + + if(BitConverter.ToUInt64(verifyCrc, 0) != blockHeader.cmpCrc64) + { + DicConsole.DebugWriteLine("DiscImageChef format plugin", + "Expected block CRC {0:X16} but got {1:X16}", + blockHeader.cmpCrc64, BitConverter.ToUInt64(verifyCrc, 0)); + return false; + } + + break; + case BlockType.DeDuplicationTable: + DdtHeader ddtHeader = new DdtHeader(); + structureBytes = new byte[Marshal.SizeOf(ddtHeader)]; + imageStream.Read(structureBytes, 0, structureBytes.Length); + ddtHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); + + crcVerify = new Crc64Context(); + readBytes = 0; + + DicConsole.DebugWriteLine("DiscImageChef format plugin", + "Verifying deduplication table type {0} at position {1}", + entry.dataType, entry.offset); + + while(readBytes + VERIFY_SIZE < ddtHeader.cmpLength) + { + verifyBytes = new byte[readBytes]; + imageStream.Read(verifyBytes, 0, verifyBytes.Length); + crcVerify.Update(verifyBytes); + readBytes += (ulong)verifyBytes.LongLength; + } + + verifyBytes = new byte[ddtHeader.cmpLength - readBytes]; + imageStream.Read(verifyBytes, 0, verifyBytes.Length); + crcVerify.Update(verifyBytes); + + verifyCrc = crcVerify.Final(); + + if(BitConverter.ToUInt64(verifyCrc, 0) != ddtHeader.cmpCrc64) + { + DicConsole.DebugWriteLine("DiscImageChef format plugin", + "Expected DDT CRC {0:X16} but got {1:X16}", ddtHeader.cmpCrc64, + BitConverter.ToUInt64(verifyCrc, 0)); + return false; + } + + break; + case BlockType.TracksBlock: + TracksHeader trkHeader = new TracksHeader(); + structureBytes = new byte[Marshal.SizeOf(trkHeader)]; + imageStream.Read(structureBytes, 0, structureBytes.Length); + trkHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); + + DicConsole.DebugWriteLine("DiscImageChef format plugin", + "Track block at {0} contains {1} entries", header.indexOffset, + trkHeader.entries); + + structureBytes = new byte[Marshal.SizeOf(typeof(TrackEntry)) * trkHeader.entries]; + imageStream.Read(structureBytes, 0, structureBytes.Length); + Crc64Context.Data(structureBytes, out verifyCrc); + + if(BitConverter.ToUInt64(verifyCrc, 0) != trkHeader.crc64) + { + DicConsole.DebugWriteLine("DiscImageChef format plugin", + "Expected index CRC {0:X16} but got {1:X16}", trkHeader.crc64, + BitConverter.ToUInt64(verifyCrc, 0)); + return false; + } + + break; + default: + DicConsole.DebugWriteLine("DiscImageChef format plugin", "Ignored field type {0}", + entry.blockType); + break; + } + } + + return true; + } + public bool? VerifySector(ulong sectorAddress) { if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) return null; @@ -49,14 +213,6 @@ namespace DiscImageChef.DiscImages return CdChecksums.CheckCdSector(buffer); } - public bool? VerifySector(ulong sectorAddress, uint track) - { - if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) return null; - - byte[] buffer = ReadSectorLong(sectorAddress, track); - return CdChecksums.CheckCdSector(buffer); - } - public bool? VerifySectors(ulong sectorAddress, uint length, out List failingLbas, out List unknownLbas) { @@ -139,183 +295,12 @@ namespace DiscImageChef.DiscImages return failingLbas.Count <= 0; } - public bool? VerifyMediaImage() + public bool? VerifySector(ulong sectorAddress, uint track) { - // This will traverse all blocks and check their CRC64 without uncompressing them - DicConsole.DebugWriteLine("DiscImageChef format plugin", "Checking index integrity at {0}", - header.indexOffset); - imageStream.Position = (long)header.indexOffset; + if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc) return null; - IndexHeader idxHeader = new IndexHeader(); - structureBytes = new byte[Marshal.SizeOf(idxHeader)]; - imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(idxHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(idxHeader)); - idxHeader = (IndexHeader)Marshal.PtrToStructure(structurePointer, typeof(IndexHeader)); - Marshal.FreeHGlobal(structurePointer); - - if(idxHeader.identifier != BlockType.Index) - { - DicConsole.DebugWriteLine("DiscImageChef format plugin", "Incorrect index identifier"); - return false; - } - - DicConsole.DebugWriteLine("DiscImageChef format plugin", "Index at {0} contains {1} entries", - header.indexOffset, idxHeader.entries); - - structureBytes = new byte[Marshal.SizeOf(typeof(IndexEntry)) * idxHeader.entries]; - imageStream.Read(structureBytes, 0, structureBytes.Length); - Crc64Context.Data(structureBytes, out byte[] verifyCrc); - - if(BitConverter.ToUInt64(verifyCrc, 0) != idxHeader.crc64) - { - DicConsole.DebugWriteLine("DiscImageChef format plugin", "Expected index CRC {0:X16} but got {1:X16}", - idxHeader.crc64, BitConverter.ToUInt64(verifyCrc, 0)); - return false; - } - - imageStream.Position -= structureBytes.Length; - - List vrIndex = new List(); - for(ushort i = 0; i < idxHeader.entries; i++) - { - IndexEntry entry = new IndexEntry(); - structureBytes = new byte[Marshal.SizeOf(entry)]; - imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(entry)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(entry)); - entry = (IndexEntry)Marshal.PtrToStructure(structurePointer, typeof(IndexEntry)); - Marshal.FreeHGlobal(structurePointer); - DicConsole.DebugWriteLine("DiscImageChef format plugin", - "Block type {0} with data type {1} is indexed to be at {2}", entry.blockType, - entry.dataType, entry.offset); - vrIndex.Add(entry); - } - - // Read up to 1MiB at a time for verification - const int VERIFY_SIZE = 1024 * 1024; - - foreach(IndexEntry entry in vrIndex) - { - imageStream.Position = (long)entry.offset; - Crc64Context crcVerify; - ulong readBytes; - byte[] verifyBytes; - - switch(entry.blockType) - { - case BlockType.DataBlock: - BlockHeader blockHeader = new BlockHeader(); - structureBytes = new byte[Marshal.SizeOf(blockHeader)]; - imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(blockHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(blockHeader)); - blockHeader = (BlockHeader)Marshal.PtrToStructure(structurePointer, typeof(BlockHeader)); - Marshal.FreeHGlobal(structurePointer); - - crcVerify = new Crc64Context(); - readBytes = 0; - - DicConsole.DebugWriteLine("DiscImageChef format plugin", - "Verifying data block type {0} at position {1}", entry.dataType, - entry.offset); - - while(readBytes + VERIFY_SIZE < blockHeader.cmpLength) - { - verifyBytes = new byte[VERIFY_SIZE]; - imageStream.Read(verifyBytes, 0, verifyBytes.Length); - crcVerify.Update(verifyBytes); - readBytes += (ulong)verifyBytes.LongLength; - } - - verifyBytes = new byte[blockHeader.cmpLength - readBytes]; - imageStream.Read(verifyBytes, 0, verifyBytes.Length); - crcVerify.Update(verifyBytes); - - verifyCrc = crcVerify.Final(); - - if(BitConverter.ToUInt64(verifyCrc, 0) != blockHeader.cmpCrc64) - { - DicConsole.DebugWriteLine("DiscImageChef format plugin", - "Expected block CRC {0:X16} but got {1:X16}", - blockHeader.cmpCrc64, BitConverter.ToUInt64(verifyCrc, 0)); - return false; - } - - break; - case BlockType.DeDuplicationTable: - DdtHeader ddtHeader = new DdtHeader(); - structureBytes = new byte[Marshal.SizeOf(ddtHeader)]; - imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(ddtHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(ddtHeader)); - ddtHeader = (DdtHeader)Marshal.PtrToStructure(structurePointer, typeof(DdtHeader)); - Marshal.FreeHGlobal(structurePointer); - - crcVerify = new Crc64Context(); - readBytes = 0; - - DicConsole.DebugWriteLine("DiscImageChef format plugin", - "Verifying deduplication table type {0} at position {1}", - entry.dataType, entry.offset); - - while(readBytes + VERIFY_SIZE < ddtHeader.cmpLength) - { - verifyBytes = new byte[readBytes]; - imageStream.Read(verifyBytes, 0, verifyBytes.Length); - crcVerify.Update(verifyBytes); - readBytes += (ulong)verifyBytes.LongLength; - } - - verifyBytes = new byte[ddtHeader.cmpLength - readBytes]; - imageStream.Read(verifyBytes, 0, verifyBytes.Length); - crcVerify.Update(verifyBytes); - - verifyCrc = crcVerify.Final(); - - if(BitConverter.ToUInt64(verifyCrc, 0) != ddtHeader.cmpCrc64) - { - DicConsole.DebugWriteLine("DiscImageChef format plugin", - "Expected DDT CRC {0:X16} but got {1:X16}", ddtHeader.cmpCrc64, - BitConverter.ToUInt64(verifyCrc, 0)); - return false; - } - - break; - case BlockType.TracksBlock: - TracksHeader trkHeader = new TracksHeader(); - structureBytes = new byte[Marshal.SizeOf(trkHeader)]; - imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(trkHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(trkHeader)); - trkHeader = (TracksHeader)Marshal.PtrToStructure(structurePointer, typeof(TracksHeader)); - Marshal.FreeHGlobal(structurePointer); - - DicConsole.DebugWriteLine("DiscImageChef format plugin", - "Track block at {0} contains {1} entries", header.indexOffset, - trkHeader.entries); - - structureBytes = new byte[Marshal.SizeOf(typeof(TrackEntry)) * trkHeader.entries]; - imageStream.Read(structureBytes, 0, structureBytes.Length); - Crc64Context.Data(structureBytes, out verifyCrc); - - if(BitConverter.ToUInt64(verifyCrc, 0) != trkHeader.crc64) - { - DicConsole.DebugWriteLine("DiscImageChef format plugin", - "Expected index CRC {0:X16} but got {1:X16}", trkHeader.crc64, - BitConverter.ToUInt64(verifyCrc, 0)); - return false; - } - - break; - default: - DicConsole.DebugWriteLine("DiscImageChef format plugin", "Ignored field type {0}", - entry.blockType); - break; - } - } - - return true; + byte[] buffer = ReadSectorLong(sectorAddress, track); + return CdChecksums.CheckCdSector(buffer); } } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/DiscImageChef/Write.cs b/DiscImageChef.DiscImages/DiscImageChef/Write.cs index 6d7a0c0de..729fe97ce 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Write.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Write.cs @@ -212,10 +212,7 @@ namespace DiscImageChef.DiscImages header = new DicHeader(); structureBytes = new byte[Marshal.SizeOf(header)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(header)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(header)); - header = (DicHeader)Marshal.PtrToStructure(structurePointer, typeof(DicHeader)); - Marshal.FreeHGlobal(structurePointer); + header = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(header.identifier != DIC_MAGIC) { @@ -267,10 +264,7 @@ namespace DiscImageChef.DiscImages IndexHeader idxHeader = new IndexHeader(); structureBytes = new byte[Marshal.SizeOf(idxHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(idxHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(idxHeader)); - idxHeader = (IndexHeader)Marshal.PtrToStructure(structurePointer, typeof(IndexHeader)); - Marshal.FreeHGlobal(structurePointer); + idxHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(idxHeader.identifier != BlockType.Index) { @@ -286,10 +280,7 @@ namespace DiscImageChef.DiscImages IndexEntry entry = new IndexEntry(); structureBytes = new byte[Marshal.SizeOf(entry)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(entry)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(entry)); - entry = (IndexEntry)Marshal.PtrToStructure(structurePointer, typeof(IndexEntry)); - Marshal.FreeHGlobal(structurePointer); + entry = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Block type {0} with data type {1} is indexed to be at {2}", entry.blockType, entry.dataType, entry.offset); @@ -322,10 +313,8 @@ namespace DiscImageChef.DiscImages BlockHeader blockHeader = new BlockHeader(); structureBytes = new byte[Marshal.SizeOf(blockHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(blockHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(blockHeader)); - blockHeader = (BlockHeader)Marshal.PtrToStructure(structurePointer, typeof(BlockHeader)); - Marshal.FreeHGlobal(structurePointer); + blockHeader = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); imageInfo.ImageSize += blockHeader.cmpLength; if(blockHeader.identifier != entry.blockType) @@ -418,10 +407,7 @@ namespace DiscImageChef.DiscImages DdtHeader ddtHeader = new DdtHeader(); structureBytes = new byte[Marshal.SizeOf(ddtHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(ddtHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(ddtHeader)); - ddtHeader = (DdtHeader)Marshal.PtrToStructure(structurePointer, typeof(DdtHeader)); - Marshal.FreeHGlobal(structurePointer); + ddtHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(ddtHeader.identifier != BlockType.DeDuplicationTable) break; @@ -478,10 +464,7 @@ namespace DiscImageChef.DiscImages DdtHeader ddtHeader = new DdtHeader(); structureBytes = new byte[Marshal.SizeOf(ddtHeader)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(ddtHeader)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(ddtHeader)); - ddtHeader = (DdtHeader)Marshal.PtrToStructure(structurePointer, typeof(DdtHeader)); - Marshal.FreeHGlobal(structurePointer); + ddtHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(ddtHeader.identifier != BlockType.DeDuplicationTable) break; @@ -544,11 +527,8 @@ namespace DiscImageChef.DiscImages CicmMetadataBlock cicmBlock = new CicmMetadataBlock(); structureBytes = new byte[Marshal.SizeOf(cicmBlock)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(cicmBlock)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(cicmBlock)); - cicmBlock = (CicmMetadataBlock)Marshal.PtrToStructure(structurePointer, - typeof(CicmMetadataBlock)); - Marshal.FreeHGlobal(structurePointer); + cicmBlock = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(cicmBlock.identifier != BlockType.CicmBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -578,11 +558,8 @@ namespace DiscImageChef.DiscImages DumpHardwareHeader dumpBlock = new DumpHardwareHeader(); structureBytes = new byte[Marshal.SizeOf(dumpBlock)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(dumpBlock)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(dumpBlock)); - dumpBlock = (DumpHardwareHeader)Marshal.PtrToStructure(structurePointer, - typeof(DumpHardwareHeader)); - Marshal.FreeHGlobal(structurePointer); + dumpBlock = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); if(dumpBlock.identifier != BlockType.DumpHardwareBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -608,11 +585,8 @@ namespace DiscImageChef.DiscImages DumpHardwareEntry dumpEntry = new DumpHardwareEntry(); structureBytes = new byte[Marshal.SizeOf(dumpEntry)]; imageStream.Read(structureBytes, 0, structureBytes.Length); - structurePointer = Marshal.AllocHGlobal(Marshal.SizeOf(dumpEntry)); - Marshal.Copy(structureBytes, 0, structurePointer, Marshal.SizeOf(dumpEntry)); - dumpEntry = (DumpHardwareEntry)Marshal.PtrToStructure(structurePointer, - typeof(DumpHardwareEntry)); - Marshal.FreeHGlobal(structurePointer); + dumpEntry = + Helpers.Marshal.ByteArrayToStructureLittleEndian(structureBytes); DumpHardwareType dump = new DumpHardwareType { diff --git a/DiscImageChef.DiscImages/DriDiskCopy/Identify.cs b/DiscImageChef.DiscImages/DriDiskCopy/Identify.cs index e23917300..931558d39 100644 --- a/DiscImageChef.DiscImages/DriDiskCopy/Identify.cs +++ b/DiscImageChef.DiscImages/DriDiskCopy/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Runtime.InteropServices; using System.Text.RegularExpressions; @@ -51,10 +50,7 @@ namespace DiscImageChef.DiscImages stream.Seek(-buffer.Length, SeekOrigin.End); stream.Read(buffer, 0, buffer.Length); - IntPtr ftrPtr = Marshal.AllocHGlobal(buffer.Length); - Marshal.Copy(buffer, 0, ftrPtr, buffer.Length); - DriFooter tmpFooter = (DriFooter)Marshal.PtrToStructure(ftrPtr, typeof(DriFooter)); - Marshal.FreeHGlobal(ftrPtr); + DriFooter tmpFooter = Helpers.Marshal.ByteArrayToStructureLittleEndian(buffer); string sig = StringHandlers.CToString(tmpFooter.signature); diff --git a/DiscImageChef.DiscImages/DriDiskCopy/Read.cs b/DiscImageChef.DiscImages/DriDiskCopy/Read.cs index d01723082..4f12be7e6 100644 --- a/DiscImageChef.DiscImages/DriDiskCopy/Read.cs +++ b/DiscImageChef.DiscImages/DriDiskCopy/Read.cs @@ -53,11 +53,7 @@ namespace DiscImageChef.DiscImages stream.Seek(-buffer.Length, SeekOrigin.End); stream.Read(buffer, 0, buffer.Length); - footer = new DriFooter(); - IntPtr ftrPtr = Marshal.AllocHGlobal(buffer.Length); - Marshal.Copy(buffer, 0, ftrPtr, buffer.Length); - footer = (DriFooter)Marshal.PtrToStructure(ftrPtr, typeof(DriFooter)); - Marshal.FreeHGlobal(ftrPtr); + footer = Helpers.Marshal.ByteArrayToStructureLittleEndian(buffer); string sig = StringHandlers.CToString(footer.signature); @@ -96,8 +92,8 @@ namespace DiscImageChef.DiscImages } imageInfo.MediaType = Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads, - (ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, - MediaEncoding.MFM, false)); + (ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, + MediaEncoding.MFM, false)); switch(imageInfo.MediaType) { diff --git a/DiscImageChef.DiscImages/HDCopy/Identify.cs b/DiscImageChef.DiscImages/HDCopy/Identify.cs index dd4a8483e..796daaa54 100644 --- a/DiscImageChef.DiscImages/HDCopy/Identify.cs +++ b/DiscImageChef.DiscImages/HDCopy/Identify.cs @@ -31,10 +31,9 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -50,10 +49,7 @@ namespace DiscImageChef.DiscImages byte[] header = new byte[2 + 2 * 82]; stream.Read(header, 0, 2 + 2 * 82); - IntPtr hdrPtr = Marshal.AllocHGlobal(2 + 2 * 82); - Marshal.Copy(header, 0, hdrPtr, 2 + 2 * 82); - HdcpFileHeader fheader = (HdcpFileHeader)Marshal.PtrToStructure(hdrPtr, typeof(HdcpFileHeader)); - Marshal.FreeHGlobal(hdrPtr); + HdcpFileHeader fheader = Marshal.ByteArrayToStructureLittleEndian(header); /* Some sanity checks on the values we just read. * We know the image is from a DOS floppy disk, so assume diff --git a/DiscImageChef.DiscImages/HDCopy/Read.cs b/DiscImageChef.DiscImages/HDCopy/Read.cs index 28cbf3153..945ca0846 100644 --- a/DiscImageChef.DiscImages/HDCopy/Read.cs +++ b/DiscImageChef.DiscImages/HDCopy/Read.cs @@ -33,11 +33,11 @@ using System; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -51,10 +51,7 @@ namespace DiscImageChef.DiscImages byte[] header = new byte[2 + 2 * 82]; stream.Read(header, 0, 2 + 2 * 82); - IntPtr hdrPtr = Marshal.AllocHGlobal(2 + 2 * 82); - Marshal.Copy(header, 0, hdrPtr, 2 + 2 * 82); - HdcpFileHeader fheader = (HdcpFileHeader)Marshal.PtrToStructure(hdrPtr, typeof(HdcpFileHeader)); - Marshal.FreeHGlobal(hdrPtr); + HdcpFileHeader fheader = Marshal.ByteArrayToStructureLittleEndian(header); DicConsole.DebugWriteLine("HDCP plugin", "Detected HD-Copy image with {0} tracks and {1} sectors per track.", fheader.lastCylinder + 1, fheader.sectorsPerTrack); @@ -72,8 +69,8 @@ namespace DiscImageChef.DiscImages imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); imageInfo.MediaType = Geometry.GetMediaType(((ushort)imageInfo.Cylinders, 2, - (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, - false)); + (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, + false)); // the start offset of the track data long currentOffset = 2 + 2 * 82; diff --git a/DiscImageChef.DiscImages/KryoFlux/Identify.cs b/DiscImageChef.DiscImages/KryoFlux/Identify.cs index 35f44d84e..0f1153f4b 100644 --- a/DiscImageChef.DiscImages/KryoFlux/Identify.cs +++ b/DiscImageChef.DiscImages/KryoFlux/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; @@ -49,10 +48,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[Marshal.SizeOf(header)]; stream.Read(hdr, 0, Marshal.SizeOf(header)); - IntPtr hdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(header)); - Marshal.Copy(hdr, 0, hdrPtr, Marshal.SizeOf(header)); - header = (OobBlock)Marshal.PtrToStructure(hdrPtr, typeof(OobBlock)); - Marshal.FreeHGlobal(hdrPtr); + header = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdr); OobBlock footer = new OobBlock(); stream.Seek(-Marshal.SizeOf(footer), SeekOrigin.End); @@ -60,10 +56,7 @@ namespace DiscImageChef.DiscImages hdr = new byte[Marshal.SizeOf(footer)]; stream.Read(hdr, 0, Marshal.SizeOf(footer)); - hdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(footer)); - Marshal.Copy(hdr, 0, hdrPtr, Marshal.SizeOf(footer)); - footer = (OobBlock)Marshal.PtrToStructure(hdrPtr, typeof(OobBlock)); - Marshal.FreeHGlobal(hdrPtr); + footer = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdr); return header.blockId == BlockIds.Oob && header.blockType == OobTypes.KFInfo && footer.blockId == BlockIds.Oob && footer.blockType == OobTypes.EOF && footer.length == 0x0D0D; diff --git a/DiscImageChef.DiscImages/KryoFlux/Read.cs b/DiscImageChef.DiscImages/KryoFlux/Read.cs index 7c21b5cba..d6ab39ed8 100644 --- a/DiscImageChef.DiscImages/KryoFlux/Read.cs +++ b/DiscImageChef.DiscImages/KryoFlux/Read.cs @@ -55,10 +55,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[Marshal.SizeOf(header)]; stream.Read(hdr, 0, Marshal.SizeOf(header)); - IntPtr hdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(header)); - Marshal.Copy(hdr, 0, hdrPtr, Marshal.SizeOf(header)); - header = (OobBlock)Marshal.PtrToStructure(hdrPtr, typeof(OobBlock)); - Marshal.FreeHGlobal(hdrPtr); + header = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdr); OobBlock footer = new OobBlock(); stream.Seek(-Marshal.SizeOf(footer), SeekOrigin.End); @@ -66,10 +63,7 @@ namespace DiscImageChef.DiscImages hdr = new byte[Marshal.SizeOf(footer)]; stream.Read(hdr, 0, Marshal.SizeOf(footer)); - hdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(footer)); - Marshal.Copy(hdr, 0, hdrPtr, Marshal.SizeOf(footer)); - footer = (OobBlock)Marshal.PtrToStructure(hdrPtr, typeof(OobBlock)); - Marshal.FreeHGlobal(hdrPtr); + footer = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdr); if(header.blockId != BlockIds.Oob || header.blockType != OobTypes.KFInfo || footer.blockId != BlockIds.Oob || footer.blockType != OobTypes.EOF || @@ -142,10 +136,7 @@ namespace DiscImageChef.DiscImages byte[] oob = new byte[Marshal.SizeOf(oobBlk)]; trackStream.Read(oob, 0, Marshal.SizeOf(oobBlk)); - IntPtr oobPtr = Marshal.AllocHGlobal(Marshal.SizeOf(oobBlk)); - Marshal.Copy(oob, 0, oobPtr, Marshal.SizeOf(oobBlk)); - oobBlk = (OobBlock)Marshal.PtrToStructure(oobPtr, typeof(OobBlock)); - Marshal.FreeHGlobal(oobPtr); + oobBlk = Helpers.Marshal.ByteArrayToStructureLittleEndian(oob); if(oobBlk.blockType == OobTypes.EOF) { diff --git a/DiscImageChef.DiscImages/MaxiDisk/Identify.cs b/DiscImageChef.DiscImages/MaxiDisk/Identify.cs index d9f610084..3fad87f71 100644 --- a/DiscImageChef.DiscImages/MaxiDisk/Identify.cs +++ b/DiscImageChef.DiscImages/MaxiDisk/Identify.cs @@ -30,11 +30,10 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -50,10 +49,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); stream.Read(buffer, 0, buffer.Length); - IntPtr ftrPtr = Marshal.AllocHGlobal(buffer.Length); - Marshal.Copy(buffer, 0, ftrPtr, buffer.Length); - HdkHeader tmpHeader = (HdkHeader)Marshal.PtrToStructure(ftrPtr, typeof(HdkHeader)); - Marshal.FreeHGlobal(ftrPtr); + HdkHeader tmpHeader = Marshal.ByteArrayToStructureLittleEndian(buffer); DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.unknown = {0}", tmpHeader.unknown); DicConsole.DebugWriteLine("MAXI Disk plugin", "tmp_header.diskType = {0}", tmpHeader.diskType); diff --git a/DiscImageChef.DiscImages/MaxiDisk/Read.cs b/DiscImageChef.DiscImages/MaxiDisk/Read.cs index 4049cbdf3..9fc7c278f 100644 --- a/DiscImageChef.DiscImages/MaxiDisk/Read.cs +++ b/DiscImageChef.DiscImages/MaxiDisk/Read.cs @@ -32,10 +32,10 @@ using System; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Interfaces; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -51,10 +51,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); stream.Read(buffer, 0, buffer.Length); - IntPtr ftrPtr = Marshal.AllocHGlobal(buffer.Length); - Marshal.Copy(buffer, 0, ftrPtr, buffer.Length); - HdkHeader tmpHeader = (HdkHeader)Marshal.PtrToStructure(ftrPtr, typeof(HdkHeader)); - Marshal.FreeHGlobal(ftrPtr); + HdkHeader tmpHeader = Marshal.ByteArrayToStructureLittleEndian(buffer); // This is hardcoded // But its possible values are unknown... @@ -88,8 +85,8 @@ namespace DiscImageChef.DiscImages imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); imageInfo.MediaType = Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads, - (ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, - MediaEncoding.MFM, false)); + (ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, + MediaEncoding.MFM, false)); imageInfo.XmlMediaType = XmlMediaType.BlockMedia; diff --git a/DiscImageChef.DiscImages/NHDr0/Identify.cs b/DiscImageChef.DiscImages/NHDr0/Identify.cs index 8a9baf13a..b0b8ac2f1 100644 --- a/DiscImageChef.DiscImages/NHDr0/Identify.cs +++ b/DiscImageChef.DiscImages/NHDr0/Identify.cs @@ -55,9 +55,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(nhdhdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - nhdhdr = (Nhdr0Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Nhdr0Header)); - handle.Free(); + nhdhdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); if(!nhdhdr.szFileID.SequenceEqual(signature)) return false; diff --git a/DiscImageChef.DiscImages/NHDr0/Read.cs b/DiscImageChef.DiscImages/NHDr0/Read.cs index c527939c2..4cf63117a 100644 --- a/DiscImageChef.DiscImages/NHDr0/Read.cs +++ b/DiscImageChef.DiscImages/NHDr0/Read.cs @@ -56,9 +56,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(nhdhdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - nhdhdr = (Nhdr0Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Nhdr0Header)); - handle.Free(); + nhdhdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); imageInfo.MediaType = MediaType.GENERIC_HDD; diff --git a/DiscImageChef.DiscImages/Parallels/Identify.cs b/DiscImageChef.DiscImages/Parallels/Identify.cs index d514a21b7..befc2c594 100644 --- a/DiscImageChef.DiscImages/Parallels/Identify.cs +++ b/DiscImageChef.DiscImages/Parallels/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -49,11 +48,7 @@ namespace DiscImageChef.DiscImages byte[] pHdrB = new byte[Marshal.SizeOf(pHdr)]; stream.Read(pHdrB, 0, Marshal.SizeOf(pHdr)); - pHdr = new ParallelsHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(pHdr)); - Marshal.Copy(pHdrB, 0, headerPtr, Marshal.SizeOf(pHdr)); - pHdr = (ParallelsHeader)Marshal.PtrToStructure(headerPtr, typeof(ParallelsHeader)); - Marshal.FreeHGlobal(headerPtr); + pHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(pHdrB); return parallelsMagic.SequenceEqual(pHdr.magic) || parallelsExtMagic.SequenceEqual(pHdr.magic); } diff --git a/DiscImageChef.DiscImages/Parallels/Read.cs b/DiscImageChef.DiscImages/Parallels/Read.cs index 72b016c72..1ba454f2c 100644 --- a/DiscImageChef.DiscImages/Parallels/Read.cs +++ b/DiscImageChef.DiscImages/Parallels/Read.cs @@ -53,11 +53,7 @@ namespace DiscImageChef.DiscImages byte[] pHdrB = new byte[Marshal.SizeOf(pHdr)]; stream.Read(pHdrB, 0, Marshal.SizeOf(pHdr)); - pHdr = new ParallelsHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(pHdr)); - Marshal.Copy(pHdrB, 0, headerPtr, Marshal.SizeOf(pHdr)); - pHdr = (ParallelsHeader)Marshal.PtrToStructure(headerPtr, typeof(ParallelsHeader)); - Marshal.FreeHGlobal(headerPtr); + pHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(pHdrB); DicConsole.DebugWriteLine("Parallels plugin", "pHdr.magic = {0}", StringHandlers.CToString(pHdr.magic)); diff --git a/DiscImageChef.DiscImages/PartClone/Identify.cs b/DiscImageChef.DiscImages/PartClone/Identify.cs index 52027d197..cbc63d331 100644 --- a/DiscImageChef.DiscImages/PartClone/Identify.cs +++ b/DiscImageChef.DiscImages/PartClone/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -49,11 +48,7 @@ namespace DiscImageChef.DiscImages byte[] pHdrB = new byte[Marshal.SizeOf(pHdr)]; stream.Read(pHdrB, 0, Marshal.SizeOf(pHdr)); - pHdr = new PartCloneHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(pHdr)); - Marshal.Copy(pHdrB, 0, headerPtr, Marshal.SizeOf(pHdr)); - pHdr = (PartCloneHeader)Marshal.PtrToStructure(headerPtr, typeof(PartCloneHeader)); - Marshal.FreeHGlobal(headerPtr); + pHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(pHdrB); if(stream.Position + (long)pHdr.totalBlocks > stream.Length) return false; diff --git a/DiscImageChef.DiscImages/PartClone/Read.cs b/DiscImageChef.DiscImages/PartClone/Read.cs index 9e4580e36..cbdbd13ad 100644 --- a/DiscImageChef.DiscImages/PartClone/Read.cs +++ b/DiscImageChef.DiscImages/PartClone/Read.cs @@ -55,11 +55,7 @@ namespace DiscImageChef.DiscImages byte[] pHdrB = new byte[Marshal.SizeOf(pHdr)]; stream.Read(pHdrB, 0, Marshal.SizeOf(pHdr)); - pHdr = new PartCloneHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(pHdr)); - Marshal.Copy(pHdrB, 0, headerPtr, Marshal.SizeOf(pHdr)); - pHdr = (PartCloneHeader)Marshal.PtrToStructure(headerPtr, typeof(PartCloneHeader)); - Marshal.FreeHGlobal(headerPtr); + pHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(pHdrB); DicConsole.DebugWriteLine("PartClone plugin", "pHdr.magic = {0}", StringHandlers.CToString(pHdr.magic)); DicConsole.DebugWriteLine("PartClone plugin", "pHdr.filesystem = {0}", diff --git a/DiscImageChef.DiscImages/Partimage/Identify.cs b/DiscImageChef.DiscImages/Partimage/Identify.cs index ab64326bf..5ac7f7f26 100644 --- a/DiscImageChef.DiscImages/Partimage/Identify.cs +++ b/DiscImageChef.DiscImages/Partimage/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -49,11 +48,7 @@ namespace DiscImageChef.DiscImages byte[] pHdrB = new byte[Marshal.SizeOf(cVolumeHeader)]; stream.Read(pHdrB, 0, Marshal.SizeOf(cVolumeHeader)); - cVolumeHeader = new PartimageHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(cVolumeHeader)); - Marshal.Copy(pHdrB, 0, headerPtr, Marshal.SizeOf(cVolumeHeader)); - cVolumeHeader = (PartimageHeader)Marshal.PtrToStructure(headerPtr, typeof(PartimageHeader)); - Marshal.FreeHGlobal(headerPtr); + cVolumeHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(pHdrB); return partimageMagic.SequenceEqual(cVolumeHeader.magic); } diff --git a/DiscImageChef.DiscImages/Partimage/Read.cs b/DiscImageChef.DiscImages/Partimage/Read.cs index cee0b2085..1c97d6b27 100644 --- a/DiscImageChef.DiscImages/Partimage/Read.cs +++ b/DiscImageChef.DiscImages/Partimage/Read.cs @@ -54,11 +54,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(cVolumeHeader)]; stream.Read(hdrB, 0, Marshal.SizeOf(cVolumeHeader)); - cVolumeHeader = new PartimageHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(cVolumeHeader)); - Marshal.Copy(hdrB, 0, headerPtr, Marshal.SizeOf(cVolumeHeader)); - cVolumeHeader = (PartimageHeader)Marshal.PtrToStructure(headerPtr, typeof(PartimageHeader)); - Marshal.FreeHGlobal(headerPtr); + cVolumeHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("Partimage plugin", "CVolumeHeader.magic = {0}", StringHandlers.CToString(cVolumeHeader.magic)); @@ -75,11 +71,7 @@ namespace DiscImageChef.DiscImages hdrB = new byte[Marshal.SizeOf(cMainHeader)]; stream.Read(hdrB, 0, Marshal.SizeOf(cMainHeader)); - cMainHeader = new PartimageMainHeader(); - headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(cMainHeader)); - Marshal.Copy(hdrB, 0, headerPtr, Marshal.SizeOf(cMainHeader)); - cMainHeader = (PartimageMainHeader)Marshal.PtrToStructure(headerPtr, typeof(PartimageMainHeader)); - Marshal.FreeHGlobal(headerPtr); + cMainHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("Partimage plugin", "CMainHeader.szFileSystem = {0}", StringHandlers.CToString(cMainHeader.szFileSystem)); @@ -193,10 +185,7 @@ namespace DiscImageChef.DiscImages hdrB = new byte[Marshal.SizeOf(typeof(CLocalHeader))]; stream.Read(hdrB, 0, Marshal.SizeOf(typeof(CLocalHeader))); - headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(CLocalHeader))); - Marshal.Copy(hdrB, 0, headerPtr, Marshal.SizeOf(typeof(CLocalHeader))); - CLocalHeader localHeader = (CLocalHeader)Marshal.PtrToStructure(headerPtr, typeof(CLocalHeader)); - Marshal.FreeHGlobal(headerPtr); + CLocalHeader localHeader = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("Partimage plugin", "CLocalHeader.qwBlockSize = {0}", localHeader.qwBlockSize); DicConsole.DebugWriteLine("Partimage plugin", "CLocalHeader.qwUsedBlocks = {0}", localHeader.qwUsedBlocks); diff --git a/DiscImageChef.DiscImages/QED/Identify.cs b/DiscImageChef.DiscImages/QED/Identify.cs index 79f63b90c..675c4ab65 100644 --- a/DiscImageChef.DiscImages/QED/Identify.cs +++ b/DiscImageChef.DiscImages/QED/Identify.cs @@ -30,10 +30,9 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -48,11 +47,7 @@ namespace DiscImageChef.DiscImages byte[] qHdrB = new byte[64]; stream.Read(qHdrB, 0, 64); - qHdr = new QedHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(64); - Marshal.Copy(qHdrB, 0, headerPtr, 64); - qHdr = (QedHeader)Marshal.PtrToStructure(headerPtr, typeof(QedHeader)); - Marshal.FreeHGlobal(headerPtr); + qHdr = Marshal.ByteArrayToStructureLittleEndian(qHdrB); return qHdr.magic == QED_MAGIC; } diff --git a/DiscImageChef.DiscImages/QED/Read.cs b/DiscImageChef.DiscImages/QED/Read.cs index 9f1b3b41e..09c1ed6f3 100644 --- a/DiscImageChef.DiscImages/QED/Read.cs +++ b/DiscImageChef.DiscImages/QED/Read.cs @@ -33,11 +33,11 @@ using System; using System.Collections.Generic; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -52,11 +52,7 @@ namespace DiscImageChef.DiscImages byte[] qHdrB = new byte[64]; stream.Read(qHdrB, 0, 64); - qHdr = new QedHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(64); - Marshal.Copy(qHdrB, 0, headerPtr, 64); - qHdr = (QedHeader)Marshal.PtrToStructure(headerPtr, typeof(QedHeader)); - Marshal.FreeHGlobal(headerPtr); + qHdr = Marshal.ByteArrayToStructureLittleEndian(qHdrB); DicConsole.DebugWriteLine("QED plugin", "qHdr.magic = 0x{0:X8}", qHdr.magic); DicConsole.DebugWriteLine("QED plugin", "qHdr.cluster_size = {0}", qHdr.cluster_size); diff --git a/DiscImageChef.DiscImages/RayDIM/Identify.cs b/DiscImageChef.DiscImages/RayDIM/Identify.cs index 92e393216..63ecacf67 100644 --- a/DiscImageChef.DiscImages/RayDIM/Identify.cs +++ b/DiscImageChef.DiscImages/RayDIM/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Runtime.InteropServices; using System.Text.RegularExpressions; @@ -51,10 +50,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); stream.Read(buffer, 0, buffer.Length); - IntPtr ftrPtr = Marshal.AllocHGlobal(buffer.Length); - Marshal.Copy(buffer, 0, ftrPtr, buffer.Length); - RayHdr header = (RayHdr)Marshal.PtrToStructure(ftrPtr, typeof(RayHdr)); - Marshal.FreeHGlobal(ftrPtr); + RayHdr header = Helpers.Marshal.ByteArrayToStructureLittleEndian(buffer); string signature = StringHandlers.CToString(header.signature); diff --git a/DiscImageChef.DiscImages/RayDIM/Read.cs b/DiscImageChef.DiscImages/RayDIM/Read.cs index 5cf8c0f8e..2598d948a 100644 --- a/DiscImageChef.DiscImages/RayDIM/Read.cs +++ b/DiscImageChef.DiscImages/RayDIM/Read.cs @@ -52,10 +52,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); stream.Read(buffer, 0, buffer.Length); - IntPtr ftrPtr = Marshal.AllocHGlobal(buffer.Length); - Marshal.Copy(buffer, 0, ftrPtr, buffer.Length); - RayHdr header = (RayHdr)Marshal.PtrToStructure(ftrPtr, typeof(RayHdr)); - Marshal.FreeHGlobal(ftrPtr); + RayHdr header = Helpers.Marshal.ByteArrayToStructureLittleEndian(buffer); string signature = StringHandlers.CToString(header.signature); @@ -83,8 +80,8 @@ namespace DiscImageChef.DiscImages } imageInfo.MediaType = Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads, - (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, - false)); + (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, + false)); switch(imageInfo.MediaType) { diff --git a/DiscImageChef.DiscImages/RsIde/Read.cs b/DiscImageChef.DiscImages/RsIde/Read.cs index 87e39e8b1..9b53c6bc4 100644 --- a/DiscImageChef.DiscImages/RsIde/Read.cs +++ b/DiscImageChef.DiscImages/RsIde/Read.cs @@ -52,10 +52,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(typeof(RsIdeHeader))]; stream.Read(hdrB, 0, hdrB.Length); - IntPtr hdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(RsIdeHeader))); - Marshal.Copy(hdrB, 0, hdrPtr, Marshal.SizeOf(typeof(RsIdeHeader))); - RsIdeHeader hdr = (RsIdeHeader)Marshal.PtrToStructure(hdrPtr, typeof(RsIdeHeader)); - Marshal.FreeHGlobal(hdrPtr); + RsIdeHeader hdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); if(!hdr.magic.SequenceEqual(signature)) return false; diff --git a/DiscImageChef.DiscImages/SaveDskF/Identify.cs b/DiscImageChef.DiscImages/SaveDskF/Identify.cs index 1fe54739c..31679ed9a 100644 --- a/DiscImageChef.DiscImages/SaveDskF/Identify.cs +++ b/DiscImageChef.DiscImages/SaveDskF/Identify.cs @@ -30,10 +30,9 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; -using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -48,11 +47,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[40]; stream.Read(hdr, 0, 40); - header = new SaveDskFHeader(); - IntPtr hdrPtr = Marshal.AllocHGlobal(40); - Marshal.Copy(hdr, 0, hdrPtr, 40); - header = (SaveDskFHeader)Marshal.PtrToStructure(hdrPtr, typeof(SaveDskFHeader)); - Marshal.FreeHGlobal(hdrPtr); + header = Marshal.ByteArrayToStructureLittleEndian(hdr); return (header.magic == SDF_MAGIC || header.magic == SDF_MAGIC_COMPRESSED || header.magic == SDF_MAGIC_OLD) && header.fatCopies <= 2 && header.padding == 0 && diff --git a/DiscImageChef.DiscImages/SaveDskF/Read.cs b/DiscImageChef.DiscImages/SaveDskF/Read.cs index 356f0ae5e..0b1a07069 100644 --- a/DiscImageChef.DiscImages/SaveDskF/Read.cs +++ b/DiscImageChef.DiscImages/SaveDskF/Read.cs @@ -32,13 +32,13 @@ using System; using System.IO; -using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Exceptions; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -52,11 +52,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[40]; stream.Read(hdr, 0, 40); - header = new SaveDskFHeader(); - IntPtr hdrPtr = Marshal.AllocHGlobal(40); - Marshal.Copy(hdr, 0, hdrPtr, 40); - header = (SaveDskFHeader)Marshal.PtrToStructure(hdrPtr, typeof(SaveDskFHeader)); - Marshal.FreeHGlobal(hdrPtr); + header = Marshal.ByteArrayToStructureLittleEndian(hdr); DicConsole.DebugWriteLine("SaveDskF plugin", "header.magic = 0x{0:X4}", header.magic); DicConsole.DebugWriteLine("SaveDskF plugin", "header.mediaType = 0x{0:X2}", header.mediaType); diff --git a/DiscImageChef.DiscImages/SuperCardPro/Identify.cs b/DiscImageChef.DiscImages/SuperCardPro/Identify.cs index fc201e589..f9881d7a4 100644 --- a/DiscImageChef.DiscImages/SuperCardPro/Identify.cs +++ b/DiscImageChef.DiscImages/SuperCardPro/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -50,10 +49,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[Marshal.SizeOf(Header)]; stream.Read(hdr, 0, Marshal.SizeOf(Header)); - IntPtr hdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(Header)); - Marshal.Copy(hdr, 0, hdrPtr, Marshal.SizeOf(Header)); - Header = (ScpHeader)Marshal.PtrToStructure(hdrPtr, typeof(ScpHeader)); - Marshal.FreeHGlobal(hdrPtr); + Header = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdr); return scpSignature.SequenceEqual(Header.signature); } diff --git a/DiscImageChef.DiscImages/SuperCardPro/Read.cs b/DiscImageChef.DiscImages/SuperCardPro/Read.cs index d647919ad..46e107f33 100644 --- a/DiscImageChef.DiscImages/SuperCardPro/Read.cs +++ b/DiscImageChef.DiscImages/SuperCardPro/Read.cs @@ -53,10 +53,7 @@ namespace DiscImageChef.DiscImages byte[] hdr = new byte[Marshal.SizeOf(Header)]; scpStream.Read(hdr, 0, Marshal.SizeOf(Header)); - IntPtr hdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(Header)); - Marshal.Copy(hdr, 0, hdrPtr, Marshal.SizeOf(Header)); - Header = (ScpHeader)Marshal.PtrToStructure(hdrPtr, typeof(ScpHeader)); - Marshal.FreeHGlobal(hdrPtr); + Header = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdr); DicConsole.DebugWriteLine("SuperCardPro plugin", "header.signature = \"{0}\"", StringHandlers.CToString(Header.signature)); @@ -107,10 +104,7 @@ namespace DiscImageChef.DiscImages byte[] rev = new byte[Marshal.SizeOf(typeof(TrackEntry))]; scpStream.Read(rev, 0, Marshal.SizeOf(typeof(TrackEntry))); - IntPtr revPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TrackEntry))); - Marshal.Copy(rev, 0, revPtr, Marshal.SizeOf(typeof(TrackEntry))); - trk.Entries[r] = (TrackEntry)Marshal.PtrToStructure(revPtr, typeof(TrackEntry)); - Marshal.FreeHGlobal(revPtr); + trk.Entries[r] = Helpers.Marshal.ByteArrayToStructureLittleEndian(rev); // De-relative offsets trk.Entries[r].dataOffset += Header.offsets[t]; } @@ -138,10 +132,7 @@ namespace DiscImageChef.DiscImages byte[] ftr = new byte[Marshal.SizeOf(typeof(ScpFooter))]; scpStream.Read(ftr, 0, Marshal.SizeOf(typeof(ScpFooter))); - IntPtr ftrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ScpFooter))); - Marshal.Copy(ftr, 0, ftrPtr, Marshal.SizeOf(typeof(ScpFooter))); - ScpFooter footer = (ScpFooter)Marshal.PtrToStructure(ftrPtr, typeof(ScpFooter)); - Marshal.FreeHGlobal(ftrPtr); + ScpFooter footer = Helpers.Marshal.ByteArrayToStructureLittleEndian(ftr); DicConsole.DebugWriteLine("SuperCardPro plugin", "footer.manufacturerOffset = 0x{0:X8}", footer.manufacturerOffset); diff --git a/DiscImageChef.DiscImages/UkvFdi/Identify.cs b/DiscImageChef.DiscImages/UkvFdi/Identify.cs index c36ba053c..d126b3223 100644 --- a/DiscImageChef.DiscImages/UkvFdi/Identify.cs +++ b/DiscImageChef.DiscImages/UkvFdi/Identify.cs @@ -50,10 +50,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(hdr)]; stream.Read(hdrB, 0, hdrB.Length); - - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - hdr = (FdiHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(FdiHeader)); - handle.Free(); + hdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); return hdr.magic.SequenceEqual(signature); } diff --git a/DiscImageChef.DiscImages/UkvFdi/Read.cs b/DiscImageChef.DiscImages/UkvFdi/Read.cs index a9e0ed897..2bec5b4ca 100644 --- a/DiscImageChef.DiscImages/UkvFdi/Read.cs +++ b/DiscImageChef.DiscImages/UkvFdi/Read.cs @@ -54,9 +54,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(hdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - hdr = (FdiHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(FdiHeader)); - handle.Free(); + hdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); DicConsole.DebugWriteLine("UkvFdi plugin", "hdr.addInfoLen = {0}", hdr.addInfoLen); DicConsole.DebugWriteLine("UkvFdi plugin", "hdr.cylinders = {0}", hdr.cylinders); diff --git a/DiscImageChef.DiscImages/VDI/Identify.cs b/DiscImageChef.DiscImages/VDI/Identify.cs index 0a30fa984..151527a61 100644 --- a/DiscImageChef.DiscImages/VDI/Identify.cs +++ b/DiscImageChef.DiscImages/VDI/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; @@ -48,11 +47,7 @@ namespace DiscImageChef.DiscImages byte[] vHdrB = new byte[Marshal.SizeOf(vHdr)]; stream.Read(vHdrB, 0, Marshal.SizeOf(vHdr)); - vHdr = new VdiHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vHdr)); - Marshal.Copy(vHdrB, 0, headerPtr, Marshal.SizeOf(vHdr)); - vHdr = (VdiHeader)Marshal.PtrToStructure(headerPtr, typeof(VdiHeader)); - Marshal.FreeHGlobal(headerPtr); + vHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vHdrB); return vHdr.magic == VDI_MAGIC; } diff --git a/DiscImageChef.DiscImages/VDI/Read.cs b/DiscImageChef.DiscImages/VDI/Read.cs index c84292f87..cf081d089 100644 --- a/DiscImageChef.DiscImages/VDI/Read.cs +++ b/DiscImageChef.DiscImages/VDI/Read.cs @@ -53,11 +53,7 @@ namespace DiscImageChef.DiscImages byte[] vHdrB = new byte[Marshal.SizeOf(vHdr)]; stream.Read(vHdrB, 0, Marshal.SizeOf(vHdr)); - vHdr = new VdiHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vHdr)); - Marshal.Copy(vHdrB, 0, headerPtr, Marshal.SizeOf(vHdr)); - vHdr = (VdiHeader)Marshal.PtrToStructure(headerPtr, typeof(VdiHeader)); - Marshal.FreeHGlobal(headerPtr); + vHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vHdrB); DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.creator = {0}", vHdr.creator); DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.magic = {0}", vHdr.magic); diff --git a/DiscImageChef.DiscImages/VHD/Read.cs b/DiscImageChef.DiscImages/VHD/Read.cs index b135d042a..91819bd51 100644 --- a/DiscImageChef.DiscImages/VHD/Read.cs +++ b/DiscImageChef.DiscImages/VHD/Read.cs @@ -32,7 +32,6 @@ using System; using System.IO; -using System.Runtime.InteropServices; using System.Text; using DiscImageChef.Checksums; using DiscImageChef.CommonTypes; @@ -40,6 +39,7 @@ using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Exceptions; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -423,10 +423,7 @@ namespace DiscImageChef.DiscImages imageStream.Read(batSectorBytes, 0, 512); // This does the big-endian trick but reverses the order of elements also Array.Reverse(batSectorBytes); - GCHandle handle = GCHandle.Alloc(batSectorBytes, GCHandleType.Pinned); - BatSector batSector = - (BatSector)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BatSector)); - handle.Free(); + BatSector batSector = Marshal.ByteArrayToStructureLittleEndian(batSectorBytes); // This restores the order of elements Array.Reverse(batSector.blockPointer); if(blockAllocationTable.Length >= i * 512 / 4 + 512 / 4) diff --git a/DiscImageChef.DiscImages/VHDX/Identify.cs b/DiscImageChef.DiscImages/VHDX/Identify.cs index deabb0964..3db78a6d9 100644 --- a/DiscImageChef.DiscImages/VHDX/Identify.cs +++ b/DiscImageChef.DiscImages/VHDX/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interfaces; @@ -48,11 +47,7 @@ namespace DiscImageChef.DiscImages byte[] vhdxIdB = new byte[Marshal.SizeOf(vhdxId)]; stream.Read(vhdxIdB, 0, Marshal.SizeOf(vhdxId)); - vhdxId = new VhdxIdentifier(); - IntPtr idPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vhdxId)); - Marshal.Copy(vhdxIdB, 0, idPtr, Marshal.SizeOf(vhdxId)); - vhdxId = (VhdxIdentifier)Marshal.PtrToStructure(idPtr, typeof(VhdxIdentifier)); - Marshal.FreeHGlobal(idPtr); + vhdxId = Helpers.Marshal.ByteArrayToStructureLittleEndian(vhdxIdB); return vhdxId.signature == VHDX_SIGNATURE; } diff --git a/DiscImageChef.DiscImages/VHDX/Read.cs b/DiscImageChef.DiscImages/VHDX/Read.cs index a8e674cf6..d95ee5669 100644 --- a/DiscImageChef.DiscImages/VHDX/Read.cs +++ b/DiscImageChef.DiscImages/VHDX/Read.cs @@ -54,11 +54,7 @@ namespace DiscImageChef.DiscImages byte[] vhdxIdB = new byte[Marshal.SizeOf(vhdxId)]; stream.Read(vhdxIdB, 0, Marshal.SizeOf(vhdxId)); - vhdxId = new VhdxIdentifier(); - IntPtr idPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vhdxId)); - Marshal.Copy(vhdxIdB, 0, idPtr, Marshal.SizeOf(vhdxId)); - vhdxId = (VhdxIdentifier)Marshal.PtrToStructure(idPtr, typeof(VhdxIdentifier)); - Marshal.FreeHGlobal(idPtr); + vhdxId = Helpers.Marshal.ByteArrayToStructureLittleEndian(vhdxIdB); if(vhdxId.signature != VHDX_SIGNATURE) return false; @@ -67,22 +63,14 @@ namespace DiscImageChef.DiscImages stream.Seek(64 * 1024, SeekOrigin.Begin); byte[] vHdrB = new byte[Marshal.SizeOf(vHdr)]; stream.Read(vHdrB, 0, Marshal.SizeOf(vHdr)); - vHdr = new VhdxHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vHdr)); - Marshal.Copy(vHdrB, 0, headerPtr, Marshal.SizeOf(vHdr)); - vHdr = (VhdxHeader)Marshal.PtrToStructure(headerPtr, typeof(VhdxHeader)); - Marshal.FreeHGlobal(headerPtr); + vHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vHdrB); if(vHdr.Signature != VHDX_HEADER_SIG) { stream.Seek(128 * 1024, SeekOrigin.Begin); vHdrB = new byte[Marshal.SizeOf(vHdr)]; stream.Read(vHdrB, 0, Marshal.SizeOf(vHdr)); - vHdr = new VhdxHeader(); - headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vHdr)); - Marshal.Copy(vHdrB, 0, headerPtr, Marshal.SizeOf(vHdr)); - vHdr = (VhdxHeader)Marshal.PtrToStructure(headerPtr, typeof(VhdxHeader)); - Marshal.FreeHGlobal(headerPtr); + vHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vHdrB); if(vHdr.Signature != VHDX_HEADER_SIG) throw new ImageNotSupportedException("VHDX header not found"); } @@ -90,22 +78,14 @@ namespace DiscImageChef.DiscImages stream.Seek(192 * 1024, SeekOrigin.Begin); byte[] vRegTableB = new byte[Marshal.SizeOf(vRegHdr)]; stream.Read(vRegTableB, 0, Marshal.SizeOf(vRegHdr)); - vRegHdr = new VhdxRegionTableHeader(); - IntPtr vRegTabPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vRegHdr)); - Marshal.Copy(vRegTableB, 0, vRegTabPtr, Marshal.SizeOf(vRegHdr)); - vRegHdr = (VhdxRegionTableHeader)Marshal.PtrToStructure(vRegTabPtr, typeof(VhdxRegionTableHeader)); - Marshal.FreeHGlobal(vRegTabPtr); + vRegHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vRegTableB); if(vRegHdr.signature != VHDX_REGION_SIG) { stream.Seek(256 * 1024, SeekOrigin.Begin); vRegTableB = new byte[Marshal.SizeOf(vRegHdr)]; stream.Read(vRegTableB, 0, Marshal.SizeOf(vRegHdr)); - vRegHdr = new VhdxRegionTableHeader(); - vRegTabPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vRegHdr)); - Marshal.Copy(vRegTableB, 0, vRegTabPtr, Marshal.SizeOf(vRegHdr)); - vRegHdr = (VhdxRegionTableHeader)Marshal.PtrToStructure(vRegTabPtr, typeof(VhdxRegionTableHeader)); - Marshal.FreeHGlobal(vRegTabPtr); + vRegHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vRegTableB); if(vRegHdr.signature != VHDX_REGION_SIG) throw new ImageNotSupportedException("VHDX region table not found"); @@ -116,11 +96,7 @@ namespace DiscImageChef.DiscImages { byte[] vRegB = new byte[Marshal.SizeOf(vRegs[i])]; stream.Read(vRegB, 0, Marshal.SizeOf(vRegs[i])); - vRegs[i] = new VhdxRegionTableEntry(); - IntPtr vRegPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vRegs[i])); - Marshal.Copy(vRegB, 0, vRegPtr, Marshal.SizeOf(vRegs[i])); - vRegs[i] = (VhdxRegionTableEntry)Marshal.PtrToStructure(vRegPtr, typeof(VhdxRegionTableEntry)); - Marshal.FreeHGlobal(vRegPtr); + vRegs[i] = Helpers.Marshal.ByteArrayToStructureLittleEndian(vRegB); if(vRegs[i].guid == batGuid) batOffset = (long)vRegs[i].offset; @@ -140,22 +116,14 @@ namespace DiscImageChef.DiscImages stream.Seek(metadataOffset, SeekOrigin.Begin); byte[] metTableB = new byte[Marshal.SizeOf(vMetHdr)]; stream.Read(metTableB, 0, Marshal.SizeOf(vMetHdr)); - vMetHdr = new VhdxMetadataTableHeader(); - IntPtr metTablePtr = Marshal.AllocHGlobal(Marshal.SizeOf(vMetHdr)); - Marshal.Copy(metTableB, 0, metTablePtr, Marshal.SizeOf(vMetHdr)); - vMetHdr = (VhdxMetadataTableHeader)Marshal.PtrToStructure(metTablePtr, typeof(VhdxMetadataTableHeader)); - Marshal.FreeHGlobal(metTablePtr); + vMetHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(metTableB); vMets = new VhdxMetadataTableEntry[vMetHdr.entries]; for(int i = 0; i < vMets.Length; i++) { byte[] vMetB = new byte[Marshal.SizeOf(vMets[i])]; stream.Read(vMetB, 0, Marshal.SizeOf(vMets[i])); - vMets[i] = new VhdxMetadataTableEntry(); - IntPtr vMetPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vMets[i])); - Marshal.Copy(vMetB, 0, vMetPtr, Marshal.SizeOf(vMets[i])); - vMets[i] = (VhdxMetadataTableEntry)Marshal.PtrToStructure(vMetPtr, typeof(VhdxMetadataTableEntry)); - Marshal.FreeHGlobal(vMetPtr); + vMets[i] = Helpers.Marshal.ByteArrayToStructureLittleEndian(vMetB); if(vMets[i].itemId == fileParametersGuid) fileParamsOff = vMets[i].offset; @@ -228,11 +196,7 @@ namespace DiscImageChef.DiscImages stream.Seek(parentOff + metadataOffset, SeekOrigin.Begin); byte[] vParHdrB = new byte[Marshal.SizeOf(vMetHdr)]; stream.Read(vParHdrB, 0, Marshal.SizeOf(vMetHdr)); - vParHdr = new VhdxParentLocatorHeader(); - IntPtr vParHdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vMetHdr)); - Marshal.Copy(vParHdrB, 0, vParHdrPtr, Marshal.SizeOf(vMetHdr)); - vParHdr = (VhdxParentLocatorHeader)Marshal.PtrToStructure(vParHdrPtr, typeof(VhdxParentLocatorHeader)); - Marshal.FreeHGlobal(vParHdrPtr); + vParHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vParHdrB); if(vParHdr.locatorType != parentTypeVhdxGuid) throw new @@ -243,11 +207,7 @@ namespace DiscImageChef.DiscImages { byte[] vParB = new byte[Marshal.SizeOf(vPars[i])]; stream.Read(vParB, 0, Marshal.SizeOf(vPars[i])); - vPars[i] = new VhdxParentLocatorEntry(); - IntPtr vParPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vPars[i])); - Marshal.Copy(vParB, 0, vParPtr, Marshal.SizeOf(vPars[i])); - vPars[i] = (VhdxParentLocatorEntry)Marshal.PtrToStructure(vParPtr, typeof(VhdxParentLocatorEntry)); - Marshal.FreeHGlobal(vParPtr); + vPars[i] = Helpers.Marshal.ByteArrayToStructureLittleEndian(vParB); } } else if((vFileParms.flags & FILE_FLAGS_HAS_PARENT) == FILE_FLAGS_HAS_PARENT) diff --git a/DiscImageChef.DiscImages/VMware/Identify.cs b/DiscImageChef.DiscImages/VMware/Identify.cs index f71aedace..9df22627b 100644 --- a/DiscImageChef.DiscImages/VMware/Identify.cs +++ b/DiscImageChef.DiscImages/VMware/Identify.cs @@ -30,7 +30,6 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -51,11 +50,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); byte[] vmEHdrB = new byte[Marshal.SizeOf(vmEHdr)]; stream.Read(vmEHdrB, 0, Marshal.SizeOf(vmEHdr)); - vmEHdr = new VMwareExtentHeader(); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vmEHdr)); - Marshal.Copy(vmEHdrB, 0, headerPtr, Marshal.SizeOf(vmEHdr)); - vmEHdr = (VMwareExtentHeader)Marshal.PtrToStructure(headerPtr, typeof(VMwareExtentHeader)); - Marshal.FreeHGlobal(headerPtr); + vmEHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vmEHdrB); stream.Seek(0, SeekOrigin.Begin); stream.Read(ddfMagic, 0, 0x15); @@ -68,10 +63,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); byte[] vmCHdrB = new byte[Marshal.SizeOf(vmCHdr)]; stream.Read(vmCHdrB, 0, Marshal.SizeOf(vmCHdr)); - headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vmCHdr)); - Marshal.Copy(vmCHdrB, 0, headerPtr, Marshal.SizeOf(vmCHdr)); - vmCHdr = (VMwareCowHeader)Marshal.PtrToStructure(headerPtr, typeof(VMwareCowHeader)); - Marshal.FreeHGlobal(headerPtr); + vmCHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vmCHdrB); return ddfMagicBytes.SequenceEqual(ddfMagic) || vmEHdr.magic == VMWARE_EXTENT_MAGIC || vmCHdr.magic == VMWARE_COW_MAGIC; diff --git a/DiscImageChef.DiscImages/VMware/Read.cs b/DiscImageChef.DiscImages/VMware/Read.cs index 0c3ee0b8e..ec18aa128 100644 --- a/DiscImageChef.DiscImages/VMware/Read.cs +++ b/DiscImageChef.DiscImages/VMware/Read.cs @@ -59,10 +59,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); byte[] vmEHdrB = new byte[Marshal.SizeOf(vmEHdr)]; stream.Read(vmEHdrB, 0, Marshal.SizeOf(vmEHdr)); - IntPtr headerPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vmEHdr)); - Marshal.Copy(vmEHdrB, 0, headerPtr, Marshal.SizeOf(vmEHdr)); - vmEHdr = (VMwareExtentHeader)Marshal.PtrToStructure(headerPtr, typeof(VMwareExtentHeader)); - Marshal.FreeHGlobal(headerPtr); + vmEHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vmEHdrB); } if(stream.Length > Marshal.SizeOf(vmCHdr)) @@ -70,10 +67,7 @@ namespace DiscImageChef.DiscImages stream.Seek(0, SeekOrigin.Begin); byte[] vmCHdrB = new byte[Marshal.SizeOf(vmCHdr)]; stream.Read(vmCHdrB, 0, Marshal.SizeOf(vmCHdr)); - IntPtr cowPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vmCHdr)); - Marshal.Copy(vmCHdrB, 0, cowPtr, Marshal.SizeOf(vmCHdr)); - vmCHdr = (VMwareCowHeader)Marshal.PtrToStructure(cowPtr, typeof(VMwareCowHeader)); - Marshal.FreeHGlobal(cowPtr); + vmCHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(vmCHdrB); } MemoryStream ddfStream = new MemoryStream(); @@ -142,10 +136,7 @@ namespace DiscImageChef.DiscImages extentStream.Seek(0, SeekOrigin.Begin); byte[] vmCHdrB = new byte[Marshal.SizeOf(extHdrCow)]; extentStream.Read(vmCHdrB, 0, Marshal.SizeOf(extHdrCow)); - IntPtr cowPtr = Marshal.AllocHGlobal(Marshal.SizeOf(extHdrCow)); - Marshal.Copy(vmCHdrB, 0, cowPtr, Marshal.SizeOf(extHdrCow)); - extHdrCow = (VMwareCowHeader)Marshal.PtrToStructure(cowPtr, typeof(VMwareCowHeader)); - Marshal.FreeHGlobal(cowPtr); + extHdrCow = Helpers.Marshal.ByteArrayToStructureLittleEndian(vmCHdrB); if(extHdrCow.magic != VMWARE_COW_MAGIC) break; @@ -311,10 +302,7 @@ namespace DiscImageChef.DiscImages VMwareExtentHeader extentHdr = new VMwareExtentHeader(); byte[] extentHdrB = new byte[Marshal.SizeOf(extentHdr)]; extentStream.Read(extentHdrB, 0, Marshal.SizeOf(extentHdr)); - IntPtr extentHdrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(extentHdr)); - Marshal.Copy(extentHdrB, 0, extentHdrPtr, Marshal.SizeOf(extentHdr)); - extentHdr = (VMwareExtentHeader)Marshal.PtrToStructure(extentHdrPtr, typeof(VMwareExtentHeader)); - Marshal.FreeHGlobal(extentHdrPtr); + extentHdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(extentHdrB); if(extentHdr.magic != VMWARE_EXTENT_MAGIC) throw new Exception($"{extent.Filter} is not an VMware extent."); diff --git a/DiscImageChef.DiscImages/Virtual98/Identify.cs b/DiscImageChef.DiscImages/Virtual98/Identify.cs index 05baf9773..d28010aec 100644 --- a/DiscImageChef.DiscImages/Virtual98/Identify.cs +++ b/DiscImageChef.DiscImages/Virtual98/Identify.cs @@ -55,9 +55,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(v98Hdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - v98Hdr = (Virtual98Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Virtual98Header)); - handle.Free(); + v98Hdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); if(!v98Hdr.signature.SequenceEqual(signature)) return false; diff --git a/DiscImageChef.DiscImages/Virtual98/Read.cs b/DiscImageChef.DiscImages/Virtual98/Read.cs index e3e94ac37..17e5c58c0 100644 --- a/DiscImageChef.DiscImages/Virtual98/Read.cs +++ b/DiscImageChef.DiscImages/Virtual98/Read.cs @@ -56,9 +56,7 @@ namespace DiscImageChef.DiscImages byte[] hdrB = new byte[Marshal.SizeOf(v98Hdr)]; stream.Read(hdrB, 0, hdrB.Length); - GCHandle handle = GCHandle.Alloc(hdrB, GCHandleType.Pinned); - v98Hdr = (Virtual98Header)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Virtual98Header)); - handle.Free(); + v98Hdr = Helpers.Marshal.ByteArrayToStructureLittleEndian(hdrB); imageInfo.MediaType = MediaType.GENERIC_HDD; diff --git a/DiscImageChef.DiscImages/WCDiskImage/Identify.cs b/DiscImageChef.DiscImages/WCDiskImage/Identify.cs index 7d9e7ac95..0b12fe12c 100644 --- a/DiscImageChef.DiscImages/WCDiskImage/Identify.cs +++ b/DiscImageChef.DiscImages/WCDiskImage/Identify.cs @@ -31,11 +31,10 @@ // Copyright © 2011-2019 Natalia Portillo // ****************************************************************************/ -using System; using System.IO; -using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes.Interfaces; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -51,11 +50,7 @@ namespace DiscImageChef.DiscImages byte[] header = new byte[32]; stream.Read(header, 0, 32); - IntPtr hdrPtr = Marshal.AllocHGlobal(32); - Marshal.Copy(header, 0, hdrPtr, 32); - WCDiskImageFileHeader fheader = - (WCDiskImageFileHeader)Marshal.PtrToStructure(hdrPtr, typeof(WCDiskImageFileHeader)); - Marshal.FreeHGlobal(hdrPtr); + WCDiskImageFileHeader fheader = Marshal.ByteArrayToStructureLittleEndian(header); /* check the signature */ if(Encoding.ASCII.GetString(fheader.signature).TrimEnd('\x00') != fileSignature) return false; diff --git a/DiscImageChef.DiscImages/WCDiskImage/Read.cs b/DiscImageChef.DiscImages/WCDiskImage/Read.cs index ed22d3298..b4fb2f68c 100644 --- a/DiscImageChef.DiscImages/WCDiskImage/Read.cs +++ b/DiscImageChef.DiscImages/WCDiskImage/Read.cs @@ -33,13 +33,13 @@ using System; using System.IO; -using System.Runtime.InteropServices; using System.Text; using DiscImageChef.Checksums; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; +using DiscImageChef.Helpers; namespace DiscImageChef.DiscImages { @@ -54,11 +54,7 @@ namespace DiscImageChef.DiscImages byte[] header = new byte[32]; stream.Read(header, 0, 32); - IntPtr hdrPtr = Marshal.AllocHGlobal(32); - Marshal.Copy(header, 0, hdrPtr, 32); - WCDiskImageFileHeader fheader = - (WCDiskImageFileHeader)Marshal.PtrToStructure(hdrPtr, typeof(WCDiskImageFileHeader)); - Marshal.FreeHGlobal(hdrPtr); + WCDiskImageFileHeader fheader = Marshal.ByteArrayToStructureLittleEndian(header); DicConsole.DebugWriteLine("d2f plugin", "Detected WC DISK IMAGE with {0} heads, {1} tracks and {2} sectors per track.", fheader.heads, fheader.cylinders, fheader.sectorsPerTrack); @@ -76,8 +72,8 @@ namespace DiscImageChef.DiscImages imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); imageInfo.MediaType = Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads, - (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, - false)); + (ushort)imageInfo.SectorsPerTrack, 512, MediaEncoding.MFM, + false)); /* buffer the entire disk in memory */ for(int cyl = 0; cyl < imageInfo.Cylinders; cyl++) @@ -120,11 +116,8 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("d2f plugin", "Comment present, reading"); byte[] sheaderBuffer = new byte[6]; stream.Read(sheaderBuffer, 0, 6); - IntPtr sectPtr = Marshal.AllocHGlobal(6); - Marshal.Copy(sheaderBuffer, 0, sectPtr, 6); WCDiskImageSectorHeader sheader = - (WCDiskImageSectorHeader)Marshal.PtrToStructure(sectPtr, typeof(WCDiskImageSectorHeader)); - Marshal.FreeHGlobal(sectPtr); + Marshal.ByteArrayToStructureLittleEndian(sheaderBuffer); if(sheader.flag != SectorFlag.Comment) throw new InvalidDataException(string.Format("Invalid sector type '{0}' encountered", @@ -140,11 +133,8 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("d2f plugin", "Directory listing present, reading"); byte[] sheaderBuffer = new byte[6]; stream.Read(sheaderBuffer, 0, 6); - IntPtr sectPtr = Marshal.AllocHGlobal(6); - Marshal.Copy(sheaderBuffer, 0, sectPtr, 6); WCDiskImageSectorHeader sheader = - (WCDiskImageSectorHeader)Marshal.PtrToStructure(sectPtr, typeof(WCDiskImageSectorHeader)); - Marshal.FreeHGlobal(sectPtr); + Marshal.ByteArrayToStructureLittleEndian(sheaderBuffer); if(sheader.flag != SectorFlag.Directory) throw new InvalidDataException(string.Format("Invalid sector type '{0}' encountered", @@ -216,11 +206,8 @@ namespace DiscImageChef.DiscImages /* read the sector header */ byte[] sheaderBuffer = new byte[6]; stream.Read(sheaderBuffer, 0, 6); - IntPtr sectPtr = Marshal.AllocHGlobal(6); - Marshal.Copy(sheaderBuffer, 0, sectPtr, 6); WCDiskImageSectorHeader sheader = - (WCDiskImageSectorHeader)Marshal.PtrToStructure(sectPtr, typeof(WCDiskImageSectorHeader)); - Marshal.FreeHGlobal(sectPtr); + Marshal.ByteArrayToStructureLittleEndian(sheaderBuffer); /* validate the sector header */ if(sheader.cylinder != cyl || sheader.head != head || sheader.sector != sect)