From 2f22a7d7f8ea8ac279fe75ff0f9323cb20037a08 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 18:17:51 +0000 Subject: [PATCH] [NTOSKRNL] - 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 | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index 0863f58907b..e3695e9d2fb 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -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)) {