Содержание материала

 

 

Code:

{ **** UBPFD *********** ****

>> Power off (Убивает процессы)

 

Зависимости: Windows

Автор:       DeMoN-777, Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., Санкт-Петербург

Copyright:   @

***************************************************** }

 

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;


 

Code:

{ **** UBPFD *********** ****

>> Power off (не убивает процессы)

 

Зависимости: Windows

Автор:       DeMoN-777, Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., Санкт-Петербург

Copyright:  

***************************************************** }

 

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 Кб!

 

Code:

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.

 


Code:

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;


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

 

Code:

ExitWindowsEx(EWX_LOGOFF or ewx_force,0);

 

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

 

Code:

ExitWindowsEx(EWX_SHUTDOWN or ewx_force,0);

 

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

Code:

ExitWindowsEx(EWX_REBOOT or ewx_force,0);

 


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

Code:

ExitWindowsEx(EWX_FORCE or ewx_force,0);

 

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

Code:

ExitWindowsEx(EWX_POWEROFF or ewx_force,0);

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

Code:

ExitWindowsEx(EWX_FORCEIFHUNG or ewx_force,0);

 


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

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

Code:

mov  al,0F0h 

out 64h,al

 

Code:

ExitWindowsEx(EWX_FORCE,0);

 или

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

Code:

rundll32 krnl386.exe,exitkernel

  

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

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить