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?... ============================================================================== --- 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;