Exemple #1
0
        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));
 }