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>
15 #include <ndk/pofuncs.h>
20 /* PUBLIC FUNCTIONS ***********************************************************/
27 GetSystemPowerStatus(IN LPSYSTEM_POWER_STATUS PowerStatus
)
30 SYSTEM_BATTERY_STATE BattState
;
33 Status
= NtPowerInformation(SystemBatteryState
,
37 sizeof(SYSTEM_BATTERY_STATE
));
39 if (!NT_SUCCESS(Status
))
41 BaseSetLastNTError(Status
);
45 RtlZeroMemory(PowerStatus
, sizeof(SYSTEM_POWER_STATUS
));
47 PowerStatus
->BatteryLifeTime
= BATTERY_LIFE_UNKNOWN
;
48 PowerStatus
->BatteryFullLifeTime
= BATTERY_LIFE_UNKNOWN
;
49 PowerStatus
->BatteryLifePercent
= BATTERY_PERCENTAGE_UNKNOWN
;
50 PowerStatus
->ACLineStatus
= AC_LINE_ONLINE
;
52 Max
= BattState
.MaxCapacity
;
53 Current
= BattState
.RemainingCapacity
;
58 PowerStatus
->BatteryLifePercent
= (UCHAR
)((100 * Current
+ Max
/ 2) / Max
);
62 PowerStatus
->BatteryLifePercent
= 100;
65 if (PowerStatus
->BatteryLifePercent
<= 32) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_LOW
;
66 if (PowerStatus
->BatteryLifePercent
>= 67) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_HIGH
;
69 if (!BattState
.BatteryPresent
) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_NO_BATTERY
;
71 if (BattState
.Charging
) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_CHARGING
;
73 if (!(BattState
.AcOnLine
) && (BattState
.BatteryPresent
)) PowerStatus
->ACLineStatus
= AC_LINE_OFFLINE
;
75 if (BattState
.EstimatedTime
) PowerStatus
->BatteryLifeTime
= BattState
.EstimatedTime
;
85 SetSystemPowerState(IN BOOL fSuspend
,
90 Status
= NtInitiatePowerAction((fSuspend
!= FALSE
) ? PowerActionSleep
: PowerActionHibernate
,
91 (fSuspend
!= FALSE
) ? PowerSystemSleeping1
: PowerSystemHibernate
,
94 if (!NT_SUCCESS(Status
))
96 BaseSetLastNTError(Status
);
108 GetDevicePowerState(IN HANDLE hDevice
,
111 DEVICE_POWER_STATE DevicePowerState
;
114 Status
= NtGetDevicePowerState(hDevice
, &DevicePowerState
);
115 if (NT_SUCCESS(Status
))
117 *pfOn
= (DevicePowerState
== PowerDeviceUnspecified
) ||
118 (DevicePowerState
== PowerDeviceD0
);
122 BaseSetLastNTError(Status
);
131 RequestDeviceWakeup(IN HANDLE hDevice
)
135 Status
= NtRequestDeviceWakeup(hDevice
);
136 if (!NT_SUCCESS(Status
))
138 BaseSetLastNTError(Status
);
150 RequestWakeupLatency(IN LATENCY_TIME latency
)
154 Status
= NtRequestWakeupLatency(latency
);
155 if (!NT_SUCCESS(Status
))
157 BaseSetLastNTError(Status
);
169 CancelDeviceWakeupRequest(IN HANDLE hDevice
)
173 Status
= NtCancelDeviceWakeupRequest(hDevice
);
174 if (!NT_SUCCESS(Status
))
176 BaseSetLastNTError(Status
);
188 IsSystemResumeAutomatic(VOID
)
190 return (BOOL
)NtIsSystemResumeAutomatic();
198 SetMessageWaitingIndicator(IN HANDLE hMsgIndicator
,
201 /* This is the correct Windows implementation */
202 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
211 SetThreadExecutionState(EXECUTION_STATE esFlags
)
215 Status
= NtSetThreadExecutionState(esFlags
, &esFlags
);
216 if (!NT_SUCCESS(Status
))
218 BaseSetLastNTError(Status
);