void IStream.Read(Byte[] buffer, Int32 bufferSize, IntPtr bytesReadPtr)
        {
            try
            {
                //Check that close has not been called
                if (closeStream)
                {
                    Marshal.WriteInt32(bytesReadPtr, -1);
                    return;
                }

                //TODO - shell reads 16 bytes of data and discards it when the drop begins??
                if (bufferSize == 16)
                {
                    Marshal.WriteInt32(bytesReadPtr, -1);
                    return;
                }

                //check if file is fully read
                if (readLen >= SourceVirtualFile.FileSize)
                {
                    Marshal.WriteInt32(bytesReadPtr, 0);
                    OnComplete();
                    return;
                }

                //using await will break the dragdrop operation!
                byte[] data = SourceVirtualFile.ReadDelegate(SourceVirtualFile.RemoteAccessToken, SourceVirtualFile.FileOperationId, SourceVirtualFile.FileRequestId, bufferSize).Result;

                //check that close has not been called
                if (closeStream || data.Length == 0)
                {
                    Marshal.WriteInt32(bytesReadPtr, -1);
                    return;
                }

                //copy the data to the buffer, and write the length of the data to BytesReadPtr
                Buffer.BlockCopy(data, 0, buffer, 0, data.Length);
                Marshal.WriteInt32(bytesReadPtr, data.Length);
                readLen += data.Length;
            }
            catch (Exception ex)
            {
                ISLogger.Write("ManagedRemoteIStream: Failed to read remote file: " + ex.Message);
            }
        }