Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

PowerOff

01.01.2007
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Power off (Убивает процессы)
 
Зависимости: Windows
Автор:       DeMoN-777, DeMoN-777@yandex.ru, Санкт-Петербург
Copyright:   @
Дата:        21 июня 2002 г.
***************************************************** }
 
procedure Shutdown2
;
var
  hToken
: THandle;
  tkp
: _TOKEN_PRIVILEGES;
  DUMMY
: PTokenPrivileges;
 
DummyRL: Cardinal;
begin
  DUMMY
:= nil;
 
if not OpenProcessToken(
   
GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY,
    hToken
   
) then
   
raise TShutdownEx.Create('OpenProcessToken failed');
 
 
if (not LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
    tkp
.Privileges[0].Luid)) then
   
raise TShutdownEx.Create('LookupPrivilegeValue failed');
 
  tkp
.PrivilegeCount := 1;
  tkp
.Privileges[0].Attributes := $0002; //SE_PRIVILEGE_ENABLED = $00002
 
 
AdjustTokenPrivileges(hToken, FALSE, tkp, 0, Dummy, DummyRL);
 
 
if (GetLastError() <> ERROR_SUCCESS) then
   
raise TShutdownEx.Create('AdjustTokenPrivileges failed');
 
 
if (not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0)) then
   
raise TShutdownEx.Create('ExitWindowsEx failed');
end;
 


{ **** UBPFD *********** by delphibase.endimus.com ****
>> Power off (не убивает процессы)
 
Зависимости: Windows
Автор:       DeMoN-777, DeMoN-777@yandex.ru, Санкт-Петербург
Copyright:   @
Дата:        21 июня 2002 г.
***************************************************** }
 
procedure
ExitWinNT(AShutdown: Boolean);
var
  hToken
: THandle;
  tkp
: TTokenPrivileges;
 
ReturnLength, What: Cardinal;
begin
 
if AShutdown then
   
What := EWX_SHUTDOWN or EWX_POWEROFF
 
else
   
What := EWX_REBOOT;
 
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY
, hToken) then
 
begin
   
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
    tkp
.PrivilegeCount := 1;
    tkp
.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   
if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
     
ExitWindowsEx(What, 0)
 
end
end;
Пример использования:
 
ExitWinNT(True);
 


Сегодня мы напишем прогу на WinApi, выключающую W2k, и занимающую всего 10 Кб!

program reboot;
 
uses
 
Windows, messages;
 
procedure
RebootSystem;
var
  handle_
: THandle;
  n
: DWORD;
  luid
: TLargeInteger;
  priv
: TOKEN_PRIVILEGES;
  ver
: TOSVERSIONINFO;
begin
  ver
.dwOSVersionInfoSize := Sizeof(ver);
 
GetVersionEx(ver);
 
if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then
 
begin
   
if OpenProcessToken(GetCurrentProcess, 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, nil, n);
     
end
     
else
        writeln
('Ошибка')
   
else
      writeln
('Ошибка ');
 
end
 
else
    writeln
('Ошибка ');
 
if not ExitWindowsEx(EWX_POWEROFF,1) then
    writeln
('Ошибка');
end;
 
begin
 
RebootSystem;
end.

https://delphiworld.narod.ru/

DelphiWorld 6.0


procedure NTShutdown;
var
 
TokenHandle: Cardinal;
 
RetLength: Cardinal;
  TP
: TTokenPrivileges;
begin
 
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
   
or TOKEN_QUERY, TokenHandle);
 
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
    TP
.Privileges[0].Luid) then
 
begin
    TP
.PrivilegeCount := 1;
    TP
.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   
RetLength := 0;
   
if AdjustTokenPrivileges(TokenHandle, FALSE, TP, 0, nil, RetLength) then
   
begin
     
if not SetProcessShutdownParameters($4FF, SHUTDOWN_NORETRY) then
     
begin
       
MessageBox(0, 'Shutdown failed', nil, MB_OK or MB_ICONSTOP);
     
end
     
else
     
begin
       
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);
     
end;
     
exit;
   
end;
 
end;
 
MessageBox(0, 'Access denied', nil, MB_OK or MB_ICONSTOP);
end;

https://delphiworld.narod.ru/

DelphiWorld 6.0


Выключить монитор - это классно, но можно сделать ещё круче - программно завершить работу компьютера. Выглядеть это будет примерно так, с использованием различных режимов выключения:

ExitWindowsEx(EWX_LOGOFF or ewx_force,0);

завершает работу всех запущенных в системе процессов, сохраняя данные приложения, вызвавшего эту функцию

ExitWindowsEx(EWX_SHUTDOWN or ewx_force,0);

останавливает работу системы в безопасный момент времени. Все буферы очищаются с сохранением данных на диске, все процессы останавливаются

ExitWindowsEx(EWX_REBOOT or ewx_force,0);

перезагрузка системы

ExitWindowsEx(EWX_FORCE or ewx_force,0);

завершает работу всех запущенных в системе приложений, не посылая им сообщения WM_QUERYENDSESSION и WM_ENDSESSIO. Это может вызвать потерю не сохраненных данных

ExitWindowsEx(EWX_POWEROFF or ewx_force,0);

завершает работу компьютера с выключением питания, если система поддерживает автоуправление питанием

ExitWindowsEx(EWX_FORCEIFHUNG or ewx_force,0);

завершает работу всех запущенных в системе приложений если система висит

Ещё вариант перезагрузки:

mov  al,0F0h  
out  64h,al

https://delphiworld.narod.ru/

DelphiWorld 6.0

 


ExitWindowsEx(EWX_FORCE,0);

или

Запуск из коммандной строки

rundll32 krnl386.exe,exitkernel

только под XP все это работает плохо. Надо думать...

Автор: Vit

Взято с Vingrad.ru https://forum.vingrad.ru