- Attempt write before going overlapped in Writefile.
- Fix return codes in WriteFileEx.

diff --git a/files/file.c b/files/file.c
index ad0ee1c..2f97f55 100644
--- a/files/file.c
+++ b/files/file.c
@@ -1577,9 +1577,9 @@
 }
 
 /***********************************************************************
- *              WriteFileEx                (KERNEL32.@)
+ *              FILE_WriteFileEx                (KERNEL32.@)
  */
-BOOL WINAPI WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
+BOOL WINAPI FILE_WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
 			 LPOVERLAPPED overlapped, 
 			 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
 {
@@ -1632,10 +1632,20 @@
         ovp->next->prev = ovp;
     NtCurrentTeb()->pending_list = ovp;
 
-    SetLastError(ERROR_IO_PENDING);
+    return TRUE;
+}
 
-    /* always fail on return, either ERROR_IO_PENDING or other error */
-    return FALSE;
+/***********************************************************************
+ *              WriteFileEx                (KERNEL32.@)
+ */
+BOOL WINAPI WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
+			 LPOVERLAPPED overlapped, 
+			 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
+{
+    overlapped->Internal     = STATUS_PENDING;
+    overlapped->InternalHigh = 0;
+ 
+    return FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, lpCompletionRoutine);
 }
 
 /***********************************************************************
@@ -1666,8 +1676,40 @@
             SetLastError(ERROR_INVALID_PARAMETER);
             return FALSE;
         }
-        /* FIXME: try write immediately before starting overlapped operation */
-        return WriteFileEx(hFile, buffer, bytesToWrite, overlapped, FILE_OverlappedComplete);
+
+        /* see if we can write some data already (this shouldn't block) */
+        result = write( unix_handle, buffer, bytesToWrite );
+        close(unix_handle);
+
+        if(result<0)
+        {
+            if( (errno!=EAGAIN) && (errno!=EINTR) &&
+                ((errno != EFAULT) || IsBadReadPtr( buffer, bytesToWrite )) )
+            {
+                FILE_SetDosError();
+                return FALSE;
+            }
+            else
+                result = 0;
+        }
+        
+        /* if we read enough to keep the app happy, then return now */
+        if(result>=bytesToWrite)
+        {
+            *bytesWritten = result;
+            return TRUE;
+        }
+
+        /* at last resort, do an overlapped read */
+        overlapped->Internal     = STATUS_PENDING;
+        overlapped->InternalHigh = result;
+        
+        if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, FILE_OverlappedComplete))
+            return FALSE;
+
+        /* fail on return, with ERROR_IO_PENDING */
+        SetLastError(ERROR_IO_PENDING);
+        return FALSE;
 
     case FD_TYPE_CONSOLE:
 	TRACE("%d %s %ld %p %p\n", hFile, debugstr_an(buffer, bytesToWrite), bytesToWrite,