Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > обьясните код


Автор: Darkmaster 13.6.2006, 21:19
помогите разобратся что тут к чему:
Код

program shut;
{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

var
  logoff: Boolean = False;
  reboot: Boolean = False;
  warn: Boolean = False;
  downQuick: Boolean = False;  
  cancelShutdown: Boolean = False;
  powerOff: Boolean = False;
  timeDelay: Integer = 0;

function HasParam(Opt: Char): Boolean;
var
  x: Integer;
begin
  Result := False;
  for x := 1 to ParamCount do
    if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True;  
end;  

function GetErrorstring: string;
var  
  lz: Cardinal;  
  err: array[0..512] of Char;  
begin
  lz := GetLastError;  
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);  
  Result := string(err);
end;  

procedure DoShutdown;
var  
  rl, flgs: Cardinal;
  hToken: Cardinal;  
  tkp: TOKEN_PRIVILEGES;  
begin  
  flgs := 0;
  if downQuick then flgs := flgs or EWX_FORCE;
  if not reboot then flgs := flgs or EWX_SHUTDOWN;
  if reboot then flgs := flgs or EWX_REBOOT;
  if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF;  
  if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or  
      EWX_LOGOFF;  
  if Win32Platform = VER_PLATFORM_WIN32_NT then  
  begin  
    if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,  
      hToken) then  
      Writeln('Cannot open process token. [' + GetErrorstring + ']')  
    else  
    begin
      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then  
      begin  
        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
        tkp.PrivilegeCount           := 1;  
        AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);  
        if GetLastError <> ERROR_SUCCESS then  
          Writeln('Error adjusting process privileges.');  
      end  
      else  
        Writeln('Cannot find privilege value. [' + GetErrorstring + ']');
    end;  
   
  end;  
  //     else begin  
  ExitWindowsEx(flgs, 0);  
  //     end;  
end;  

begin
powerOff := True;
DoShutdown;
end.

 

Автор: Yanis 13.6.2006, 21:30
Таааккк.... Может быть вопросы задавать начнёшь? Или тебе полностью рассказать от того, что такое apptype console до того как в Windows проиходит загрузка исполнительных файлов... 

Автор: Sunvas 13.6.2006, 22:00
Код запустить не пробовал?? Запусти, посмотри что к чему. 

Автор: Albinos_x 13.6.2006, 23:34
Sunvas, 
вот видимо по этому и спрашивает smile 
не охота мне сейчас поисками заниматься....http://www.zoforum.zeroes-and-ones.com.ru/index.php?showtopic=31... да простят меня модераторы smile  

Автор: Mechanic 14.6.2006, 08:37
А я объясню..  smile 
Этот код просто выключит комп.

Добавлено @ 08:39 
Цитата(Jey_k @  13.6.2006,  23:34 Найти цитируемый пост)
Выключение и перезагрузка в ХР, Напомните с привелегиями(покороче)

 smile   

Автор: Darkmaster 14.6.2006, 11:45
Конкретно не понятно вото что:
Код

function HasParam(Opt: Char): Boolean;    
var    
  x: Integer;    
begin    
  Result := False;    
  for x := 1 to ParamCount do    
    if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True;    
end;  

и вот это:
Код

begin    
    if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,    
      hToken) then    
      Writeln('Cannot open process token. [' + GetErrorstring + ']')    
    else    
    begin    
      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then    
      begin    
        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;    
        tkp.PrivilegeCount           := 1;    
        AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);    
        if GetLastError <> ERROR_SUCCESS then    
          Writeln('Error adjusting process privileges.');    
      end    
      else    
        Writeln('Cannot find privilege value. [' + GetErrorstring + ']');

Вот 

Автор: Alexeis 14.6.2006, 14:51
Первая Функция проверяет присутствует ли символ opt в параметрах командной строки.
Вторая получает специальные привелегии необходимые для завершения работы Windows XP или NT 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)