Author: cgutman Date: Wed Feb 22 23:08:52 2012 New Revision: 55819
URL: http://svn.reactos.org/svn/reactos?rev=55819&view=rev Log: [NTOSKRNL] - Add back the reset hack of doom to circumvent broken removal code in just about every driver
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/plugplay... ============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c [iso-8859-1] Wed Feb 22 23:08:52 2012 @@ -552,38 +552,40 @@ /* Get the device node */ DeviceNode = IopGetDeviceNode(DeviceObject);
- /* Check if an FDO has been added to the stack */ - if (DeviceNode->Flags & DNF_ADDED) - { - /* 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); - } - +#if 0 + /* Remove the device node */ + Status = IopRemoveDevice(DeviceNode); + if (NT_SUCCESS(Status)) + { /* Invalidate device relations for the parent to reenumerate the device */ Status = IoSynchronousInvalidateDeviceRelations(DeviceNode->Parent->PhysicalDeviceObject, BusRelations); - - DPRINT1("Reset PDO with FDO present: 0x%x\n", Status); + 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; + + /* 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);