From 606c912aa45b84e346de14181e7fdd433d9db667 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 1 Feb 2020 13:03:37 +0100 Subject: [PATCH] [PORTCLS] Don't unnecessarily wait for lower drivers to complete power IRPs. CORE-16611 Also use PoCallDriver to forward power IRPs. --- drivers/wdm/audio/backpln/portcls/irp.cpp | 55 +++++++---------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/drivers/wdm/audio/backpln/portcls/irp.cpp b/drivers/wdm/audio/backpln/portcls/irp.cpp index aab59ca31fc..c1708c416c6 100644 --- a/drivers/wdm/audio/backpln/portcls/irp.cpp +++ b/drivers/wdm/audio/backpln/portcls/irp.cpp @@ -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); } } }