Implement ReadFileEx and WriteFileEx (lpOverlappedCompletion routine
is not supported yet...)
diff --git a/files/file.c b/files/file.c
index 042374b..fecfce3 100644
--- a/files/file.c
+++ b/files/file.c
@@ -1284,16 +1284,31 @@
}
/***********************************************************************
- * FILE_StartAsyncRead (INTERNAL)
- *
- * Don't need thread safety, because the list of asyncs
- * will only be modified in this thread.
+ * ReadFileEx (KERNEL32.@)
*/
-static BOOL FILE_StartAsyncRead( HANDLE hFile, LPOVERLAPPED overlapped, LPVOID buffer, DWORD count)
+BOOL WINAPI ReadFileEx(HANDLE hFile, LPVOID buffer, DWORD bytesToRead,
+ LPOVERLAPPED overlapped,
+ LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
async_private *ovp;
int fd, timeout, ret;
+ TRACE("file %d to buf %p num %ld %p func %p\n",
+ hFile, buffer, bytesToRead, overlapped, lpCompletionRoutine);
+
+ /* check that there is an overlapped struct with an event flag */
+ if ( (overlapped==NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
+ {
+ TRACE("Overlapped not specified or invalid event flag\n");
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ overlapped->Offset = 0;
+ overlapped->OffsetHigh = bytesToRead; /* FIXME: wrong */
+ overlapped->Internal = STATUS_PENDING;
+ overlapped->InternalHigh = 0;
+
/*
* Although the overlapped transfer will be done in this thread
* we still need to register the operation with the server, in
@@ -1301,7 +1316,7 @@
*/
SERVER_START_REQ(create_async)
{
- req->count = count;
+ req->count = bytesToRead;
req->type = ASYNC_TYPE_READ;
req->file_handle = hFile;
ret = SERVER_CALL();
@@ -1325,6 +1340,7 @@
if(!ovp)
{
TRACE("HeapAlloc Failed\n");
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
close(fd);
return FALSE;
}
@@ -1346,21 +1362,8 @@
SetLastError(ERROR_IO_PENDING);
- return TRUE;
-}
-
-/***********************************************************************
- * ReadFileEx (KERNEL32.@)
- */
-BOOL WINAPI ReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD numtoread,
- LPOVERLAPPED lpOverlapped,
- LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
-{
-
- FIXME("file %d to buf %p num %ld %p func %p stub\n",
- hFile, lpBuffer, numtoread, lpOverlapped, lpCompletionRoutine);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ /* always fail on return, either ERROR_IO_PENDING or other error */
+ return FALSE;
}
/***********************************************************************
@@ -1379,27 +1382,7 @@
/* this will only have impact if the overlapped structure is specified */
if ( overlapped )
- {
- /* if overlapped, check that there is an event flag */
- if ( (overlapped->hEvent == 0) ||
- (overlapped->hEvent == INVALID_HANDLE_VALUE) )
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- overlapped->Offset = 0;
- overlapped->OffsetHigh = bytesToRead;
- overlapped->Internal = STATUS_PENDING;
- overlapped->InternalHigh = 0;
-
- NtResetEvent( overlapped->hEvent, NULL );
-
- FILE_StartAsyncRead(hFile, overlapped, buffer, bytesToRead);
-
- /* always fail on return, either ERROR_IO_PENDING or other error */
- return FALSE;
- }
+ return ReadFileEx(hFile, buffer, bytesToRead, overlapped, NULL);
unix_handle = FILE_GetUnixHandle( hFile, GENERIC_READ );
if (unix_handle == -1) return FALSE;
@@ -1479,17 +1462,33 @@
}
/***********************************************************************
- * FILE_StartAsyncWrite (INTERNAL)
+ * WriteFileEx (KERNEL32.@)
*/
-static BOOL FILE_StartAsyncWrite(HANDLE hFile, LPOVERLAPPED overlapped, LPCVOID buffer,DWORD count)
+BOOL WINAPI WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
+ LPOVERLAPPED overlapped,
+ LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
- /* don't need thread safety, because the list will only be modified in this thread */
- async_private *ovp = (async_private*) HeapAlloc(GetProcessHeap(), 0, sizeof (async_private));
+ async_private *ovp;
int timeout,ret;
+ TRACE("file %d to buf %p num %ld %p func %p stub\n",
+ hFile, buffer, bytesToWrite, overlapped, lpCompletionRoutine);
+
+ if ( (overlapped == NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ overlapped->Offset = 0;
+ overlapped->OffsetHigh = bytesToWrite;
+ overlapped->Internal = STATUS_PENDING;
+ overlapped->InternalHigh = 0;
+
+ /* need to check the server to get the timeout info */
SERVER_START_REQ(create_async)
{
- req->count = count;
+ req->count = bytesToWrite;
req->type = ASYNC_TYPE_WRITE;
req->file_handle = hFile;
ret = SERVER_CALL();
@@ -1497,9 +1496,18 @@
}
SERVER_END_REQ;
if (ret)
+ {
+ TRACE("server call failed\n");
return FALSE;
+ }
- /* need to register the overlapped with the server, get a file handle and the timeout info */
+ ovp = (async_private*) HeapAlloc(GetProcessHeap(), 0, sizeof (async_private));
+ if(!ovp)
+ {
+ TRACE("HeapAlloc Failed\n");
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
ovp->lpOverlapped = overlapped;
ovp->timeout = timeout;
gettimeofday(&ovp->tv,NULL);
@@ -1523,20 +1531,8 @@
SetLastError(ERROR_IO_PENDING);
- return TRUE;
-}
-
-/***********************************************************************
- * WriteFileEx (KERNEL32.@)
- */
-BOOL WINAPI WriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD numtowrite,
- LPOVERLAPPED lpOverlapped,
- LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
-{
- FIXME("file %d to buf %p num %ld %p func %p stub\n",
- hFile, lpBuffer, numtowrite, lpOverlapped, lpCompletionRoutine);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ /* always fail on return, either ERROR_IO_PENDING or other error */
+ return FALSE;
}
/***********************************************************************
@@ -1555,26 +1551,7 @@
/* this will only have impact if the overlappd structure is specified */
if ( overlapped )
- {
- if ( (overlapped->hEvent == 0) ||
- (overlapped->hEvent == INVALID_HANDLE_VALUE) )
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- overlapped->Offset = 0;
- overlapped->OffsetHigh = bytesToWrite;
- overlapped->Internal = STATUS_PENDING;
- overlapped->InternalHigh = 0;
-
- NtResetEvent( overlapped->hEvent, NULL );
-
- FILE_StartAsyncWrite(hFile, overlapped, buffer, bytesToWrite);
-
- /* always fail on return, either ERROR_IO_PENDING or other error */
- return FALSE;
- }
+ return WriteFileEx(hFile, buffer, bytesToWrite, overlapped, NULL);
unix_handle = FILE_GetUnixHandle( hFile, GENERIC_WRITE );
if (unix_handle == -1) return FALSE;