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/plugpla…
==============================================================================
--- 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);