windows-nt/Source/XPSP1/NT/base/win32/client/power.c
2020-09-26 16:20:57 +08:00

243 lines
4.6 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
power.c
Abstract:
Stubs for unimplemented power management APIs
Author:
Steve Wood (stevewo) 18-Nov-1994
Revision History:
--*/
#include "basedll.h"
BOOL
WINAPI
GetSystemPowerStatus(
LPSYSTEM_POWER_STATUS lpStatus
)
{
SYSTEM_BATTERY_STATE BatteryState;
NTSTATUS Status;
//
// Get power policy managers Battery State
//
Status = NtPowerInformation (
SystemBatteryState,
NULL,
0,
&BatteryState,
sizeof (BatteryState)
);
if (!NT_SUCCESS(Status)) {
BaseSetLastNTError(Status);
return FALSE;
}
//
// Convert it to the legacy System Power State structure
//
RtlZeroMemory (lpStatus, sizeof(*lpStatus));
lpStatus->ACLineStatus = AC_LINE_ONLINE;
if (BatteryState.BatteryPresent && !BatteryState.AcOnLine) {
lpStatus->ACLineStatus = AC_LINE_OFFLINE;
}
if (BatteryState.Charging) {
lpStatus->BatteryFlag |= BATTERY_FLAG_CHARGING;
}
if (!BatteryState.BatteryPresent) {
lpStatus->BatteryFlag |= BATTERY_FLAG_NO_BATTERY;
}
lpStatus->BatteryLifePercent = BATTERY_PERCENTAGE_UNKNOWN;
if (BatteryState.MaxCapacity) {
if (BatteryState.RemainingCapacity > BatteryState.MaxCapacity) {
//
// Values greater than 100% should not be returned
// According to the SDK they are reserved.
//
lpStatus->BatteryLifePercent = 100;
} else {
lpStatus->BatteryLifePercent = (UCHAR)
(((BatteryState.RemainingCapacity * 100) +
(BatteryState.MaxCapacity/2)) /
BatteryState.MaxCapacity);
}
if (lpStatus->BatteryLifePercent > 66) {
lpStatus->BatteryFlag |= BATTERY_FLAG_HIGH;
}
if (lpStatus->BatteryLifePercent < 33) {
lpStatus->BatteryFlag |= BATTERY_FLAG_LOW;
}
}
lpStatus->BatteryLifeTime = BATTERY_LIFE_UNKNOWN;
lpStatus->BatteryFullLifeTime = BATTERY_LIFE_UNKNOWN;
if (BatteryState.EstimatedTime) {
lpStatus->BatteryLifeTime = BatteryState.EstimatedTime;
}
return TRUE;
}
BOOL
WINAPI
SetSystemPowerState(
BOOL fSuspend,
BOOL fForce
)
{
NTSTATUS Status;
Status = NtInitiatePowerAction (fSuspend ? PowerActionSleep : PowerActionHibernate,
fSuspend ? PowerSystemSleeping1 : PowerSystemHibernate,
fForce == TRUE ? 0 : POWER_ACTION_QUERY_ALLOWED,
FALSE);
if (!NT_SUCCESS(Status)) {
BaseSetLastNTError(Status);
return FALSE;
}
return TRUE;
}
EXECUTION_STATE
WINAPI
SetThreadExecutionState(
EXECUTION_STATE esFlags
)
{
NTSTATUS Status;
EXECUTION_STATE PreviousFlags;
Status = NtSetThreadExecutionState (esFlags, &PreviousFlags);
if (!NT_SUCCESS(Status)) {
BaseSetLastNTError(Status);
return (EXECUTION_STATE) 0;
}
return PreviousFlags;
}
BOOL
WINAPI
RequestWakeupLatency (
LATENCY_TIME latency
)
{
NTSTATUS Status;
Status = NtRequestWakeupLatency (latency);
if (!NT_SUCCESS(Status)) {
BaseSetLastNTError(Status);
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
GetDevicePowerState(
HANDLE h,
OUT BOOL *pfOn
)
{
NTSTATUS Status;
DEVICE_POWER_STATE PowerState;
Status = NtGetDevicePowerState(h, &PowerState);
if (!NT_SUCCESS(Status)) {
BaseSetLastNTError(Status);
return(FALSE);
}
if ((PowerState == PowerDeviceD0) ||
(PowerState == PowerDeviceUnspecified)) {
*pfOn = TRUE;
} else {
*pfOn = FALSE;
}
return TRUE;
}
BOOL
WINAPI
IsSystemResumeAutomatic(
VOID
)
{
return(NtIsSystemResumeAutomatic());
}
BOOL
WINAPI
RequestDeviceWakeup (
HANDLE h
)
{
NTSTATUS Status;
Status = NtRequestDeviceWakeup(h);
if (!NT_SUCCESS(Status)) {
BaseSetLastNTError(Status);
return FALSE;
} else {
return(TRUE);
}
}
BOOL
WINAPI
CancelDeviceWakeupRequest(
HANDLE h
)
{
NTSTATUS Status;
Status = NtCancelDeviceWakeupRequest(h);
if (!NT_SUCCESS(Status)) {
BaseSetLastNTError(Status);
return FALSE;
} else {
return(TRUE);
}
}
BOOL
WINAPI
SetMessageWaitingIndicator (
IN HANDLE hMsgIndicator,
IN ULONG ulMsgCount
)
{
BaseSetLastNTError(STATUS_NOT_IMPLEMENTED);
return FALSE;
}