//---------------------------------------------------------------------------
// Mit Hilfe der Funktion ShutdownWindows(UINT ilFlag) kann Windows je nach
// Wert des Parameters ilFlag heruntergefahren oder neu gestartet werden
//---------------------------------------------------------------------------
// Parameter ilFlag kann folgende Werte annehmen:
//
// EWX_LOGOFF Schließt alle Anwendungen und loggt den Benutzer aus
// EWX_POWEROFF Schaltet den Rechner aus (sofern von der Hardware unterstützt)
// EWX_REBOOT Bootet den Rechner neu
// EWX_SHUTDOWN Fährt Windows herunter, ohne neu zu booten
//---------------------------------------------------------------------------
// Die ExitWindowsEx Funktion startet Shutdown-Prozess und kehrt anschließend
// zur aufrufenden Funktion zurück. Shutdown wird erst nach einiger Zeit,
// nach dem die Funktion einen Wert zurückgegeben hat, abgeschlossen.
//
// ShutdownWindows() gibt true ("alles ok") oder false ("Fehler aufgetreten")
// zurück.
//---------------------------------------------------------------------------
bool ShutdownWindows(UINT ilFlag)
{
bool blRetVal = true; // Rückgabewert
TOKEN_PRIVILEGES stTokenPriviledges;
HANDLE hProcToken; // Prozess Token
// auf NT-Platform prüfen
OSVERSIONINFO stVerInfo;
stVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&stVerInfo);
// falls NT/2000:
if(stVerInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
// Prozess Token besorgen
blRetVal = OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hProcToken);
if(blRetVal)
{
// LUID für Shutdown Privilege besorgen
blRetVal = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&stTokenPriviledges.Privileges[0].Luid);
stTokenPriviledges.PrivilegeCount=1;
stTokenPriviledges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
}
if(blRetVal)
{
// Shutdown privilege aktuellem Prozess geben
blRetVal = AdjustTokenPrivileges(hProcToken, false, &stTokenPriviledges,
0, (PTOKEN_PRIVILEGES)NULL, 0);
}
}
// Windows beenden:
if(blRetVal)
blRetVal = ExitWindowsEx(ilFlag, NULL);
return blRetVal;
}
|