[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

svn path=/trunk/; revision=55827
This commit is contained in:
Cameron Gutman 2012-02-23 01:23:30 +00:00
parent 8afc22a95d
commit a982c0c4c9
5 changed files with 53 additions and 28 deletions

View file

@ -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:

View file

@ -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:
{

View file

@ -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:
{

View file

@ -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:
{

View file

@ -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);