public virtual long CopyTo(UnsafeNativeMethods.IStream pstm, long cb, long[] pcbRead) { int bufsize = 4096; // one page IntPtr buffer = Marshal.AllocHGlobal(bufsize); if (buffer == IntPtr.Zero) { throw new OutOfMemoryException(); } long written = 0; try { while (written < cb) { int toRead = bufsize; if (written + toRead > cb) { toRead = (int)(cb - written); } int read = Read(buffer, toRead); if (read == 0) { break; } if (pstm.Write(buffer, read) != read) { throw EFail("Wrote an incorrect number of bytes"); } written += read; } } finally { Marshal.FreeHGlobal(buffer); } if (pcbRead != null && pcbRead.Length > 0) { pcbRead[0] = written; } return(written); }
private unsafe int _Write(void *handle, int bytes) { return(comStream.Write((IntPtr)handle, bytes)); }