- Fixed two really nasty bugs in I/O completion:
  - The user buffer wasn't written for incomplete I/O (warning levels) for METHOD_BUFFERED
  - Incomplete I/Os (warning levels) took a completely wrong path for completion.
Modified: trunk/reactos/ntoskrnl/io/irp.c

Modified: trunk/reactos/ntoskrnl/io/irp.c
--- trunk/reactos/ntoskrnl/io/irp.c	2005-11-09 03:02:33 UTC (rev 19086)
+++ trunk/reactos/ntoskrnl/io/irp.c	2005-11-09 04:29:46 UTC (rev 19087)
@@ -159,7 +159,9 @@
     if (Irp->Flags & IRP_BUFFERED_IO)
     {
         /* Check if we have an input buffer and if we suceeded */
-        if (Irp->Flags & IRP_INPUT_OPERATION && NT_SUCCESS(Irp->IoStatus.Status))
+        if ((Irp->Flags & IRP_INPUT_OPERATION) && 
+            (Irp->IoStatus.Status != STATUS_VERIFY_REQUIRED) &&
+            !(NT_ERROR(Irp->IoStatus.Status)))
         {
             /* Copy the buffer back to the user */
             RtlCopyMemory(Irp->UserBuffer,
@@ -191,10 +193,10 @@
 
 #if 1
     /* Check for Success but allow failure for Async IRPs */
-    if (NT_SUCCESS(Irp->IoStatus.Status) ||
-        (Irp->PendingReturned &&
-        !SyncIrp &&
-        (FileObject == NULL || FileObject->Flags & FO_SYNCHRONOUS_IO)))
+    if (!(NT_ERROR(Irp->IoStatus.Status)) ||
+        ((NT_ERROR(Irp->IoStatus.Status)) &&
+        (Irp->PendingReturned) && !(SyncIrp) &&
+        ((FileObject == NULL) || (FileObject->Flags & FO_SYNCHRONOUS_IO))))
     {
         _SEH_TRY
         {