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>
18 /* PUBLIC FUNCTIONS ***********************************************************/
25 GetSystemPowerStatus(IN LPSYSTEM_POWER_STATUS PowerStatus
)
28 SYSTEM_BATTERY_STATE BattState
;
31 Status
= NtPowerInformation(SystemBatteryState
,
35 sizeof(SYSTEM_BATTERY_STATE
));
37 if (!NT_SUCCESS(Status
))
39 BaseSetLastNTError(Status
);
43 RtlZeroMemory(PowerStatus
, sizeof(LPSYSTEM_POWER_STATUS
));
45 PowerStatus
->BatteryLifeTime
= BATTERY_LIFE_UNKNOWN
;
46 PowerStatus
->BatteryFullLifeTime
= BATTERY_LIFE_UNKNOWN
;
47 PowerStatus
->BatteryLifePercent
= BATTERY_PERCENTAGE_UNKNOWN
;
48 PowerStatus
->ACLineStatus
= AC_LINE_ONLINE
;
50 Max
= BattState
.MaxCapacity
;
51 Current
= BattState
.RemainingCapacity
;
56 PowerStatus
->BatteryLifePercent
= (100 * Current
+ Max
/ 2) / Max
;
60 PowerStatus
->BatteryLifePercent
= 100;
63 if (PowerStatus
->BatteryLifePercent
<= 32) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_LOW
;
64 if (PowerStatus
->BatteryLifePercent
>= 67) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_HIGH
;
67 if (!BattState
.BatteryPresent
) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_NO_BATTERY
;
69 if (BattState
.Charging
) PowerStatus
->BatteryFlag
|= BATTERY_FLAG_CHARGING
;
71 if (!(BattState
.AcOnLine
) && (BattState
.BatteryPresent
)) PowerStatus
->ACLineStatus
= AC_LINE_OFFLINE
;
73 if (BattState
.EstimatedTime
) PowerStatus
->BatteryLifeTime
= BattState
.EstimatedTime
;
83 SetSystemPowerState(IN BOOL fSuspend
,
88 Status
= NtInitiatePowerAction(PowerActionSleep
,
90 PowerSystemSleeping1
: PowerSystemHibernate
,
93 if (!NT_SUCCESS(Status
))
95 BaseSetLastNTError(Status
);
107 GetDevicePowerState(IN HANDLE hDevice
,
110 DEVICE_POWER_STATE DevicePowerState
;
113 Status
= NtGetDevicePowerState(hDevice
, &DevicePowerState
);
114 if (NT_SUCCESS(Status
))
116 *pfOn
= (DevicePowerState
== PowerDeviceUnspecified
) ||
117 (DevicePowerState
== PowerDeviceD0
);
121 BaseSetLastNTError(Status
);
130 RequestDeviceWakeup(IN HANDLE hDevice
)
134 Status
= NtRequestDeviceWakeup(hDevice
);
135 if (!NT_SUCCESS(Status
))
137 BaseSetLastNTError(Status
);
149 RequestWakeupLatency(IN LATENCY_TIME latency
)
153 Status
= NtRequestWakeupLatency(latency
);
154 if (!NT_SUCCESS(Status
))
156 BaseSetLastNTError(Status
);
168 CancelDeviceWakeupRequest(IN HANDLE hDevice
)
172 Status
= NtCancelDeviceWakeupRequest(hDevice
);
173 if (!NT_SUCCESS(Status
))
175 BaseSetLastNTError(Status
);
187 IsSystemResumeAutomatic(VOID
)
189 return (BOOL
)NtIsSystemResumeAutomatic();
197 SetMessageWaitingIndicator(IN HANDLE hMsgIndicator
,
200 /* This is the correct Windows implementation */
201 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
210 SetThreadExecutionState(EXECUTION_STATE esFlags
)
214 Status
= NtSetThreadExecutionState(esFlags
, &esFlags
);
215 if (!NT_SUCCESS(Status
))
217 BaseSetLastNTError(Status
);