So hier mal eine Prozedur, die Windows herunterfährt bzw. neu startet.
Sie ist so geschrieben, dass sie sowohl mit
Win9x als auch mit Win2000/XP funktioniert.
Delphi-Quellcode:
procedure BeendeWindows(Restart: Boolean);
var
vi : TOSVersionInfo;
hToken : THandle;
tp : TTokenPrivileges;
h : DWORD;
i : Boolean;
buffer : PChar;
o : Integer;
begin
vi.dwOSVersionInfoSize := sizeof(vi);
GetVersionEx(vi);
if vi.dwPlatformId=VER_PLATFORM_WIN32_NT
then begin
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
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;
if restart
then
i := ExitWindowsEx(EWX_REBOOT, 0)
else
i := ExitWindowsEx(EWX_POWEROFF, 0);
h := GetLastError;
GetMem(buffer, 1024);
o := FORMAT_MESSAGE_FROM_HMODULE;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, @o, h, 0, buffer, 1023,
nil);
FreeMem(Buffer);
end;
Sollte es aus irgendeinem Grund nicht möglich sein, den Neustart auszuführen, dann wird auch gleich die Fehlermeldung ausgegeben.