3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: dll/win32/kernel32/client/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
));
38 if (!NT_SUCCESS(Status
))
40 BaseSetLastNTError(Status
);
44 RtlZeroMemory(PowerStatus
, sizeof(SYSTEM_POWER_STATUS
));
46 PowerStatus
->BatteryLifeTime
= BATTERY_LIFE_UNKNOWN
;
47 PowerStatus
->BatteryFullLifeTime
= BATTERY_LIFE_UNKNOWN
;
48 PowerStatus
->BatteryLifePercent
= BATTERY_PERCENTAGE_UNKNOWN
;
49 PowerStatus
->ACLineStatus
= AC_LINE_ONLINE
;
51 Max
= BattState
.MaxCapacity
;
52 Current
= BattState
.RemainingCapacity
;
57 PowerStatus
->BatteryLifePercent
= (UCHAR
)((100 * Current
+ Max
/ 2) / Max
);
61 PowerStatus
->BatteryLifePercent
= 100;
64 if (PowerStatus
->BatteryLifePercent
<= 32)
65 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_LOW
;
67 if (PowerStatus
->BatteryLifePercent
>= 67)
68 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_HIGH
;
71 if (!BattState
.BatteryPresent
)
72 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_NO_BATTERY
;
74 if (BattState
.Charging
)
75 PowerStatus
->BatteryFlag
|= BATTERY_FLAG_CHARGING
;
77 if (!(BattState
.AcOnLine
) && (BattState
.BatteryPresent
))
78 PowerStatus
->ACLineStatus
= AC_LINE_OFFLINE
;
80 if (BattState
.EstimatedTime
)
81 PowerStatus
->BatteryLifeTime
= BattState
.EstimatedTime
;
91 SetSystemPowerState(IN BOOL fSuspend
,
96 Status
= NtInitiatePowerAction((fSuspend
!= FALSE
) ? PowerActionSleep
: PowerActionHibernate
,
97 (fSuspend
!= FALSE
) ? PowerSystemSleeping1
: PowerSystemHibernate
,
100 if (!NT_SUCCESS(Status
))
102 BaseSetLastNTError(Status
);
114 GetDevicePowerState(IN HANDLE hDevice
,
117 DEVICE_POWER_STATE DevicePowerState
;
120 Status
= NtGetDevicePowerState(hDevice
, &DevicePowerState
);
121 if (NT_SUCCESS(Status
))
123 *pfOn
= (DevicePowerState
== PowerDeviceUnspecified
) ||
124 (DevicePowerState
== PowerDeviceD0
);
128 BaseSetLastNTError(Status
);
137 RequestDeviceWakeup(IN HANDLE hDevice
)
141 Status
= NtRequestDeviceWakeup(hDevice
);
142 if (!NT_SUCCESS(Status
))
144 BaseSetLastNTError(Status
);
156 RequestWakeupLatency(IN LATENCY_TIME latency
)
160 Status
= NtRequestWakeupLatency(latency
);
161 if (!NT_SUCCESS(Status
))
163 BaseSetLastNTError(Status
);
175 CancelDeviceWakeupRequest(IN HANDLE hDevice
)
179 Status
= NtCancelDeviceWakeupRequest(hDevice
);
180 if (!NT_SUCCESS(Status
))
182 BaseSetLastNTError(Status
);
194 IsSystemResumeAutomatic(VOID
)
196 return (BOOL
)NtIsSystemResumeAutomatic();
204 SetMessageWaitingIndicator(IN HANDLE hMsgIndicator
,
207 /* This is the correct Windows implementation */
208 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
217 SetThreadExecutionState(EXECUTION_STATE esFlags
)
221 Status
= NtSetThreadExecutionState(esFlags
, &esFlags
);
222 if (!NT_SUCCESS(Status
))
224 BaseSetLastNTError(Status
);