// ein typ, der die parameter, die MyExitWindows übergeben werden können festlegt
TExit = (EW_Garnicht, EW_Neustart, EW_Abmelden, EW_Herunterfahren, EW_Ruhezustand, EW_Standby);
// ;-) der EW_Garnicht kann auch weggelassen werden...
// unter Win NT/2000/xp/vista braucht man priviligien zum herunterfahren...
// die hab ich, zum besseren verständnis, ausgelagert.
procedure GetShutdownPrivileges;
var
vi: TOSVersionInfo;
hToken: THandle;
tp: TTokenPrivileges;
h: DWord;
begin
vi.dwOSVersionInfoSize:=SizeOf(vi);
GetVersionEx (vi);
if vi.dwPlatformId = VER_PLATFORM_WIN32_NT
then
begin
OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken);
// der Forums-Code von DoctorD hier um TOKEN_QUERY ergänzt...
LookupPrivilegeValue (
nil, '
SeShutdownPrivilege',
tp.Privileges[0].Luid);
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
h := 0;
AdjustTokenPrivileges (hToken, False,
tp, 0, PTokenPrivileges(
nil)^, h);
CloseHandle(hToken);
end;
end;
procedure MyExitWindows (E: TExit);
begin
if e = EW_Garnicht
then exit;
GetShutdownPrivileges;
if E = EW_herunterfahren
then
ExitWindowsEx(EWX_ShutDown
or EWX_FORCEIFHUNG, 0);
if E = EW_Ruhezustand
then
SetSystemPowerState(false, true);
if E = EW_Standby
then
SetSystemPowerState(true, true);
if E = EW_Abmelden
then
ExitWindowsEx(EWX_LOGOFF, 0);
if E = EW_Neustart
then
ExitWindowsEx(EWX_REBOOT,0);
end;