mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[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:
parent
8afc22a95d
commit
a982c0c4c9
5 changed files with 53 additions and 28 deletions
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
{
|
||||
|
|
|
@ -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:
|
||||
{
|
||||
|
|
|
@ -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:
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue