diff --git a/reactos/drivers/hid/hidclass/pdo.c b/reactos/drivers/hid/hidclass/pdo.c index cfaadc6e9d7..1d11b28b83c 100644 --- a/reactos/drivers/hid/hidclass/pdo.c +++ b/reactos/drivers/hid/hidclass/pdo.c @@ -580,7 +580,12 @@ HidClassPDO_PnP( // // no/op // +#if 0 Status = STATUS_SUCCESS; +#else + DPRINT1("Denying removal of HID device due to IRP cancellation bugs\n"); + Status = STATUS_UNSUCCESSFUL; +#endif break; } default: diff --git a/reactos/drivers/usb/usbehci/hcd_controller.cpp b/reactos/drivers/usb/usbehci/hcd_controller.cpp index bbbf04ccd1a..50459f4f760 100644 --- a/reactos/drivers/usb/usbehci/hcd_controller.cpp +++ b/reactos/drivers/usb/usbehci/hcd_controller.cpp @@ -537,6 +537,7 @@ CHCDController::HandlePnp( case IRP_MN_QUERY_REMOVE_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: { +#if 0 // // sure // @@ -547,6 +548,12 @@ CHCDController::HandlePnp( // IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(m_NextDeviceObject, Irp); +#else + DPRINT1("Denying controller removal due to reinitialization bugs\n"); + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_UNSUCCESSFUL; +#endif } case IRP_MN_REMOVE_DEVICE: { diff --git a/reactos/drivers/usb/usbohci/hcd_controller.cpp b/reactos/drivers/usb/usbohci/hcd_controller.cpp index 4e8019334ca..a351e0c3d23 100644 --- a/reactos/drivers/usb/usbohci/hcd_controller.cpp +++ b/reactos/drivers/usb/usbohci/hcd_controller.cpp @@ -537,6 +537,7 @@ CHCDController::HandlePnp( case IRP_MN_QUERY_REMOVE_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: { +#if 0 // // sure // @@ -547,6 +548,12 @@ CHCDController::HandlePnp( // IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(m_NextDeviceObject, Irp); +#else + DPRINT1("Denying controller removal due to reinitialization bugs\n"); + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_UNSUCCESSFUL; +#endif } case IRP_MN_REMOVE_DEVICE: { diff --git a/reactos/drivers/usb/usbuhci/hcd_controller.cpp b/reactos/drivers/usb/usbuhci/hcd_controller.cpp index 4f50c53ccfb..78e242fafce 100644 --- a/reactos/drivers/usb/usbuhci/hcd_controller.cpp +++ b/reactos/drivers/usb/usbuhci/hcd_controller.cpp @@ -537,6 +537,7 @@ CHCDController::HandlePnp( case IRP_MN_QUERY_REMOVE_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: { +#if 0 // // sure // @@ -547,6 +548,12 @@ CHCDController::HandlePnp( // IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(m_NextDeviceObject, Irp); +#else + DPRINT1("Denying controller removal due to reinitialization bugs\n"); + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_UNSUCCESSFUL; +#endif } case IRP_MN_REMOVE_DEVICE: { diff --git a/reactos/ntoskrnl/io/pnpmgr/plugplay.c b/reactos/ntoskrnl/io/pnpmgr/plugplay.c index 45e7ce97d90..d427bce5d0c 100644 --- a/reactos/ntoskrnl/io/pnpmgr/plugplay.c +++ b/reactos/ntoskrnl/io/pnpmgr/plugplay.c @@ -555,38 +555,37 @@ IopResetDevice(PPLUGPLAY_CONTROL_RESET_DEVICE_DATA ResetDeviceData) ASSERT(DeviceNode->Flags & DNF_ENUMERATED); ASSERT(DeviceNode->Flags & DNF_PROCESSED); -#if 0 - /* Remove the device node */ - Status = IopRemoveDevice(DeviceNode); - if (NT_SUCCESS(Status)) + /* Check if there's already a driver loaded for this device */ + if (DeviceNode->Flags & DNF_ADDED) { - /* 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 */ - DeviceNode->Flags &= ~DNF_DISABLED; - - /* 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); + /* 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("A new driver has been loaded for '%wZ' (FDO above removed)\n", &DeviceNode->InstancePath); + } + else + { + /* A driver has already been loaded for this device */ + DPRINT1("A reboot is required for the current driver for '%wZ' to be replaced\n", &DeviceNode->InstancePath); + } } else { - /* This device needs a driver */ - DPRINT1("A reboot is required for the new driver for '%wZ' to load\n", &DeviceInstance); + /* FIXME: What if the device really is disabled? */ + DeviceNode->Flags &= ~DNF_DISABLED; + + /* 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("A new driver will be loaded for '%wZ' (no FDO above)\n", &DeviceNode->InstancePath); + } } ObDereferenceObject(DeviceObject);