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