[ros-diffs] [cgutman] 56087: [NTOSKRNL] - Dereference the correct device object (the one who asked for shutdown notification) instead of whatever happens to be on the top of the device stack - Fix flag issues

cgutman at svn.reactos.org cgutman at svn.reactos.org
Thu Mar 8 02:43:48 UTC 2012


Author: cgutman
Date: Thu Mar  8 02:43:47 2012
New Revision: 56087

URL: http://svn.reactos.org/svn/reactos?rev=56087&view=rev
Log:
[NTOSKRNL]
- Dereference the correct device object (the one who asked for shutdown notification) instead of whatever happens to be on the top of the device stack
- Fix flag issues

Modified:
    trunk/reactos/ntoskrnl/io/iomgr/device.c

Modified: trunk/reactos/ntoskrnl/io/iomgr/device.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/device.c?rev=56087&r1=56086&r2=56087&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/device.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/device.c [iso-8859-1] Thu Mar  8 02:43:47 2012
@@ -174,9 +174,12 @@
                 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
             }
 
+            /* Remove the flag */
+            ShutdownEntry->DeviceObject->Flags &= ~DO_SHUTDOWN_REGISTERED;
+
             /* Get rid of our reference to it */
-            ObDereferenceObject(DeviceObject);
-            
+            ObDereferenceObject(ShutdownEntry->DeviceObject);
+
             /* Free the shutdown entry and reset the event */
             ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY);
             KeClearEvent(&Event);
@@ -228,9 +231,12 @@
                 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
             }
 
+            /* Remove the flag */
+            ShutdownEntry->DeviceObject->Flags &= ~DO_SHUTDOWN_REGISTERED;
+
             /* Get rid of our reference to it */
-            ObDereferenceObject(DeviceObject);
-            
+            ObDereferenceObject(ShutdownEntry->DeviceObject);
+
             /* Free the shutdown entry and reset the event */
             ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY);
             KeClearEvent(&Event);
@@ -1485,6 +1491,9 @@
     PSHUTDOWN_ENTRY ShutdownEntry;
     PLIST_ENTRY NextEntry;
     KIRQL OldIrql;
+    
+    /* Remove the flag */
+    DeviceObject->Flags &= ~DO_SHUTDOWN_REGISTERED;
 
     /* Acquire the shutdown lock and loop the shutdown list */
     KeAcquireSpinLock(&ShutdownListLock, &OldIrql);
@@ -1543,9 +1552,6 @@
 
     /* Release the shutdown lock */
     KeReleaseSpinLock(&ShutdownListLock, OldIrql);
-
-    /* Now remove the flag */
-    DeviceObject->Flags &= ~DO_SHUTDOWN_REGISTERED;
 }
 
 /*




More information about the Ros-diffs mailing list