[PORTCLS] Don't unnecessarily wait for lower drivers to complete power IRPs. CORE-16611

Also use PoCallDriver to forward power IRPs.
This commit is contained in:
Thomas Faber 2020-02-01 13:03:37 +01:00
parent e884290d29
commit 606c912aa4
No known key found for this signature in database
GPG key ID: 076E7C3D44720826

View file

@ -221,26 +221,17 @@ PortClsPower(
// get currrent stack location
IoStack = IoGetCurrentIrpStackLocation(Irp);
if (IoStack->MinorFunction != IRP_MN_SET_POWER && IoStack->MinorFunction != IRP_MN_QUERY_POWER)
{
// just forward the request
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
// start next power irp
PoStartNextPowerIrp(Irp);
// complete request
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
// done
return Status;
}
// get device extension
DeviceExtension = (PPCLASS_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
if (IoStack->MinorFunction != IRP_MN_SET_POWER && IoStack->MinorFunction != IRP_MN_QUERY_POWER)
{
// forward unknown requests down the stack and forget
PoStartNextPowerIrp(Irp);
IoSkipCurrentIrpStackLocation(Irp);
return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
// get current request type
if (IoStack->Parameters.Power.Type == DevicePowerState)
{
@ -250,8 +241,10 @@ PortClsPower(
// nothing has changed
if (IoStack->MinorFunction == IRP_MN_QUERY_POWER)
{
// only forward query requests
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
// only forward query requests; we can forget about them
PoStartNextPowerIrp(Irp);
IoSkipCurrentIrpStackLocation(Irp);
return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
// start next power irp
@ -279,17 +272,9 @@ PortClsPower(
}
// only forward query requests
PcForwardIrpSynchronous(DeviceObject, Irp);
// start next power irp
PoStartNextPowerIrp(Irp);
// complete request
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
// done
return Status;
IoSkipCurrentIrpStackLocation(Irp);
return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
else
{
@ -371,17 +356,9 @@ PortClsPower(
DeviceExtension->SystemPowerState = IoStack->Parameters.Power.State.SystemState;
// only forward query requests
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
// start next power irp
PoStartNextPowerIrp(Irp);
// complete request
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
// done
return Status;
IoSkipCurrentIrpStackLocation(Irp);
return PoCallDriver(DeviceExtension->PrevDeviceObject, Irp);
}
}
}