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;