153 lines
4.6 KiB
C
153 lines
4.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
power.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains code to set the default power scheme and hibernation settings in Windows.
|
||
|
|
||
|
[ComputerSettings]
|
||
|
Hibernation = YES | NO - Specifies whether we want hibernation.
|
||
|
PowerScheme = Desktop | - These are the standard power schemes in Whistler.
|
||
|
Laptop |
|
||
|
Presentation |
|
||
|
AlwaysOn | Always On |
|
||
|
Minimal |
|
||
|
MaxBattery | Max Battery
|
||
|
|
||
|
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Adrian Cosma (acosma) - 1/31/2001
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
//
|
||
|
// Includes
|
||
|
//
|
||
|
|
||
|
#include "factoryp.h"
|
||
|
// For setting default power scheme
|
||
|
|
||
|
|
||
|
#define REG_KEY_WINLOGON _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon")
|
||
|
#define REG_VALUE_HIBERNATION_PREVIOUSLY_ENABLED _T("HibernationPreviouslyEnabled")
|
||
|
|
||
|
//
|
||
|
// Function implementations
|
||
|
//
|
||
|
|
||
|
|
||
|
/*
|
||
|
|
||
|
Returns: TRUE on success, FALSE if there is some failure.
|
||
|
|
||
|
*/
|
||
|
BOOL SetPowerOptions(LPSTATEDATA lpStateData)
|
||
|
{
|
||
|
LPTSTR lpszWinBOMPath = lpStateData->lpszWinBOMPath;
|
||
|
TCHAR szBuf[MAX_INF_STRING_LENGTH] = NULLSTR;
|
||
|
|
||
|
// BOOLEAN is 1 byte, bEnable has to be BOOLEAN, not BOOL (which is 4 bytes).
|
||
|
BOOLEAN bEnable;
|
||
|
UINT uiPwrPol = UINT_MAX;
|
||
|
BOOL bRet = TRUE;
|
||
|
BOOL bHiber = FALSE;
|
||
|
|
||
|
//
|
||
|
// Is Hibernation specified?
|
||
|
//
|
||
|
if ( GetPrivateProfileString( WBOM_SETTINGS_SECTION, INI_KEY_WBOM_HIBERNATION, NULLSTR, szBuf, AS(szBuf), lpszWinBOMPath) &&
|
||
|
szBuf[0]
|
||
|
)
|
||
|
{
|
||
|
if ( 0 == LSTRCMPI(szBuf, WBOM_NO) )
|
||
|
{
|
||
|
bEnable = FALSE;
|
||
|
bHiber = TRUE;
|
||
|
}
|
||
|
else if ( 0 == LSTRCMPI(szBuf, WBOM_YES) )
|
||
|
{
|
||
|
bEnable = TRUE;
|
||
|
bHiber = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
FacLogFile(0 | LOG_ERR, IDS_ERR_WINBOMVALUE, lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_HIBERNATION, szBuf);
|
||
|
bRet = FALSE;
|
||
|
}
|
||
|
if ( bHiber )
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
// Request the privilege to create a pagefile. Oddly enough this is needed
|
||
|
// to disable hibernation.
|
||
|
//
|
||
|
EnablePrivilege(SE_CREATE_PAGEFILE_NAME, TRUE);
|
||
|
|
||
|
Status = NtPowerInformation ( SystemReserveHiberFile, &bEnable, sizeof (bEnable), NULL, 0 );
|
||
|
|
||
|
if ( Status != STATUS_SUCCESS )
|
||
|
FacLogFile(0 | LOG_ERR, IDS_ERR_NTPOWERINFO, Status );
|
||
|
else
|
||
|
{
|
||
|
// Do this so winlogon doesn't decide to re-enable hibernation for us if we disabled it.
|
||
|
//
|
||
|
RegSetDword(NULL, REG_KEY_WINLOGON, REG_VALUE_HIBERNATION_PREVIOUSLY_ENABLED, 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set Power Scheme
|
||
|
//
|
||
|
if ( GetPrivateProfileString( WBOM_SETTINGS_SECTION, INI_KEY_WBOM_PWRSCHEME, NULLSTR, szBuf, AS(szBuf), lpszWinBOMPath) &&
|
||
|
szBuf[0]
|
||
|
)
|
||
|
{
|
||
|
if ( 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_DESKTOP) )
|
||
|
uiPwrPol = 0;
|
||
|
else if ( 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_LAPTOP) )
|
||
|
uiPwrPol = 1;
|
||
|
else if ( 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_PRESENTATION) )
|
||
|
uiPwrPol = 2;
|
||
|
else if ( 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_ALWAYSON) || 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_ALWAYS_ON) )
|
||
|
uiPwrPol = 3;
|
||
|
else if ( 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_MINIMAL) )
|
||
|
uiPwrPol = 4;
|
||
|
else if ( 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_MAXBATTERY) || 0 == LSTRCMPI(szBuf, INI_VAL_WBOM_PWR_MAX_BATTERY) )
|
||
|
uiPwrPol = 5;
|
||
|
|
||
|
|
||
|
// If something valid was specified set it.
|
||
|
//
|
||
|
if ( UINT_MAX != uiPwrPol )
|
||
|
{
|
||
|
if ( !SetActivePwrScheme(uiPwrPol, NULL, NULL) )
|
||
|
{
|
||
|
FacLogFile(0 | LOG_ERR, IDS_ERR_SETPWRSCHEME, GetLastError());
|
||
|
bRet = FALSE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
FacLogFile(0 | LOG_ERR, IDS_ERR_WINBOMVALUE, lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_PWRSCHEME, szBuf);
|
||
|
bRet = FALSE;
|
||
|
}
|
||
|
}
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
BOOL DisplaySetPowerOptions(LPSTATEDATA lpStateData)
|
||
|
{
|
||
|
return ( IniSettingExists(lpStateData->lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_HIBERNATION, NULL) ||
|
||
|
IniSettingExists(lpStateData->lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_PWRSCHEME, NULL) );
|
||
|
}
|