/*
* This is free software, Under GPL2.0
*
* (c) Tody 2010, FIC Inc.
* All Rights Reserved
*
* Fast Down System for Windows NT
*
* Revision: 1.0
* Author: Tody
* Date: 2010-08-05
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define progname "fastdown.exe"
typedef int (*NtProc)(int);
int EnablePrivilage();
void usage();
void usage()
{
printf("(c) Tody 2010, FIC Inc./n", progname);
printf("Fastdown Tool Rev: 1.0.0/n", progname);
printf("Usage:/n %s <code>/n/n", progname);
printf(" Code:/n/t0: Shutdown No Reboot/n");
printf("/t1: Shutdown Reboot/n");
printf("/t2: Shutdown PowerOff/n");
exit(1);
}
int EnablePrivilage()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken))
{
if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
{
return 1; /* Failure */
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0))
{
return 1; /* Failure */
}
CloseHandle(hToken);
}
else
{
return 1; /* Failure */
}
return 0; /* Success */
}
int main(int argc, char *argv[])
{
NtProc NtShutdownSystem = NULL;
int retval = 0;
HINSTANCE h = LoadLibrary("ntdll.dll"); /* Load ntdll.dll file */
if (h == NULL)
{
printf("LoadLibrary() Fail!/n");
return 1;
}
if (argc<2 || argv[1][0]>'2' || argv[1][0]<'0')
{
usage();
}
NtShutdownSystem = (NtProc)GetProcAddress(h, "NtShutdownSystem"); /* Get Proc Address of function */
if (NtShutdownSystem == NULL)
{
printf("Get NtShutdownSystem Address Fail!/n");
return 1;
}
retval = EnablePrivilage(); /* Enable Shutdown Privilage */
if (retval)
{
printf("EnablePrivilage() Fail!/n");
return 1;
}
printf("Windows is shutting down...");
NtShutdownSystem(atoi(argv[1])); /* Call Shutdown Function */
printf("Error: %d %d", GetLastError(),atoi(argv[1])); /* Debug info. */
FreeLibrary(h);
getchar();
return 0;
}