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.
94 lines
3.2 KiB
94 lines
3.2 KiB
/* Copyright 1999 American Power Conversion, All Rights Reserved
|
|
*
|
|
* Description:
|
|
* The file implements the Hibernation funcationality. It is responsible
|
|
* for performing a hibernation of the operating system.
|
|
*
|
|
*
|
|
* Revision History:
|
|
* sberard 14May1999 initial revision.
|
|
* sberard 20May1999 modified to use the Power Management Profile Interface API
|
|
*
|
|
*/
|
|
#include "hibernate.h"
|
|
|
|
// These prototypes are needed because we do not have access to powrprof.h
|
|
BOOLEAN WINAPI IsPwrHibernateAllowed(VOID);
|
|
BOOLEAN WINAPI SetSuspendState(IN BOOLEAN bHibernate, IN BOOLEAN bForce, IN BOOLEAN bWakeupEventsDisabled);
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* HibernateSystem
|
|
*
|
|
* Description:
|
|
* This function initiates hibernation of the operating system. This is
|
|
* performed through a call to the Win32 function SetSystemPowerStae(..).
|
|
* When called hibernation is initated immediately and, if successful, the
|
|
* function will return TRUE when the system returns from hibernation.
|
|
* Otherwise, FALSE is retuned to indicate the the system did not hibernate.
|
|
*
|
|
* Parameters:
|
|
* none
|
|
*
|
|
* Returns:
|
|
* TRUE - if hibernation was initiated successfully and subsequently restored
|
|
* FALSE - if errors occur while initiating hibernation
|
|
*/
|
|
BOOL HibernateSystem() {
|
|
BOOL ret_val = FALSE;
|
|
TOKEN_PRIVILEGES tkp;
|
|
HANDLE process_token;
|
|
|
|
// get the current process token so that we can
|
|
// modify our current process privs.
|
|
//
|
|
if (OpenProcessToken(GetCurrentProcess(),
|
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &process_token)) {
|
|
|
|
// Find the local unique id for SeShutdownPrivilege
|
|
if (LookupPrivilegeValue(NULL, TEXT("SeShutdownPrivilege"),
|
|
&tkp.Privileges[0].Luid)) {
|
|
|
|
// we only want to enable one priv
|
|
tkp.PrivilegeCount = 1;
|
|
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
|
|
// now, add it all back to our current process.
|
|
if (AdjustTokenPrivileges(process_token, // do it to us
|
|
FALSE, // don't turn all privs off
|
|
&tkp, // what we want to do
|
|
0, // don't want any prev info
|
|
(PTOKEN_PRIVILEGES)NULL,
|
|
0)) {
|
|
|
|
|
|
// Check to see if hibernation is enabled
|
|
if (IsPwrHibernateAllowed() == TRUE) {
|
|
// Attempt to hibernate the system
|
|
if (SetSuspendState(TRUE, TRUE, FALSE) == TRUE) {
|
|
// Hibernation was successful, system has been restored
|
|
ret_val = TRUE;
|
|
}
|
|
else {
|
|
// There was an error attempting to hibernate the system
|
|
ret_val = FALSE;
|
|
}
|
|
}
|
|
else {
|
|
// Hibernation is not selected as the CriticalPowerAction, return an error
|
|
ret_val = FALSE;
|
|
}
|
|
}
|
|
}
|
|
CloseHandle (process_token);
|
|
}
|
|
|
|
return ret_val;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|