Author: cgutman
Date: Thu Feb 23 01:23:30 2012
New Revision: 55827
URL:
http://svn.reactos.org/svn/reactos?rev=55827&view=rev
Log:
[NTOSKRNL]
- Reenable and fix the correct reset code
[HIDCLASS]
- Disable removal of PDOs due to IRP cancellation issues
[USBEHCI][USBOHCI][USBUHCI]
- Disable removal of FDOs due to reinitialization issues
Modified:
trunk/reactos/drivers/hid/hidclass/pdo.c
trunk/reactos/drivers/usb/usbehci/hcd_controller.cpp
trunk/reactos/drivers/usb/usbohci/hcd_controller.cpp
trunk/reactos/drivers/usb/usbuhci/hcd_controller.cpp
trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c
Modified: trunk/reactos/drivers/hid/hidclass/pdo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/hid/hidclass/pdo.c…
==============================================================================
--- trunk/reactos/drivers/hid/hidclass/pdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/hid/hidclass/pdo.c [iso-8859-1] Thu Feb 23 01:23:30 2012
@@ -580,7 +580,12 @@
//
// 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:
Modified: trunk/reactos/drivers/usb/usbehci/hcd_controller.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/hcd_co…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/hcd_controller.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/hcd_controller.cpp [iso-8859-1] Thu Feb 23 01:23:30
2012
@@ -537,6 +537,7 @@
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
{
+#if 0
//
// sure
//
@@ -547,6 +548,12 @@
//
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:
{
Modified: trunk/reactos/drivers/usb/usbohci/hcd_controller.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbohci/hcd_co…
==============================================================================
--- trunk/reactos/drivers/usb/usbohci/hcd_controller.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbohci/hcd_controller.cpp [iso-8859-1] Thu Feb 23 01:23:30
2012
@@ -537,6 +537,7 @@
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
{
+#if 0
//
// sure
//
@@ -547,6 +548,12 @@
//
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:
{
Modified: trunk/reactos/drivers/usb/usbuhci/hcd_controller.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbuhci/hcd_co…
==============================================================================
--- trunk/reactos/drivers/usb/usbuhci/hcd_controller.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbuhci/hcd_controller.cpp [iso-8859-1] Thu Feb 23 01:23:30
2012
@@ -537,6 +537,7 @@
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
{
+#if 0
//
// sure
//
@@ -547,6 +548,12 @@
//
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:
{
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] Thu Feb 23 01:23:30 2012
@@ -555,38 +555,37 @@
ASSERT(DeviceNode->Flags & DNF_ENUMERATED);
ASSERT(DeviceNode->Flags & DNF_PROCESSED);
-#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("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);
+ /* Check if there's already a driver loaded for this device */
+ if (DeviceNode->Flags & DNF_ADDED)
+ {
+ /* 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);