private void AsyncRead(Handle handle, Result result, byte[] buf,
                               ulong bytesRequested, ulong bytesRead)
        {
            if (result == Result.Ok)
            {
                Array.Copy(buf, 0, buffer, offset + count - bytesRemaining, (int)bytesRead);
                bytesRemaining -= (int)bytesRead;
                if (bytesRemaining > 0)
                {
                    buf = new byte[bytesRemaining];
                    Async.Read(handle, out buf[0], (uint)bytesRemaining,
                               new AsyncReadCallback(AsyncRead));
                }
                else if (cback != null)
                {
                    asyncResult.SetComplete(null, count);
                    cback(asyncResult);
                }
            }
            else if (result == Result.ErrorEof)
            {
                Array.Copy(buf, 0, buffer, offset + count - bytesRemaining, (int)bytesRead);
                bytesRemaining -= (int)bytesRead;
                asyncResult.SetComplete(null, count - bytesRemaining);

                if (cback != null)
                {
                    cback(asyncResult);
                }
            }
            else if (cback != null)
            {
                Exception e = new IOException(Vfs.ResultToString(result));
                asyncResult.SetComplete(e, -1);
                cback(asyncResult);
            }
        }