diff --git a/files/file.c b/files/file.c index 042374b2a9d435d35ae89eda59d9459e7212b562..fecfce3a203f52731568a317ccad6ce1a6da5024 100644 --- a/files/file.c +++ b/files/file.c @@ -1284,16 +1284,31 @@ static void add_timeout( struct timeval *when, int timeout ) } /*********************************************************************** - * 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 @@ static BOOL FILE_StartAsyncRead( HANDLE hFile, LPOVERLAPPED overlapped, LPVOID b */ 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 @@ static BOOL FILE_StartAsyncRead( HANDLE hFile, LPOVERLAPPED overlapped, LPVOID b if(!ovp) { TRACE("HeapAlloc Failed\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); close(fd); return FALSE; } @@ -1346,21 +1362,8 @@ static BOOL FILE_StartAsyncRead( HANDLE hFile, LPOVERLAPPED overlapped, LPVOID b 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 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead, /* 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 @@ async_end: } /*********************************************************************** - * 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 @@ static BOOL FILE_StartAsyncWrite(HANDLE hFile, LPOVERLAPPED overlapped, LPCVOID } 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 @@ static BOOL FILE_StartAsyncWrite(HANDLE hFile, LPOVERLAPPED overlapped, LPCVOID 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 @@ BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, /* 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;