247 lines
5.4 KiB
C
247 lines
5.4 KiB
C
|
/*****************************************************************
|
||
|
*
|
||
|
* Copyright(c) Microsoft Corp., 1988-1999
|
||
|
*
|
||
|
*****************************************************************/
|
||
|
#include <stdio.h>
|
||
|
#include <process.h>
|
||
|
#include <setjmp.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <time.h>
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include <powrprof.h>
|
||
|
|
||
|
/*****************************************************************
|
||
|
*
|
||
|
* Globals
|
||
|
*
|
||
|
*****************************************************************/
|
||
|
BOOLEAN Enable = FALSE;
|
||
|
BOOLEAN Verbose = FALSE;
|
||
|
BOOLEAN HiberStatus = FALSE;
|
||
|
|
||
|
/*
|
||
|
* PrintHelp
|
||
|
*
|
||
|
* DESCRIPTION: This routine prints the help message
|
||
|
*
|
||
|
* RETURNS: VOID
|
||
|
*
|
||
|
*/
|
||
|
VOID
|
||
|
PrintHelp()
|
||
|
{
|
||
|
printf ("Enables/Disables Hibernation File\n\n");
|
||
|
printf ("EHIB [/e | /d] [/v] [/s]\n\n");
|
||
|
printf ("\t/e\tEnable Hibernation File\n");
|
||
|
printf ("\t/d\tDisable Hibernation File\n");
|
||
|
printf ("\t/s\tPrint Current Hibernate File Status\n");
|
||
|
printf ("\t/v\tVerbose Mode On\n\n");
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* ParseArgs
|
||
|
*
|
||
|
* Description:
|
||
|
* This routine parses the input arguments and validates the
|
||
|
* command line paramters
|
||
|
*
|
||
|
* Returns:
|
||
|
* TRUE if valid command line usage/syntax
|
||
|
* FALSE if invalid command line usage/syntax
|
||
|
*
|
||
|
*/
|
||
|
BOOLEAN
|
||
|
ParseArgs(argc, argv)
|
||
|
int argc;
|
||
|
char *argv[];
|
||
|
{
|
||
|
int ii;
|
||
|
BOOLEAN ValidArgs;
|
||
|
|
||
|
//
|
||
|
// Assume failure
|
||
|
//
|
||
|
ValidArgs = FALSE;
|
||
|
|
||
|
if (argc < 2) {
|
||
|
PrintHelp();
|
||
|
|
||
|
} else {
|
||
|
for (ii=1; ii<argc; ii++) {
|
||
|
if (!strcmp(argv[ii], "/e") || !strcmp(argv[ii], "-e")) {
|
||
|
Enable = TRUE;
|
||
|
ValidArgs = TRUE;
|
||
|
|
||
|
} else if (!strcmp(argv[ii], "/d") || !strcmp(argv[ii], "-d")) {
|
||
|
Enable = FALSE;
|
||
|
ValidArgs = TRUE;
|
||
|
|
||
|
} else if (!strcmp(argv[ii], "/v") || !strcmp(argv[ii], "-v")) {
|
||
|
Verbose = TRUE;
|
||
|
|
||
|
} else if (!strcmp(argv[1], "/s") || !strcmp(argv[1], "-s")) {
|
||
|
HiberStatus = TRUE;
|
||
|
ValidArgs = TRUE;
|
||
|
|
||
|
} else {
|
||
|
ValidArgs = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!ValidArgs) {
|
||
|
PrintHelp();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(ValidArgs);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* UpgradePermissions
|
||
|
*
|
||
|
* Description:
|
||
|
* This routine promotes the user permissions in order to allocate
|
||
|
* & deallocate the hibernation file.
|
||
|
*
|
||
|
* Returns:
|
||
|
* VOID
|
||
|
*/
|
||
|
VOID
|
||
|
UpgradePermissions()
|
||
|
{
|
||
|
HANDLE hToken;
|
||
|
TOKEN_PRIVILEGES tkp;
|
||
|
|
||
|
OpenProcessToken (
|
||
|
GetCurrentProcess(),
|
||
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
||
|
&hToken
|
||
|
);
|
||
|
|
||
|
LookupPrivilegeValue (
|
||
|
NULL,
|
||
|
SE_CREATE_PAGEFILE_NAME,
|
||
|
&tkp.Privileges[0].Luid
|
||
|
);
|
||
|
|
||
|
tkp.PrivilegeCount = 1;
|
||
|
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
||
|
|
||
|
AdjustTokenPrivileges (
|
||
|
hToken,
|
||
|
FALSE,
|
||
|
&tkp,
|
||
|
0,
|
||
|
NULL,
|
||
|
0
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* HiberFile
|
||
|
*
|
||
|
* Description:
|
||
|
* This routine allocated/deallocates the hiberfile and prints the appropriate errors messages
|
||
|
*
|
||
|
* Returns:
|
||
|
* TRUE if successful
|
||
|
* FALSE if not successful
|
||
|
*
|
||
|
*/
|
||
|
BOOLEAN
|
||
|
HiberFile()
|
||
|
{
|
||
|
BOOLEAN RetStatus;
|
||
|
NTSTATUS Status;
|
||
|
SYSTEM_POWER_CAPABILITIES SysPwrCapabilities;
|
||
|
|
||
|
//
|
||
|
// Assume Failure
|
||
|
//
|
||
|
RetStatus = FALSE;
|
||
|
|
||
|
if (GetPwrCapabilities(&SysPwrCapabilities)) {
|
||
|
if (!SysPwrCapabilities.SystemS4) {
|
||
|
printf("System does not support S4");
|
||
|
|
||
|
} else if (HiberStatus) {
|
||
|
if (SysPwrCapabilities.HiberFilePresent) {
|
||
|
printf ("Reserved Hibernation File Enabled\n");
|
||
|
} else {
|
||
|
printf ("Reserved Hibernation File Disabled\n");
|
||
|
}
|
||
|
|
||
|
} else if (Verbose && Enable && SysPwrCapabilities.HiberFilePresent) {
|
||
|
printf ("Reserved Hibernation File Enabled\n");
|
||
|
RetStatus = TRUE;
|
||
|
|
||
|
} else if (Verbose && !Enable && !SysPwrCapabilities.HiberFilePresent) {
|
||
|
printf ("Reserved Hibernation File Disabled\n");
|
||
|
RetStatus = TRUE;
|
||
|
|
||
|
} else {
|
||
|
Status = NtPowerInformation (
|
||
|
SystemReserveHiberFile,
|
||
|
&Enable,
|
||
|
sizeof (Enable),
|
||
|
NULL,
|
||
|
0
|
||
|
);
|
||
|
|
||
|
if (NT_SUCCESS(Status)) {
|
||
|
if (Verbose && Enable) {
|
||
|
printf ("Reserved Hibernation File Enabled\n");
|
||
|
} else if (Verbose) {
|
||
|
printf ("Reserved Hibernation File Disabled\n");
|
||
|
}
|
||
|
|
||
|
RetStatus = TRUE;
|
||
|
|
||
|
} else {
|
||
|
printf ("Error allocating/deallocating Hibernation file. Status = %x\n", Status);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(RetStatus);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* main
|
||
|
*
|
||
|
* Description:
|
||
|
* This program allocates and deallocates the reserved hibernation file
|
||
|
*
|
||
|
*/
|
||
|
int __cdecl
|
||
|
main (argc, argv)
|
||
|
int argc;
|
||
|
char *argv[];
|
||
|
{
|
||
|
/* Assume Failure */
|
||
|
int ErrorStatus = 1;
|
||
|
|
||
|
//
|
||
|
// Parse the input arguments
|
||
|
//
|
||
|
if (ParseArgs(argc, argv)) {
|
||
|
//
|
||
|
// Upgrade permissions & Allocate/Deallocate Hibernation File
|
||
|
//
|
||
|
UpgradePermissions();
|
||
|
if (HiberFile()) {
|
||
|
ErrorStatus = 0;
|
||
|
} else {
|
||
|
ErrorStatus = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(ErrorStatus);
|
||
|
}
|