diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index e73f989bd7c..34f6acf7946 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -364,6 +364,13 @@ IopUnloadDevice(IN PDEVICE_OBJECT DeviceObject) PDEVICE_NODE DeviceNode; BOOLEAN SafeToUnload = TRUE; + /* We can't unload unless there's an unload handler */ + if (!DriverObject->DriverUnload) + { + DPRINT1("No DriverUnload function! '%wZ' will not be unloaded!\n", &DriverObject->DriverName); + return; + } + /* Check if removal is pending */ ThisExtension = IoGetDevObjExtension(DeviceObject); if (ThisExtension->ExtensionFlags & DOE_REMOVE_PENDING) @@ -463,11 +470,13 @@ IopUnloadDevice(IN PDEVICE_OBJECT DeviceObject) DeviceObject = DeviceObject->NextDevice; } + DPRINT1("Unloading driver '%wZ' (automatic)\n", &DriverObject->DriverName); + /* Set the unload invoked flag */ DriverObject->Flags |= DRVO_UNLOAD_INVOKED; /* Unload it */ - if (DriverObject->DriverUnload) DriverObject->DriverUnload(DriverObject); + DriverObject->DriverUnload(DriverObject); /* Make object temporary so it can be deleted */ ObMakeTemporaryObject(DriverObject); diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index cf0713a8df8..41300a60060 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -58,6 +58,8 @@ IopDeleteDriver(IN PVOID ObjectBody) PIO_CLIENT_EXTENSION DriverExtension, NextDriverExtension; PAGED_CODE(); + DPRINT1("Deleting driver object '%wZ'\n", &DriverObject->DriverName); + /* Get the extension and loop them */ DriverExtension = IoGetDrvObjExtension(DriverObject)-> ClientDriverExtension; @@ -1284,6 +1286,8 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) return STATUS_SUCCESS; } + DPRINT1("Unloading driver '%wZ' (manual)\n", &DriverObject->DriverName); + /* Set the unload invoked flag */ DriverObject->Flags |= DRVO_UNLOAD_INVOKED; @@ -1323,6 +1327,8 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) } else { + DPRINT1("No DriverUnload function! '%wZ' will not be unloaded!\n", &DriverObject->DriverName); + /* Dereference one time (refd inside this function) */ ObDereferenceObject(DriverObject);