Search code examples
c#intptr

Copy data from from IntPtr to IntPtr


I have two IntPtr values pointing to some data areas of length bytes. length may have an order of magnitude of 200k to 400k.

int length = /* ..*/
IntPtr ptrSrc = /*.. */;
IntPtr ptrDst = /* .. */;

Now I want to copy the data from ptrSrc to ptrDst. This code works fine:

byte[] data = new byte[length];
Marshal.Copy(ptrSrc, data, 0, length);
Marshal.Copy(data, 0, ptrDst, length);

but it has the drawback of needing an additional temporary (potentially huge) array. Unfortunately, I could not find a Marshal.Copy variant in the .NET framework for copying directly from IntPtr to IntPtr, so I am looking for alternatives.

I am interested in a solution which works on 32-bit Windows as well as 64-bit Windows. Any suggestions?


Solution

  • You can P/Invoke into the appropiate C function. That is probably the easiest way of doing that. Example:

    class Program
    {
        [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
        public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
    
        static void Main()
        {
            const int size = 200;
            IntPtr memorySource = Marshal.AllocHGlobal(size);
            IntPtr memoryTarget = Marshal.AllocHGlobal(size);
    
            CopyMemory(memoryTarget,memorySource,size);
        }
    }