Swap lpOverlapped parameters in ReadFile and WriteFile.
The InternalHigh member should contain the number of
bytes transferred.

diff --git a/files/file.c b/files/file.c
index 4870997..f2004f5 100644
--- a/files/file.c
+++ b/files/file.c
@@ -184,10 +184,16 @@
  */
 HANDLE FILE_DupUnixHandle( int fd, DWORD access )
 {
-    struct alloc_file_handle_request *req = get_req_buffer();
-    req->access  = access;
-    server_call_fd( REQ_ALLOC_FILE_HANDLE, fd );
-    return req->handle;
+    HANDLE ret;
+    SERVER_START_REQ
+    {
+        struct alloc_file_handle_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->access  = access;
+        server_call_fd( REQ_ALLOC_FILE_HANDLE, fd );
+        ret = req->handle;
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 
@@ -1163,7 +1169,7 @@
     } while (r==STATUS_USER_APC);
 
     if(lpTransferred)
-        *lpTransferred = lpOverlapped->Offset;
+        *lpTransferred = lpOverlapped->InternalHigh;
 
     SetLastError(lpOverlapped->Internal);
  
@@ -1212,17 +1218,17 @@
         goto async_end;
     }
 
-    fd = FILE_GetUnixHandle(lpOverlapped->InternalHigh, GENERIC_READ);
+    fd = FILE_GetUnixHandle(lpOverlapped->Offset, GENERIC_READ);
     if(fd<0)
     {
-        TRACE("FILE_GetUnixHandle(%ld) failed \n",lpOverlapped->InternalHigh);
+        TRACE("FILE_GetUnixHandle(%ld) failed \n",lpOverlapped->Offset);
         r = STATUS_UNSUCCESSFUL;
         goto async_end;
     }
 
     /* check to see if the data is ready (non-blocking) */
-    result = read(fd, &buffer[lpOverlapped->Offset],
-                  lpOverlapped->OffsetHigh - lpOverlapped->Offset);
+    result = read(fd, &buffer[lpOverlapped->InternalHigh],
+                  lpOverlapped->OffsetHigh - lpOverlapped->InternalHigh);
     close(fd);
 
     if ( (result<0) && ((errno == EAGAIN) || (errno == EINTR)))
@@ -1240,10 +1246,10 @@
         goto async_end;
     }
 
-    lpOverlapped->Offset += result;
-    TRACE("read %d more bytes %ld/%ld so far\n",result,lpOverlapped->Offset,lpOverlapped->OffsetHigh);
+    lpOverlapped->InternalHigh += result;
+    TRACE("read %d more bytes %ld/%ld so far\n",result,lpOverlapped->InternalHigh,lpOverlapped->OffsetHigh);
 
-    if(lpOverlapped->Offset < lpOverlapped->OffsetHigh)
+    if(lpOverlapped->InternalHigh < lpOverlapped->OffsetHigh)
         r = STATUS_PENDING;
     else
         r = STATUS_SUCCESS;
@@ -1254,9 +1260,9 @@
         || (!FILE_AsyncResult( lpOverlapped->InternalHigh, r)))
     {
         /* close the handle to the async operation */
-        if(lpOverlapped->InternalHigh)
-            CloseHandle(lpOverlapped->InternalHigh);
-        lpOverlapped->InternalHigh = 0;
+        if(lpOverlapped->Offset)
+            CloseHandle(lpOverlapped->Offset);
+        lpOverlapped->Offset = 0;
 
         NtSetEvent( lpOverlapped->hEvent, NULL );
         TRACE("set event flag\n");
@@ -1283,13 +1289,13 @@
 
         r=server_call( REQ_CREATE_ASYNC );
 
-        overlapped->InternalHigh = req->ov_handle;
+        overlapped->Offset = req->ov_handle;
     }
     SERVER_END_REQ
 
     if(!r)
     {
-        TRACE("ov=%ld IO is pending!!!\n",overlapped->InternalHigh);
+        TRACE("ov=%ld IO is pending!!!\n",overlapped->Offset);
         SetLastError(ERROR_IO_PENDING);
     }
 
@@ -1373,17 +1379,17 @@
         goto async_end;
     }
 
-    fd = FILE_GetUnixHandle(lpOverlapped->InternalHigh, GENERIC_WRITE);
+    fd = FILE_GetUnixHandle(lpOverlapped->Offset, GENERIC_WRITE);
     if(fd<0)
     {
-        ERR("FILE_GetUnixHandle(%ld) failed \n",lpOverlapped->InternalHigh);
+        ERR("FILE_GetUnixHandle(%ld) failed \n",lpOverlapped->Offset);
         r = STATUS_UNSUCCESSFUL;
         goto async_end;
     }
 
     /* write some data (non-blocking) */
-    result = write(fd, &buffer[lpOverlapped->Offset],
-                  lpOverlapped->OffsetHigh-lpOverlapped->Offset);
+    result = write(fd, &buffer[lpOverlapped->InternalHigh],
+                  lpOverlapped->OffsetHigh-lpOverlapped->InternalHigh);
     close(fd);
 
     if ( (result<0) && ((errno == EAGAIN) || (errno == EINTR)))
@@ -1399,9 +1405,9 @@
         goto async_end;
     }
 
-    lpOverlapped->Offset += result;
+    lpOverlapped->InternalHigh += result;
 
-    if(lpOverlapped->Offset < lpOverlapped->OffsetHigh)
+    if(lpOverlapped->InternalHigh < lpOverlapped->OffsetHigh)
         r = STATUS_PENDING;
     else
         r = STATUS_SUCCESS;
@@ -1409,11 +1415,11 @@
 async_end:
     lpOverlapped->Internal = r;
     if ( (r!=STATUS_PENDING)
-        || (!FILE_AsyncResult( lpOverlapped->InternalHigh, r)))
+        || (!FILE_AsyncResult( lpOverlapped->Offset, r)))
     {
         /* close the handle to the async operation */
-        CloseHandle(lpOverlapped->InternalHigh);
-        lpOverlapped->InternalHigh = 0;
+        CloseHandle(lpOverlapped->Offset);
+        lpOverlapped->Offset = 0;
 
         NtSetEvent( lpOverlapped->hEvent, NULL );
     }
@@ -1428,7 +1434,7 @@
 
     SERVER_START_REQ
     {
-        struct create_async_request *req = get_req_buffer();
+        struct create_async_request *req = server_alloc_req( sizeof(*req), 0 );
 
         req->file_handle = hFile;
         req->buffer = (LPVOID)buffer;
@@ -1439,7 +1445,7 @@
 
         r = server_call( REQ_CREATE_ASYNC );
 
-        overlapped->InternalHigh = req->ov_handle;
+        overlapped->Offset = req->ov_handle;
     }
     SERVER_END_REQ