mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.6 KiB
153 lines
4.6 KiB
/*++
|
|
|
|
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) );
|
|
}
|