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

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) );
}