[ros-diffs] [mjmartin] 41314: - IopUnloadDriver: Only add the DOE_UNLOAD_PENDING to the Device's DeviceExtensions Flags and check for attached devices and reference counts if the DriverObject->DriverUnload is valid. Verified on XP. - IopLoadUnloadDriver: Add a check to verify that ImagePath.Buffer is non null before freeing it.

mjmartin at svn.reactos.org mjmartin at svn.reactos.org
Sun Jun 7 03:18:16 CEST 2009


Author: mjmartin
Date: Sun Jun  7 05:18:15 2009
New Revision: 41314

URL: http://svn.reactos.org/svn/reactos?rev=41314&view=rev
Log:
- IopUnloadDriver: Only add the DOE_UNLOAD_PENDING to the Device's DeviceExtensions Flags and check for attached devices and reference counts if the DriverObject->DriverUnload is valid. Verified on XP.
- IopLoadUnloadDriver: Add a check to verify that ImagePath.Buffer is non null before freeing it. 

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

Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c?rev=41314&r1=41313&r2=41314&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/driver.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/driver.c [iso-8859-1] Sun Jun  7 05:18:15 2009
@@ -1083,35 +1083,6 @@
 
    ExFreePool(ImagePath.Buffer);
 
-   /* Loop through each device object of the driver
-      and set DOE_UNLOAD_PENDING flag */
-   DeviceObject = DriverObject->DeviceObject;
-   while (DeviceObject)
-   {
-      /* Set the unload pending flag for the device */
-      DeviceExtension = IoGetDevObjExtension(DeviceObject);
-      DeviceExtension->ExtensionFlags |= DOE_UNLOAD_PENDING;
-
-      /* Make sure there are no attached devices or no reference counts */
-      if ((DeviceObject->ReferenceCount) || (DeviceObject->AttachedDevice))
-      {
-         /* Not safe to unload */
-         DPRINT1("Drivers device object is referenced or has attached devices\n");
-
-         SafeToUnload = FALSE;
-      }
-
-      DeviceObject = DeviceObject->NextDevice;
-   }
-
-   /* If not safe to unload, then return success */
-   if (!SafeToUnload)
-   {
-      ObDereferenceObject(DriverObject);
-      return STATUS_SUCCESS;
-   }
-
-
    /*
     * Unload the module and release the references to the device object
     */
@@ -1119,6 +1090,34 @@
     /* Call the load/unload routine, depending on current process */
    if (DriverObject->DriverUnload && DriverObject->DriverSection)
    {
+      /* Loop through each device object of the driver
+         and set DOE_UNLOAD_PENDING flag */
+      DeviceObject = DriverObject->DeviceObject;
+      while (DeviceObject)
+      {
+         /* Set the unload pending flag for the device */
+         DeviceExtension = IoGetDevObjExtension(DeviceObject);
+         DeviceExtension->ExtensionFlags |= DOE_UNLOAD_PENDING;
+
+         /* Make sure there are no attached devices or no reference counts */
+         if ((DeviceObject->ReferenceCount) || (DeviceObject->AttachedDevice))
+         {
+            /* Not safe to unload */
+            DPRINT1("Drivers device object is referenced or has attached devices\n");
+
+            SafeToUnload = FALSE;
+         }
+
+         DeviceObject = DeviceObject->NextDevice;
+      }
+
+      /* If not safe to unload, then return success */
+      if (!SafeToUnload)
+	  {
+         ObDereferenceObject(DriverObject);
+         return STATUS_SUCCESS;
+	  }
+
       /* Set the unload invoked flag */
       DriverObject->Flags |= DRVO_UNLOAD_INVOKED;
 
@@ -1681,7 +1680,8 @@
    if (!NT_SUCCESS(Status))
    {
       DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
-      ExFreePool(ImagePath.Buffer);
+      if (ImagePath.Buffer)
+         ExFreePool(ImagePath.Buffer);
       LoadParams->Status = Status;
       (VOID)KeSetEvent(&LoadParams->Event, 0, FALSE);
       return;



More information about the Ros-diffs mailing list