Author: tfaber
Date: Sun Sep 6 17:13:48 2015
New Revision: 69061
URL:
http://svn.reactos.org/svn/reactos?rev=69061&view=rev
Log:
[NTOS:PNP]
- Handle power IRPs for the PNP root device
CORE-10117
Modified:
trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnproot…
==============================================================================
--- trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c [iso-8859-1] Sun Sep 6 17:13:48 2015
@@ -1234,6 +1234,51 @@
return Status;
}
+/*
+ * FUNCTION: Handle Power IRPs
+ * ARGUMENTS:
+ * DeviceObject = Pointer to PDO or FDO
+ * Irp = Pointer to IRP that should be handled
+ * RETURNS:
+ * Status
+ */
+static NTSTATUS NTAPI
+PnpRootPowerControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+ PIO_STACK_LOCATION IrpSp;
+ NTSTATUS Status;
+
+ DeviceExtension = DeviceObject->DeviceExtension;
+ Status = Irp->IoStatus.Status;
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+ if (DeviceExtension->Common.IsFDO)
+ {
+ ASSERT(!DeviceExtension->Common.IsFDO);
+ PoStartNextPowerIrp(Irp);
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ Status = PoCallDriver(DeviceExtension->Ldo, Irp);
+ }
+ else
+ {
+ switch (IrpSp->MinorFunction)
+ {
+ case IRP_MN_QUERY_POWER:
+ case IRP_MN_SET_POWER:
+ Status = STATUS_SUCCESS;
+ break;
+ }
+ Irp->IoStatus.Status = Status;
+ PoStartNextPowerIrp(Irp);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ return Status;
+}
+
NTSTATUS
NTAPI
PnpRootAddDevice(
@@ -1305,7 +1350,7 @@
DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;
- //DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
return STATUS_SUCCESS;
}