diff --git a/DiscImageChef.DiscImages/VDI/Read.cs b/DiscImageChef.DiscImages/VDI/Read.cs index 5090e9e2c..798ee7db5 100644 --- a/DiscImageChef.DiscImages/VDI/Read.cs +++ b/DiscImageChef.DiscImages/VDI/Read.cs @@ -33,12 +33,13 @@ using System; using System.Collections.Generic; using System.IO; +using System.Runtime.InteropServices; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Exceptions; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.Console; -using DiscImageChef.Helpers; +using Marshal = DiscImageChef.Helpers.Marshal; namespace DiscImageChef.DiscImages { @@ -83,12 +84,15 @@ namespace DiscImageChef.DiscImages throw new FeatureSupportedButNotImplementedImageException($"Support for image type {vHdr.imageType} not yet implemented"); + DateTime start = DateTime.UtcNow; DicConsole.DebugWriteLine("VirtualBox plugin", "Reading Image Block Map"); stream.Seek(vHdr.offsetBlocks, SeekOrigin.Begin); - ibm = new uint[vHdr.blocks]; byte[] ibmB = new byte[vHdr.blocks * 4]; stream.Read(ibmB, 0, ibmB.Length); - for(int i = 0; i < ibm.Length; i++) ibm[i] = BitConverter.ToUInt32(ibmB, i * 4); + ibm = MemoryMarshal.Cast(ibmB).ToArray(); + DateTime end = DateTime.UtcNow; + DicConsole.DebugWriteLine("VirtualBox plugin", "Reading Image Block Map took {0} ms", + (end - start).TotalMilliseconds); sectorCache = new Dictionary(); @@ -146,7 +150,7 @@ namespace DiscImageChef.DiscImages ulong index = sectorAddress * vHdr.sectorSize / vHdr.blockSize; ulong secOff = sectorAddress * vHdr.sectorSize % vHdr.blockSize; - uint ibmOff = ibm[index]; + uint ibmOff = ibm[(int)index]; if(ibmOff == VDI_EMPTY) return new byte[vHdr.sectorSize]; diff --git a/DiscImageChef.DiscImages/VDI/Write.cs b/DiscImageChef.DiscImages/VDI/Write.cs index 567d64e48..a07173207 100644 --- a/DiscImageChef.DiscImages/VDI/Write.cs +++ b/DiscImageChef.DiscImages/VDI/Write.cs @@ -34,11 +34,12 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Structs; -using DiscImageChef.Helpers; using Schemas; +using Marshal = DiscImageChef.Helpers.Marshal; namespace DiscImageChef.DiscImages { @@ -251,7 +252,7 @@ namespace DiscImageChef.DiscImages writingStream.Write(hdr, 0, hdr.Length); writingStream.Seek(vHdr.offsetBlocks, SeekOrigin.Begin); - for(long i = 0; i < ibm.LongLength; i++) writingStream.Write(BitConverter.GetBytes(ibm[i]), 0, 4); + writingStream.Write(MemoryMarshal.Cast(ibm).ToArray(), 0, 4 * ibm.Length); writingStream.Flush(); writingStream.Close();