3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: dll/win32/kernel32/misc/power.c
6 * PURPOSE: Power Management Functions
7 * PROGRAMMER: Dmitry Chapyshev <dmitry@reactos.org>
22 NtGetDevicePowerState(
24 IN PDEVICE_POWER_STATE PowerState
30 NtRequestWakeupLatency(
31 IN LATENCY_TIME latency
37 NtIsSystemResumeAutomatic(VOID
);
42 NtSetThreadExecutionState(
43 IN EXECUTION_STATE esFlags
,
44 OUT EXECUTION_STATE
*PreviousFlags
50 NtInitiatePowerAction(
51 IN POWER_ACTION SystemAction
,
52 IN SYSTEM_POWER_STATE MinSystemState
,
54 IN BOOLEAN Asynchronous
60 NtRequestDeviceWakeup(
67 NtCancelDeviceWakeupRequest(
71 /* PUBLIC FUNCTIONS ***********************************************************/
78 GetSystemPowerStatus(LPSYSTEM_POWER_STATUS PowerStatus
)
81 SYSTEM_BATTERY_STATE SysBatState
;
83 Status
= NtPowerInformation(SystemBatteryState
,
87 sizeof(SYSTEM_BATTERY_STATE
));
89 if (!NT_SUCCESS(Status
))
91 SetLastErrorByStatus(Status
);
95 RtlZeroMemory(PowerStatus
, sizeof(LPSYSTEM_POWER_STATUS
));
97 PowerStatus
->BatteryLifeTime
= BATTERY_LIFE_UNKNOWN
;
98 PowerStatus
->BatteryFullLifeTime
= BATTERY_LIFE_UNKNOWN
;
100 PowerStatus
->BatteryLifePercent
= BATTERY_PERCENTAGE_UNKNOWN
;
101 if (SysBatState
.MaxCapacity
)
103 if (SysBatState
.MaxCapacity
>= SysBatState
.RemainingCapacity
)
104 PowerStatus
->BatteryLifePercent
= (SysBatState
.RemainingCapacity
/ SysBatState
.MaxCapacity
) * 100;
106 PowerStatus
->BatteryLifePercent
= 100; /* 100% */
108 if (PowerStatus
->BatteryLifePercent
<= 32)
109 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_LOW
;
111 if (PowerStatus
->BatteryLifePercent
>= 67)
112 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_HIGH
;
115 if (!SysBatState
.BatteryPresent
)
116 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_NO_BATTERY
;
118 if (SysBatState
.Charging
)
119 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_CHARGING
;
121 if (!SysBatState
.AcOnLine
&& SysBatState
.BatteryPresent
)
122 PowerStatus
->ACLineStatus
= AC_LINE_OFFLINE
;
124 PowerStatus
->ACLineStatus
= AC_LINE_ONLINE
;
126 if (SysBatState
.EstimatedTime
)
127 PowerStatus
->BatteryLifeTime
= SysBatState
.EstimatedTime
;
136 SetSystemPowerState(BOOL fSuspend
, BOOL fForce
)
138 SYSTEM_POWER_STATE MinSystemState
= (!fSuspend
? PowerSystemHibernate
: PowerSystemSleeping1
);
139 ULONG Flags
= (!fForce
? POWER_ACTION_QUERY_ALLOWED
: 0);
142 Status
= NtInitiatePowerAction(PowerActionSleep
,
147 if (!NT_SUCCESS(Status
))
149 SetLastErrorByStatus(Status
);
161 GetDevicePowerState(HANDLE hDevice
, BOOL
*pfOn
)
163 DEVICE_POWER_STATE DevicePowerState
;
166 Status
= NtGetDevicePowerState(hDevice
, &DevicePowerState
);
168 if (NT_SUCCESS(Status
))
170 if ((DevicePowerState
!= PowerDeviceUnspecified
) &&
171 (DevicePowerState
!= PowerDeviceD0
))
179 SetLastErrorByStatus(Status
);
188 RequestDeviceWakeup(HANDLE hDevice
)
192 Status
= NtRequestDeviceWakeup(hDevice
);
194 if (!NT_SUCCESS(Status
))
196 SetLastErrorByStatus(Status
);
208 RequestWakeupLatency(LATENCY_TIME latency
)
212 Status
= NtRequestWakeupLatency(latency
);
214 if (!NT_SUCCESS(Status
))
216 SetLastErrorByStatus(Status
);
228 CancelDeviceWakeupRequest(HANDLE hDevice
)
232 Status
= NtCancelDeviceWakeupRequest(hDevice
);
234 if (!NT_SUCCESS(Status
))
236 SetLastErrorByStatus(Status
);
248 IsSystemResumeAutomatic(VOID
)
250 return NtIsSystemResumeAutomatic();
258 SetMessageWaitingIndicator(HANDLE hMsgIndicator
,
261 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
262 DPRINT1("SetMessageWaitingIndicator is UNIMPLEMENTED!\n");
271 SetThreadExecutionState(EXECUTION_STATE esFlags
)
273 EXECUTION_STATE OldFlags
;
276 Status
= NtSetThreadExecutionState(esFlags
, &OldFlags
);
278 if (!NT_SUCCESS(Status
))
280 SetLastErrorByStatus(Status
);