Ниже корректно работающий код для Win9x
и WinNT. Проверено под D4.
uses Windows;
procedure RebootSystem;
var
handle, ph : THandle;
pid : DWORD;
luid : TLargeInteger;
dummy, priv : TOKEN_PRIVILEGES;
ver : TOSVERSIONINFO;
begin
ver.dwOSVersionInfoSize:=Sizeof(ver);
GetVersionEx(ver);
if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then begin
pid:=GetCurrentProcessId;
ph:=OpenProcess(PROCESS_ALL_ACCESS, False, pid);
if OpenProcessToken(ph,TOKEN_ADJUST_PRIVILEGES, handle) then
if LookupPrivilegeValue(nil,'SeShutdownPrivilege', luid) then begin
priv.PrivilegeCount:=1;
priv.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
priv.Privileges[0].Luid:=luid;
AdjustTokenPrivileges(handle,False,priv,0,dummy,pid);
end;
end;
ExitWindowsEx(EWX_REBOOT,0);
end;