Програмное выключение или перезагрузка компьютера

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by #Smith, 5 Aug 2010.

  1. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    Ну вот собственно сама функция (код на Delph):

    Code:
    function ShutDown(Reboot: Boolean = False): Integer;
    const
      SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    var
      hToken: THandle;
      TP: TTokenPrivileges;
      flag: DWORD;
    begin
      Result := -1;  //В случае ошибки выдаст -1
      if (Byte(GetVersion) > $04) then  //Проверяю версию OS
        begin  // (если последний байт > 4 то ось старше Win98 и нужно выполнить ряд действий)
          flag := 0;
          if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
          //Если не получилось получить доступ к процессу - выходим
          With TP do  //Собсно настраиваем и далее устанавливаем привилегию для нашей программы
            begin
              PrivilegeCount := 1;
              With Privileges[0] do
                begin
                  Attributes := SE_PRIVILEGE_ENABLED;
                  if not LookupPrivilegeValue(nil, PChar(SE_SHUTDOWN_NAME), Luid) then Exit;
                end;
            end;
          AdjustTokenPrivileges(hToken, False, TP, SizeOf(TTokenPrivileges), nil, flag);  //Устанавливаем привилегию
        end;
      if not Reboot then ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0)  //"Мягкое" выключение
        else ExitWindowsEx(EWX_FORCE or EWX_REBOOT, 0);  //Перезагрузка
      Result := 0;
    end;
    Было бы интересно услышать мнения при тестировании на Win98 и Win2000 а заодно и на новых осях.


    Список источников:
    http://www.delphisources.ru/pages/faq/base/shutdown_or_reboot_pc.html
    http://faqs.org.ru/progr/pascal/delphi_faq4.htm
     
    #1 #Smith, 5 Aug 2010
    Last edited: 10 Aug 2010
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну сразу могу сказать что на 9x пахать не будет. Даже не запустится прога.
    Потому что никакой безовасности толком небыло в этих ОС. и следовательно небыло функций AdjustTokenPrivileges. Так что тут тока делать динамический импорт а не статический.

    А вообще возьми MSDN и каждую функцию проверь там. И увидишь для каких ОС она работает, а для каких нет и какие условия.
     
  3. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    один асм операция, и компу стоп - красный свет.

    "In the x86 computer architecture, HLT (halt) is an assembly language instruction which halts the CPU until the next external interrupt is fired."
    (C) WikiPedia
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 altblitz умный шоли? А права Ring0 где возьмешь? Еслибы почитал более подробно, то ты бы узнал, что эта функция не пашет в r3 (а винды 32 и 64 битные запускают проги тока в r3)
    И тогда тебе предстоит мего задача - попасть с ядро. Если для 9x это было просто. то на NT тока сплоиты юзать или дрова. ну или хитрости которые уже прикрыты давно
     
  5. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    slesh, ну по сути действия с привилегиями должны срабатывть при ос Win2000 or WinXP
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    впринципе да. Под 9x вообще не надо их. просто определяй ос. и если это NT подобная то делай динамический импорт и юзай как есть. Для 9x не делай импорт и там есть вроде чуть другая апишка.
    насчет w7 тут хз. может уак не позволит
     
    1 person likes this.
  7. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    так вам нра Wин98/Wин2000 ?

    раз, два, три, четыре,
    рухнула защита этой сети.
     
    1 person likes this.