243 lines
4.6 KiB
C
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;
|
||
|
}
|
||
|
|