[NTOSKRNL]
authorCameron Gutman <aicommander@gmail.com>
Sun, 4 Apr 2010 18:17:51 +0000 (18:17 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sun, 4 Apr 2010 18:17:51 +0000 (18:17 +0000)
- Fix a case where we miss copying back the IO_STATUS_BLOCK into the UserIosb buffer
- Fixes the registry corruption caused when PnP wrote an invalid resource list (passed back via UserIosb->Information) to the registry
- Hopefully this also fixes a few other nasty bugs in other areas related to this issue

svn path=/trunk/; revision=46719

reactos/ntoskrnl/io/iomgr/irp.c

index 0863f58..e3695e9 100644 (file)
@@ -469,9 +469,6 @@ IopCompleteRequest(IN PKAPC Apc,
             /* So we did return with a synch operation, was it the IRP? */
             if (Irp->Flags & IRP_SYNCHRONOUS_API)
             {
-                /* Yes, this IRP was synchronous, so return the I/O Status */
-                *Irp->UserIosb = Irp->IoStatus;
-
                 /* Now check if the user gave an event */
                 if (Irp->UserEvent)
                 {
@@ -495,6 +492,22 @@ IopCompleteRequest(IN PKAPC Apc,
             }
         }
 
+        /* Check if we have an associated user IOSB */
+        if (Irp->UserIosb)
+        {
+            /* We do, so let's give them the final status */
+            _SEH2_TRY
+            {
+               /*  Save the IOSB Information */
+               *Irp->UserIosb = Irp->IoStatus;
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+               /* Ignore any error */
+            }
+            _SEH2_END;
+        }
+
         /* Now that we got here, we do this for incomplete I/Os as well */
         if ((FileObject) && !(Irp->Flags & IRP_CREATE_OPERATION))
         {