NTSTATUS Bus_FDO_Power ( PFDO_DEVICE_DATA Data, PIRP Irp ) { NTSTATUS status = STATUS_SUCCESS; POWER_STATE powerState; POWER_STATE_TYPE powerType; PIO_STACK_LOCATION stack; ULONG AcpiState; ACPI_STATUS AcpiStatus; SYSTEM_POWER_STATE oldPowerState; stack = IoGetCurrentIrpStackLocation (Irp); powerType = stack->Parameters.Power.Type; powerState = stack->Parameters.Power.State; if (stack->MinorFunction == IRP_MN_SET_POWER) { DPRINT("\tRequest to set %s state to %s\n", ((powerType == SystemPowerState) ? "System" : "Device"), ((powerType == SystemPowerState) ? \ DbgSystemPowerString(powerState.SystemState) :\ DbgDevicePowerString(powerState.DeviceState))); } if (powerType == SystemPowerState) { switch (powerState.SystemState) { case PowerSystemSleeping1: AcpiState = ACPI_STATE_S1; break; case PowerSystemSleeping2: AcpiState = ACPI_STATE_S2; break; case PowerSystemSleeping3: AcpiState = ACPI_STATE_S3; break; case PowerSystemHibernate: AcpiState = ACPI_STATE_S4; break; case PowerSystemShutdown: AcpiState = ACPI_STATE_S5; break; default: AcpiState = ACPI_STATE_UNKNOWN; ASSERT(FALSE); break; } oldPowerState = Data->Common.SystemPowerState; Data->Common.SystemPowerState = powerState.SystemState; AcpiStatus = acpi_suspend(AcpiState); if (!ACPI_SUCCESS(AcpiStatus)) { DPRINT1("Failed to enter sleep state %d (Status 0x%X)\n", AcpiState, AcpiStatus); Data->Common.SystemPowerState = oldPowerState; status = STATUS_UNSUCCESSFUL; } } PoStartNextPowerIrp (Irp); IoSkipCurrentIrpStackLocation(Irp); status = PoCallDriver (Data->NextLowerDriver, Irp); return status; }