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;

 

Иногда может возникнуть необходимость в выключении на время устройств ввода - клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве "наказания" при запуске программы по истечению срока ее бесплатного использования ... . Однако наилучшее ее применение - отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи API:

 

Code:

procedure LockPC;

var OldValue: LongBool;

begin

SystemParametersInfo(97, Word(Bool), @OldValue, 0);

WinExec(PChar('rundll32 mouse,disable'), SW_SHOW);

WinExec(PChar('rundll32 keyboard,disable'), SW_SHOW);

end;

  

 

 

Code:

mov ax,5301h

sub bx,bx

int 15h

jb stop

mov ax,530eh

sub bx,bx

int 15h

jb stop

mov ax,5307h

mov bx,0001h

mov cx,0003h

int 15h

stop: int 20h

 

 

Код прислал Колесников Сергей Александрович [mailto:Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.]

Для этого нам потребуются определённые привелегии:

Code:

function SetPrivilege(aPrivilegeName : string;

                     aEnabled : boolean ): boolean;

var

TPPrev,

TP         : TTokenPrivileges;

Token      : THandle;

dwRetLen   : DWord;

begin

Result := False;

OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES

                  or TOKEN_QUERY, @Token );

 

TP.PrivilegeCount := 1;

if( LookupPrivilegeValue(nil, PChar( aPrivilegeName ),

                          TP.Privileges[ 0 ].LUID ) ) then

begin

   if( aEnabled )then

     TP.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;

   else

     TP.Privileges[0].Attributes:= 0;

 

   dwRetLen := 0;

   Result := AdjustTokenPrivileges(Token,False,TP,

                                   SizeOf( TPPrev ),

                                   TPPrev,dwRetLen );

end;

 

CloseHandle( Token );

end;

 

 

function WinExit( iFlags : integer ) : boolean;

//   возможные флаги:

//   EWX_LOGOFF

//   EWX_REBOOT

//   EWX_SHUTDOWN

begin

Result := True;

if( SetPrivilege( 'SeShutdownPrivilege', true ) ) then

begin

   if( not ExitWindowsEx( iFlags, 0 ) )then

   begin

     Result := False;

   end;

   SetPrivilege( 'SeShutdownPrivilege', False )

end

else

begin

   Result := False;

end;

end;

 

 

Code:

unit Unit1;

{©Drkb v.3}

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs;

 

type

TForm1 = class(TForm)

   procedure FormCreate(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

   FSystemShutdown: Boolean;

   procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

function SetPrivilege(PrivilegeName: String; AEnabled: Boolean): Boolean;

var

TPPrev, TP: TTokenPrivileges;

Token: THandle;

dwRetLen: DWORD;

begin

Result := False;

if OpenProcessToken(GetCurrentProcess,

   TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then

try

   if LookupPrivilegeValue(nil, PChar(PrivilegeName),TP.Privileges[0].LUID) then

   begin

     TP.PrivilegeCount := 1;

     if AEnabled then

       TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED

     else

       TP.Privileges[0].Attributes := 0;

     dwRetLen := 0;

     Result := AdjustTokenPrivileges(Token, False, TP,

       SizeOf(TPPrev), TPPrev, dwRetLen);

   end;

finally

   CloseHandle(Token);

end

else

   RaiseLastOSError;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

const

SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

begin

FSystemShutdown := False;

if not SetPrivilege(SE_SHUTDOWN_NAME, True) then

   RaiseLastOSError;

end;

 

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);

begin

inherited;

Message.Result := 0;

AbortSystemShutdown(nil);

FSystemShutdown := True;

Close;

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

ShowMessage('Bla...bla...bla!');

if FSystemShutdown then

   InitiateSystemShutdown(nil, nil, 0, True, False);

end;

 

end.

 

Автор: Александр (Rouse_) Багель

 

Функция SetSuspendState приостанавливает работу системы за счет отключения питания.

В зависимости от параметра Hibernate,

система либо переходит в состояние приостановки (сна), либо в спящий режим.

  

exitkernel очень радикальный способ потому что не сохраняются настройки рабочего стола, ini файлы и другие установки, зато быстро

 Есть способ намного лучше: ф-ия SHExitWindowsEx из shell32.dll

С неё всё good. Это запуск из-под WinExec()

Автор: Kecvin S. Gallagher

Если монитор поддерживает режим Stand by, то его можно программно перевести в этот режим. Данная возможность доступна на Windows95 и выше.

 Чтобы перевести монитор в режим Stand by:

 

Code:

function MyExitWindows(RebootParam: Longword): Boolean;

var

TTokenHd: THandle;

TTokenPvg: TTokenPrivileges;

cbtpPrevious: DWORD;

rTTokenPvg: TTokenPrivileges;

pcbtpPreviousRequired: DWORD;

tpResult: Boolean;

const

SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

begin

if Win32Platform = VER_PLATFORM_WIN32_NT then

begin

   tpResult := OpenProcessToken(GetCurrentProcess(),

     TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,

     TTokenHd);

   if tpResult then

   begin

     tpResult := LookupPrivilegeValue(nil,

                                      SE_SHUTDOWN_NAME,

                                      TTokenPvg.Privileges[0].Luid);

     TTokenPvg.PrivilegeCount := 1;

     TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

     cbtpPrevious := SizeOf(rTTokenPvg);

     pcbtpPreviousRequired := 0;

     if tpResult then

       Windows.AdjustTokenPrivileges(TTokenHd,

                                     False,

                                     TTokenPvg,

                                     cbtpPrevious,

                                     rTTokenPvg,

                                     pcbtpPreviousRequired);

   end;

end;

Result := ExitWindowsEx(RebootParam, 0);

end;

 

// Example to shutdown Windows:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

MyExitWindows(EWX_POWEROFF or EWX_FORCE);

end;

 

// Example to reboot Windows:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

MyExitWindows(EWX_REBOOT or EWX_FORCE);

end;

 

 

Сообщение wm_queryendsession посылается всем приложениям когда пользователь выбирает завершение сеанса или когда приложение вызывает

Функция ExitWindows. Если какое-либо приложение возвращает ноль, сеанс не завершается.

Система перестает отправлять сообщения WM_QUERYENDSESSION, как только одно приложение

возвращать нуль. После обработки этого сообщения система отправляет сообщение WM_ENDSESSION с

Параметр wParam задает результаты сообщения WM_QUERYENDSESSION.