一、正常关机或重启:
unit uFuncs;
interface
uses
windows;
procedure GetPrivilege;
procedure RebootSystem();
implementation
procedure RebootSystem();
begin
GetPrivilege;
//initiateSystemShutDown();显示关机提示;
//ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG, 0); //强制关机
ExitWindowsEx(EWX_REBOOT OR EWX_FORCE or EWX_POWEROFF or EWX_FORCEIFHUNG, 0); // 重启
end;
procedure GetPrivilege;
var
NewState: TTokenPrivileges;
lpLuid: Int64;
ReturnLength: DWord;
ToKenHandle: THandle;
begin
OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES
OR TOKEN_ALL_ACCESS
OR STANDARD_RIGHTS_REQUIRED
OR TOKEN_QUERY,ToKenHandle);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',lpLuid);
NewState.PrivilegeCount:=1;
NewState.Privileges[0].Luid:=lpLuid;
NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
ReturnLength:=0;
AdjustTokenPrivileges(ToKenHandle,False,NewState,0,nil,ReturnLength);
end;
end.
二、瞬间关机或重启(1秒左右):
//调用ZwShutdownSystem()函数后,会通知硬件驱动保存内核数据,注册表和文件的缓存将会刷新到磁盘上,
//然后将立即重启或关机,未保存的应用程序数据将丢失。
//由于ZwShutdownSystem()通知硬件驱动后是瞬间关机的。为了系统与硬件的安全,
//应使用ExitWindowsEx()进行正常关机。
function RtlAdjustPrivilege(Privilege: ULONG; Enable: BOOLEAN;
CurrentThread: BOOLEAN; Enabled: PBOOLEAN): DWORD; stdcall; external 'ntdll.dll';
function ZwShutdownSystem(arg: DWORD): BOOLEAN; stdcall; external 'ntdll.dll';
procedure ForceShutdown();
begin
asm
PUSH ESP
PUSH 0
PUSH 1
PUSH $13
CALL RtlAdjustPrivilege
PUSH 0
CALL ZwShutdownSystem
end;
end;
procedure ForceReboot();
begin
asm
PUSH ESP
PUSH 0
PUSH 1
PUSH $13
CALL RtlAdjustPrivilege
PUSH 1
CALL ZwShutdownSystem
end;
end;