Hierfür ist der Systemaufruf ExitWindowsEx vorgesehen. Hier können folgende Parameter vorgegeben werden:
bool ExitWindowsEx(UNIT flags, DWORD res);
Die Werte zum Parameter flags können mit der Pipe | kombiniert werden:
| EWX_FORCE | Fährt das System ohne die Messages WM_QUERYENDSESSION und WM_ENDSESSION zu versenden herunter |
| EWX_LOGOFF | Alle Prozesse werden heruntergefahren und der User ausgeloggt |
| EWX_POWEROFF | Fährt das System herunter und schaltet die Stromversorgung ab |
| EWX_REBOOT | Fährt das System herunter und bootet neu |
| EWX_SHUTDOWN | Fährt das System herunter nachdem alle Buffer geflusht wurden. |
Der Parameter res ist reserviert und wird nicht ausgewertet.
Beispiel:
DWORD res=0; ExitWindowsEx(EWX_FORCE|EWX_SHUTDOWN,res);
Unter Windows XP sind für diesen Vorgang allerdings Rechte vonnöten. Das Programm benötigt das Recht, den Rechner herunterfahren zu lassen.
Das Recht wird so programmiert:
HANDLE hToken; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken); LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount=1; tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,false,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);