From 86ebeb35cc3558a1b52a288a28e74d82b9adcbe9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 22 Feb 2012 23:08:52 +0000 Subject: [PATCH] [NTOSKRNL] - Add back the reset hack of doom to circumvent broken removal code in just about every driver svn path=/trunk/; revision=55819 --- reactos/ntoskrnl/io/pnpmgr/plugplay.c | 52 ++++++++++++++------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/plugplay.c b/reactos/ntoskrnl/io/pnpmgr/plugplay.c index b3ead8bb295..b7d6520909f 100644 --- a/reactos/ntoskrnl/io/pnpmgr/plugplay.c +++ b/reactos/ntoskrnl/io/pnpmgr/plugplay.c @@ -552,38 +552,40 @@ IopResetDevice(PPLUGPLAY_CONTROL_RESET_DEVICE_DATA ResetDeviceData) /* Get the device node */ DeviceNode = IopGetDeviceNode(DeviceObject); - /* Check if an FDO has been added to the stack */ - if (DeviceNode->Flags & DNF_ADDED) +#if 0 + /* Remove the device node */ + Status = IopRemoveDevice(DeviceNode); + if (NT_SUCCESS(Status)) { - /* Remove the device node */ - Status = IopRemoveDevice(DeviceNode); - if (!NT_SUCCESS(Status)) - { - DPRINT1("WARNING: Ignoring failed IopRemoveDevice() for %wZ (likely a driver bug)\n", &DeviceNode->InstancePath); - } - /* Invalidate device relations for the parent to reenumerate the device */ Status = IoSynchronousInvalidateDeviceRelations(DeviceNode->Parent->PhysicalDeviceObject, BusRelations); + DPRINT1("A new driver has been loaded for '%wZ'\n", &DeviceInstance); + } +#else + /* FIXME: We might clear some important flags */ + ASSERT(DeviceNode->Flags & DNF_ENUMERATED); + ASSERT(DeviceNode->Flags & DNF_PROCESSED); + DeviceNode->Flags = DNF_ENUMERATED | DNF_PROCESSED; - DPRINT1("Reset PDO with FDO present: 0x%x\n", Status); + /* Load service data from the registry */ + Status = IopActionConfigureChildServices(DeviceNode, DeviceNode->Parent); + + if (NT_SUCCESS(Status)) + { + /* Start the service and begin PnP initialization of the device again */ + Status = IopActionInitChildServices(DeviceNode, DeviceNode->Parent); + DPRINT1("HACK: A new driver has been loaded for '%wZ' WITHOUT removing the old one\n", &DeviceInstance); + } +#endif + else if (DeviceNode->Flags & DNF_ADDED) + { + /* A driver has already been loaded for this device */ + DPRINT1("A reboot is required for the current driver for '%wZ' to be replaced\n", &DeviceInstance); } else { - /* FIXME: We might clear some important flags */ - ASSERT(DeviceNode->Flags & DNF_ENUMERATED); - ASSERT(DeviceNode->Flags & DNF_PROCESSED); - DeviceNode->Flags = DNF_ENUMERATED | DNF_PROCESSED; - - /* Load service data from the registry */ - Status = IopActionConfigureChildServices(DeviceNode, DeviceNode->Parent); - - if (NT_SUCCESS(Status)) - { - /* Start the service and begin PnP initialization of the device again */ - Status = IopActionInitChildServices(DeviceNode, DeviceNode->Parent); - } - - DPRINT1("Reset PDO with no FDO present: 0x%x\n", Status); + /* This device needs a driver */ + DPRINT1("A reboot is required for the new driver for '%wZ' to load\n", &DeviceInstance); } ObDereferenceObject(DeviceObject);