From 7e741bd9c1004552777c81e5644bf287cf8ded95 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 15 Mar 2019 22:07:10 +0000 Subject: [PATCH] Use new marshaller in dicformat. --- .../DiscImageChef/Read.cs | 36 ++- .../DiscImageChef/Structs.cs | 8 - .../DiscImageChef/Verify.cs | 10 +- .../DiscImageChef/Write.cs | 244 ++++-------------- 4 files changed, 78 insertions(+), 220 deletions(-) diff --git a/DiscImageChef.DiscImages/DiscImageChef/Read.cs b/DiscImageChef.DiscImages/DiscImageChef/Read.cs index 7b92347d2..175e23ee8 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Read.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Read.cs @@ -34,6 +34,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Xml; using System.Xml.Serialization; @@ -46,9 +47,9 @@ using DiscImageChef.CommonTypes.Exceptions; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; -using DiscImageChef.Helpers; using Schemas; using SharpCompress.Compressors.LZMA; +using Marshal = DiscImageChef.Helpers.Marshal; using TrackType = DiscImageChef.CommonTypes.Enums.TrackType; namespace DiscImageChef.DiscImages @@ -78,7 +79,7 @@ namespace DiscImageChef.DiscImages imageStream.Position = (long)header.indexOffset; structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - IndexHeader idxHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + IndexHeader idxHeader = Marshal.SpanToStructureLittleEndian(structureBytes); if(idxHeader.identifier != BlockType.Index) throw new FeatureUnsupportedImageException("Index not found!"); @@ -91,7 +92,7 @@ namespace DiscImageChef.DiscImages { structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - IndexEntry entry = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + IndexEntry entry = Marshal.SpanToStructureLittleEndian(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); @@ -115,7 +116,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - BlockHeader blockHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + BlockHeader blockHeader = Marshal.SpanToStructureLittleEndian(structureBytes); imageInfo.ImageSize += blockHeader.cmpLength; // Unused, skip @@ -279,7 +280,7 @@ namespace DiscImageChef.DiscImages { structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - DdtHeader ddtHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian(structureBytes); imageInfo.ImageSize += ddtHeader.cmpLength; if(ddtHeader.identifier != BlockType.DeDuplicationTable) break; @@ -303,10 +304,7 @@ namespace DiscImageChef.DiscImages lzmaDdt.Read(decompressedDdt, 0, (int)ddtHeader.length); lzmaDdt.Close(); compressedDdtMs.Close(); - userDataDdt = new ulong[ddtHeader.entries]; - for(ulong i = 0; i < ddtHeader.entries; i++) - userDataDdt[i] = - BitConverter.ToUInt64(decompressedDdt, (int)(i * sizeof(ulong))); + userDataDdt = MemoryMarshal.Cast(decompressedDdt).ToArray(); DateTime ddtEnd = DateTime.UtcNow; inMemoryDdt = true; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -329,7 +327,7 @@ namespace DiscImageChef.DiscImages { structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - DdtHeader ddtHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian(structureBytes); imageInfo.ImageSize += ddtHeader.cmpLength; if(ddtHeader.identifier != BlockType.DeDuplicationTable) break; @@ -365,8 +363,7 @@ namespace DiscImageChef.DiscImages ImageNotSupportedException($"Found unsupported compression algorithm {(ushort)ddtHeader.compression}"); } - for(ulong i = 0; i < ddtHeader.entries; i++) - cdDdt[i] = BitConverter.ToUInt32(decompressedDdt, (int)(i * sizeof(uint))); + cdDdt = MemoryMarshal.Cast(decompressedDdt).ToArray(); if(entry.dataType == DataType.CdSectorPrefixCorrected) sectorPrefixDdt = cdDdt; else if(entry.dataType == DataType.CdSectorSuffixCorrected) sectorSuffixDdt = cdDdt; @@ -377,7 +374,7 @@ namespace DiscImageChef.DiscImages case BlockType.GeometryBlock: structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - geometryBlock = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + geometryBlock = Marshal.SpanToStructureLittleEndian(structureBytes); if(geometryBlock.identifier == BlockType.GeometryBlock) { DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -395,7 +392,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); MetadataBlock metadataBlock = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + Marshal.SpanToStructureLittleEndian(structureBytes); if(metadataBlock.identifier != entry.blockType) { @@ -562,8 +559,7 @@ namespace DiscImageChef.DiscImages case BlockType.TracksBlock: structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - TracksHeader tracksHeader = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + TracksHeader tracksHeader = Marshal.SpanToStructureLittleEndian(structureBytes); if(tracksHeader.identifier != BlockType.TracksBlock) { DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -624,7 +620,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); CicmMetadataBlock cicmBlock = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + Marshal.SpanToStructureLittleEndian(structureBytes); if(cicmBlock.identifier != BlockType.CicmBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -653,7 +649,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); DumpHardwareHeader dumpBlock = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + Marshal.SpanToStructureLittleEndian(structureBytes); if(dumpBlock.identifier != BlockType.DumpHardwareBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -679,7 +675,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); DumpHardwareEntry dumpEntry = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + Marshal.SpanToStructureLittleEndian(structureBytes); DumpHardwareType dump = new DumpHardwareType { @@ -923,7 +919,7 @@ namespace DiscImageChef.DiscImages imageStream.Position = (long)blockOffset; structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - blockHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + blockHeader = Marshal.SpanToStructureLittleEndian(structureBytes); // Decompress block switch(blockHeader.compression) diff --git a/DiscImageChef.DiscImages/DiscImageChef/Structs.cs b/DiscImageChef.DiscImages/DiscImageChef/Structs.cs index a4ad1ecb9..652c01b60 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Structs.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Structs.cs @@ -290,14 +290,6 @@ namespace DiscImageChef.DiscImages public uint extents; } - /// Dump hardware extent, first and last sector dumped, both inclusive - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct DumpHardwareExtent - { - public ulong start; - public ulong end; - } - /// /// Checksum block, contains a checksum of all user data sectors (except for optical discs that is 2352 bytes raw /// sector if available diff --git a/DiscImageChef.DiscImages/DiscImageChef/Verify.cs b/DiscImageChef.DiscImages/DiscImageChef/Verify.cs index e7f58855f..ecce835b1 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Verify.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Verify.cs @@ -50,7 +50,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - IndexHeader idxHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + IndexHeader idxHeader = Marshal.SpanToStructureLittleEndian(structureBytes); if(idxHeader.identifier != BlockType.Index) { @@ -79,7 +79,7 @@ namespace DiscImageChef.DiscImages { structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - IndexEntry entry = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + IndexEntry entry = Marshal.SpanToStructureLittleEndian(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); @@ -101,7 +101,7 @@ namespace DiscImageChef.DiscImages case BlockType.DataBlock: structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - BlockHeader blockHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + BlockHeader blockHeader = Marshal.SpanToStructureLittleEndian(structureBytes); crcVerify = new Crc64Context(); readBytes = 0; @@ -136,7 +136,7 @@ namespace DiscImageChef.DiscImages case BlockType.DeDuplicationTable: structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - DdtHeader ddtHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian(structureBytes); crcVerify = new Crc64Context(); readBytes = 0; @@ -171,7 +171,7 @@ namespace DiscImageChef.DiscImages case BlockType.TracksBlock: structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - TracksHeader trkHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + TracksHeader trkHeader = Marshal.SpanToStructureLittleEndian(structureBytes); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Track block at {0} contains {1} entries", header.indexOffset, diff --git a/DiscImageChef.DiscImages/DiscImageChef/Write.cs b/DiscImageChef.DiscImages/DiscImageChef/Write.cs index 26a0e3419..c6d2b4b9f 100644 --- a/DiscImageChef.DiscImages/DiscImageChef/Write.cs +++ b/DiscImageChef.DiscImages/DiscImageChef/Write.cs @@ -34,6 +34,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; using System.Xml; @@ -47,9 +48,9 @@ using DiscImageChef.CommonTypes.Exceptions; using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; using DiscImageChef.Decoders; -using DiscImageChef.Helpers; using Schemas; using SharpCompress.Compressors.LZMA; +using Marshal = DiscImageChef.Helpers.Marshal; using TrackType = DiscImageChef.CommonTypes.Enums.TrackType; namespace DiscImageChef.DiscImages @@ -262,7 +263,7 @@ namespace DiscImageChef.DiscImages imageStream.Position = (long)header.indexOffset; structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - IndexHeader idxHeader = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + IndexHeader idxHeader = Marshal.SpanToStructureLittleEndian(structureBytes); if(idxHeader.identifier != BlockType.Index) { @@ -277,7 +278,7 @@ namespace DiscImageChef.DiscImages { structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - IndexEntry entry = Marshal.ByteArrayToStructureLittleEndian(structureBytes); + IndexEntry entry = Marshal.SpanToStructureLittleEndian(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); @@ -309,8 +310,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); - BlockHeader blockHeader = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + BlockHeader blockHeader = Marshal.SpanToStructureLittleEndian(structureBytes); imageInfo.ImageSize += blockHeader.cmpLength; if(blockHeader.identifier != entry.blockType) @@ -433,10 +433,7 @@ namespace DiscImageChef.DiscImages lzmaDdt.Read(decompressedDdt, 0, (int)ddtHeader.length); lzmaDdt.Close(); compressedDdtMs.Close(); - userDataDdt = new ulong[ddtHeader.entries]; - for(ulong i = 0; i < ddtHeader.entries; i++) - userDataDdt[i] = - BitConverter.ToUInt64(decompressedDdt, (int)(i * sizeof(ulong))); + userDataDdt = MemoryMarshal.Cast(decompressedDdt).ToArray(); DateTime ddtEnd = DateTime.UtcNow; inMemoryDdt = true; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -472,7 +469,6 @@ namespace DiscImageChef.DiscImages } byte[] decompressedDdt = new byte[ddtHeader.length]; - uint[] cdDdt = new uint[ddtHeader.entries]; switch(ddtHeader.compression) { @@ -503,8 +499,7 @@ namespace DiscImageChef.DiscImages ImageNotSupportedException($"Found unsupported compression algorithm {(ushort)ddtHeader.compression}"); } - for(ulong i = 0; i < ddtHeader.entries; i++) - cdDdt[i] = BitConverter.ToUInt32(decompressedDdt, (int)(i * sizeof(uint))); + uint[] cdDdt = MemoryMarshal.Cast(decompressedDdt).ToArray(); switch(entry.dataType) { @@ -523,7 +518,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); CicmMetadataBlock cicmBlock = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + Marshal.SpanToStructureLittleEndian(structureBytes); if(cicmBlock.identifier != BlockType.CicmBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -553,7 +548,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); DumpHardwareHeader dumpBlock = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + Marshal.SpanToStructureLittleEndian(structureBytes); if(dumpBlock.identifier != BlockType.DumpHardwareBlock) break; DicConsole.DebugWriteLine("DiscImageChef format plugin", @@ -579,7 +574,7 @@ namespace DiscImageChef.DiscImages structureBytes = new byte[Marshal.SizeOf()]; imageStream.Read(structureBytes, 0, structureBytes.Length); DumpHardwareEntry dumpEntry = - Marshal.ByteArrayToStructureLittleEndian(structureBytes); + Marshal.SpanToStructureLittleEndian(structureBytes); DumpHardwareType dump = new DumpHardwareType { @@ -717,12 +712,8 @@ namespace DiscImageChef.DiscImages length = sectors * sizeof(ulong) }; - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(ddtHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref ddtHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); structureBytes = null; @@ -932,11 +923,8 @@ namespace DiscImageChef.DiscImages offset = (ulong)imageStream.Position }); - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(currentBlockHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref currentBlockHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); structureBytes = null; if(currentBlockHeader.compression == CompressionType.Lzma) @@ -1524,11 +1512,8 @@ namespace DiscImageChef.DiscImages offset = (ulong)imageStream.Position }); - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(currentBlockHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref currentBlockHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); structureBytes = null; if(currentBlockHeader.compression == CompressionType.Lzma) @@ -1596,11 +1581,8 @@ namespace DiscImageChef.DiscImages blockStream.Close(); blockStream = null; - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(tagBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref tagBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(tagBlock.compression == CompressionType.Lzma) imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -1624,11 +1606,8 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("DiscImageChef format plugin", "Writing geometry block to position {0}", idxEntry.offset); - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(geometryBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref geometryBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); index.RemoveAll(t => t.blockType == BlockType.GeometryBlock && t.dataType == DataType.NoData); @@ -1680,13 +1659,8 @@ namespace DiscImageChef.DiscImages extents = (uint)dump.Extents.Length }; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(dumpEntry, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref dumpEntry); dumpMs.Write(structureBytes, 0, structureBytes.Length); if(dumpManufacturer != null) @@ -1763,12 +1737,8 @@ namespace DiscImageChef.DiscImages length = (uint)dumpMs.Length }; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(dumpBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref dumpBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); imageStream.Write(dumpMs.ToArray(), 0, (int)dumpMs.Length); @@ -1796,12 +1766,8 @@ namespace DiscImageChef.DiscImages CicmMetadataBlock cicmBlock = new CicmMetadataBlock {identifier = BlockType.CicmBlock, length = (uint)cicmMs.Length}; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(cicmBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref cicmBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); imageStream.Write(cicmMs.ToArray(), 0, (int)cicmMs.Length); @@ -1821,13 +1787,8 @@ namespace DiscImageChef.DiscImages byte[] md5 = md5Provider.Final(); ChecksumEntry md5Entry = new ChecksumEntry {type = ChecksumAlgorithm.Md5, length = (uint)md5.Length}; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(md5Entry, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref md5Entry); chkMs.Write(structureBytes, 0, structureBytes.Length); chkMs.Write(md5, 0, md5.Length); chkHeader.entries++; @@ -1838,13 +1799,8 @@ namespace DiscImageChef.DiscImages byte[] sha1 = sha1Provider.Final(); ChecksumEntry sha1Entry = new ChecksumEntry {type = ChecksumAlgorithm.Sha1, length = (uint)sha1.Length}; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(sha1Entry, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref sha1Entry); chkMs.Write(structureBytes, 0, structureBytes.Length); chkMs.Write(sha1, 0, sha1.Length); chkHeader.entries++; @@ -1855,13 +1811,8 @@ namespace DiscImageChef.DiscImages byte[] sha256 = sha256Provider.Final(); ChecksumEntry sha256Entry = new ChecksumEntry {type = ChecksumAlgorithm.Sha256, length = (uint)sha256.Length}; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(sha256Entry, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref sha256Entry); chkMs.Write(structureBytes, 0, structureBytes.Length); chkMs.Write(sha256, 0, sha256.Length); chkHeader.entries++; @@ -1872,13 +1823,8 @@ namespace DiscImageChef.DiscImages byte[] spamsum = Encoding.ASCII.GetBytes(spamsumProvider.End()); ChecksumEntry spamsumEntry = new ChecksumEntry {type = ChecksumAlgorithm.SpamSum, length = (uint)spamsum.Length}; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(spamsumEntry, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref spamsumEntry); chkMs.Write(structureBytes, 0, structureBytes.Length); chkMs.Write(spamsum, 0, spamsum.Length); chkHeader.entries++; @@ -1897,13 +1843,8 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("DiscImageChef format plugin", "Writing checksum block to position {0}", idxEntry.offset); - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(chkHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref chkHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); imageStream.Write(chkMs.ToArray(), 0, (int)chkMs.Length); @@ -1939,12 +1880,9 @@ namespace DiscImageChef.DiscImages blockStream = new MemoryStream(); MemoryStream userDataDdtStream = new MemoryStream(); crc64 = new Crc64Context(); - for(ulong i = 0; i < (ulong)userDataDdt.LongLength; i++) - { - byte[] ddtEntry = BitConverter.GetBytes(userDataDdt[i]); - crc64.Update(ddtEntry); - userDataDdtStream.Write(ddtEntry, 0, ddtEntry.Length); - } + byte[] ddtEntries = MemoryMarshal.Cast(userDataDdt).ToArray(); + crc64.Update(ddtEntries); + userDataDdtStream.Write(ddtEntries, 0, ddtEntries.Length); byte[] lzmaProperties = CompressDataToStreamWithLZMA(userDataDdtStream.ToArray(), lzmaEncoderProperties, blockStream, @@ -1956,11 +1894,8 @@ namespace DiscImageChef.DiscImages cmpCrc64Context.Update(blockStream.ToArray()); ddtHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64Context.Final(), 0); - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(ddtHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref ddtHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); structureBytes = null; imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2033,13 +1968,8 @@ namespace DiscImageChef.DiscImages (endCompress - startCompress).TotalSeconds); } - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(prefixBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref prefixBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(prefixBlock.compression == CompressionType.Lzma) imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2101,13 +2031,8 @@ namespace DiscImageChef.DiscImages (endCompress - startCompress).TotalSeconds); } - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(prefixBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref prefixBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(prefixBlock.compression == CompressionType.Lzma) imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2194,12 +2119,9 @@ namespace DiscImageChef.DiscImages blockStream = new MemoryStream(); MemoryStream sectorPrefixDdtStream = new MemoryStream(); crc64 = new Crc64Context(); - for(ulong i = 0; i < (ulong)sectorPrefixDdt.LongLength; i++) - { - byte[] ddtEntry = BitConverter.GetBytes(sectorPrefixDdt[i]); - crc64.Update(ddtEntry); - sectorPrefixDdtStream.Write(ddtEntry, 0, ddtEntry.Length); - } + byte[] ddtEntries = MemoryMarshal.Cast(sectorPrefixDdt).ToArray(); + crc64.Update(ddtEntries); + sectorPrefixDdtStream.Write(ddtEntries, 0, ddtEntries.Length); byte[] lzmaProperties = CompressDataToStreamWithLZMA(sectorPrefixDdtStream.ToArray(), lzmaEncoderProperties, @@ -2211,13 +2133,8 @@ namespace DiscImageChef.DiscImages cmpCrc64Context.Update(blockStream.ToArray()); ddtHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64Context.Final(), 0); - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(ddtHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref ddtHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); structureBytes = null; imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2252,13 +2169,10 @@ namespace DiscImageChef.DiscImages blockStream = new MemoryStream(); MemoryStream sectorSuffixDdtStream = new MemoryStream(); - crc64 = new Crc64Context(); - for(ulong i = 0; i < (ulong)sectorSuffixDdt.LongLength; i++) - { - byte[] ddtEntry = BitConverter.GetBytes(sectorSuffixDdt[i]); - crc64.Update(ddtEntry); - sectorSuffixDdtStream.Write(ddtEntry, 0, ddtEntry.Length); - } + crc64 = new Crc64Context(); + ddtEntries = MemoryMarshal.Cast(sectorSuffixDdt).ToArray(); + crc64.Update(ddtEntries); + sectorSuffixDdtStream.Write(ddtEntries, 0, ddtEntries.Length); lzmaProperties = CompressDataToStreamWithLZMA(sectorSuffixDdtStream.ToArray(), lzmaEncoderProperties, @@ -2269,13 +2183,8 @@ namespace DiscImageChef.DiscImages cmpCrc64Context.Update(blockStream.ToArray()); ddtHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64Context.Final(), 0); - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(ddtHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref ddtHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); structureBytes = null; imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2341,13 +2250,8 @@ namespace DiscImageChef.DiscImages (endCompress - startCompress).TotalSeconds); } - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(prefixBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref prefixBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(prefixBlock.compression == CompressionType.Lzma) imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2413,13 +2317,8 @@ namespace DiscImageChef.DiscImages (endCompress - startCompress).TotalSeconds); } - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(suffixBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref suffixBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(suffixBlock.compression == CompressionType.Lzma) imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2487,13 +2386,8 @@ namespace DiscImageChef.DiscImages (endCompress - startCompress).TotalSeconds); } - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(subheaderBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref subheaderBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(subheaderBlock.compression == CompressionType.Lzma) imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2562,13 +2456,8 @@ namespace DiscImageChef.DiscImages (endCompress - startCompress).TotalSeconds); } - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(subchannelBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref subchannelBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(subchannelBlock.compression == CompressionType.Lzma || subchannelBlock.compression == CompressionType.LzmaClauniaSubchannelTransform) @@ -2642,13 +2531,8 @@ namespace DiscImageChef.DiscImages offset = (ulong)imageStream.Position }); - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(trkHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref trkHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); imageStream.Write(blockStream.ToArray(), 0, (int)blockStream.Length); blockStream.Close(); @@ -2743,13 +2627,8 @@ namespace DiscImageChef.DiscImages subchannelBlock.compression = CompressionType.Lzma; } - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(subchannelBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, - structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + MemoryMarshal.Write(structureBytes, ref subchannelBlock); imageStream.Write(structureBytes, 0, structureBytes.Length); if(subchannelBlock.compression == CompressionType.Lzma) imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); @@ -2905,12 +2784,8 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("DiscImageChef format plugin", "Writing metadata to position {0}", imageStream.Position); metadataBlock.blockSize = (uint)blockStream.Length; - structurePointer = - System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(metadataBlock, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref metadataBlock); blockStream.Position = 0; blockStream.Write(structureBytes, 0, structureBytes.Length); index.RemoveAll(t => t.blockType == BlockType.MetadataBlock && t.dataType == DataType.NoData); @@ -2935,11 +2810,9 @@ namespace DiscImageChef.DiscImages // Write index to memory foreach(IndexEntry entry in index) { - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(entry, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + IndexEntry indexEntry = entry; + MemoryMarshal.Write(structureBytes, ref indexEntry); blockStream.Write(structureBytes, 0, structureBytes.Length); } @@ -2953,11 +2826,8 @@ namespace DiscImageChef.DiscImages }; // Write index to disk - structurePointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(Marshal.SizeOf()); - structureBytes = new byte[Marshal.SizeOf()]; - System.Runtime.InteropServices.Marshal.StructureToPtr(idxHeader, structurePointer, true); - System.Runtime.InteropServices.Marshal.Copy(structurePointer, structureBytes, 0, structureBytes.Length); - System.Runtime.InteropServices.Marshal.FreeHGlobal(structurePointer); + structureBytes = new byte[Marshal.SizeOf()]; + MemoryMarshal.Write(structureBytes, ref idxHeader); imageStream.Write(structureBytes, 0, structureBytes.Length); imageStream.Write(blockStream.ToArray(), 0, (int)blockStream.Length); blockStream.Close();