Перезагрузка

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

delphi-coder
Сообщения: 12
Зарегистрирован: 04 мар 2004, 15:35
Откуда: Moscow, Russia

Eugie писал(а):delphi-coder, для перезагрузки флаг EWX_REBOOT. И зачем два раза вызывать ExitWindowsEx? И еще: SetProcessShutdownParameters в Win9x нет, так что там не сработает. Лучше проверять версию Виндов и для 9x вызывать сразу ExitWindowsEx без запроса привилегий. В остальном - все верно :)
Какой флаг для перезагрузки, я знаю, просто запутался в том, что надо, вот и привёл этот код. Ведь поменять-то надо совсем немного.
А два раза вызывается вот зачем: попробуй-ка перезагрузить WinNT, просто вызвав ExitWindowsEx! Ничего не выйдет, т.к. необходимо сперва получить соответствующие привилегии, это и делается при помощи SetProcessShutdownParameters и иже с ней.
А теперь представим, что произойдёт, запусти это пользователь под Win9X: сработает ExitWindowsEx, и комп выключится\перезагрузится. А под NT первый вызов ExitWindowsEx не сработает, выполнится код для получение соответствующих привилегий, и после этого снова выполниться ExitWindowsEx, и мы добьёмся, чего хотели.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Delphi-coder, в открытую дверь-то зачем ломиться? :) Ясен перец, что без привилегий НТю не перегрузишь. Вопрос в другом: если взялся писать универсальную ф-цию, делай это правильно. Еще раз повторю: а) SetProcessShutdownParameters нет в Win9x, поэтому твой код там работать не будет - выскочит что-то типа "XXX.dll на которую ссылается программа не найдена"; б) SetProcessShutdownParameters вообще не нужна для установки привилегий: она задает приоритет выгрузки вызвавшего ее процесса, т.е. раньше или позже относительно других процессов в системе.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Не вдаваясь в подробности: можно программно перегрузить комп, если либо
а) процессор работает в реальном режиме (как в ДОС), пример кода в сообщении Andy,
б) -- в защищенном режиме (как в современных Виндах) если соотв. фрагмент кода выполняется на высшем уровне привилегий (ring 0)

Что делает ExitWindowsEx (в режиме EWX_REBOOT):
- рассылает всем приложениям сообщения WM_QURYENDSESSION, чтобы они могли корректно завершиться и при необходимости принудительно их завершает;
- выполняет logoff для всех залогиненных пользователей;
- выгружает все системные сервисы;
- записывает отображенное в память содержимое своп-файла на диск;
- выполняет собственно перезагрузку компа.
delphi-coder
Сообщения: 12
Зарегистрирован: 04 мар 2004, 15:35
Откуда: Moscow, Russia

Итак, чтобы перезагрузить комп, не обращаясь к API ОС, необходимо вызвать int 19h прерывание процессора. Это если проц не работает в защищённом режиме, т.е. твой код выполняется в нулевом кольце защиты.
Однако под современными многозадачными ОС сделать это невозможно, т.к. в нулевом кольце работает только ядро самой системы. Т.е. выход у нас - либо выполнить свой код в нулевом кольце, либо использовать API системы. Первое реально, но сложно в реализации, второе как раз для этого и предназначено...
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

2 Татьяна
Можно ли НЕ проделывая такого количества разлиных действий перезагрузить комп, работая в windows, и при этом к самой ОС винд... не обращаться НИ В КАКОМ виде? Или "грубой силой" не получится?
Можно. Кнопкой Reset :)
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Можно ли НЕ проделывая такого количества разлиных действий перезагрузить комп, работая в windows, и при этом к самой ОС винд... не обращаться НИ В КАКОМ виде? Или "грубой силой" не получится?
Получится:
  • Можно еще извратнуться и долбануть по системному блоку кувалдой.
  • Можно кратковременно отсоединить шнур питания от материнской платы.
  • Можно попридержать в течении некоторого времени пальцем вентилятор, охлаждающий центральный процессор.
  • Можно подключить к компьютеру DVD-RW и поставить к нему Универсальный Драйвер CD-RW 1995года.
  • Можно заразить компьютер под управлением Windows XP® вирусом MSBlast®.
  • Можно попытаться пробить компьютер на жалость и попросить его перегрузиться (вежливо, на английском языке с китайским акцентом)
ЗЫ - delphi-coder, int 19h это немного другое. Это загрузка а не перезагрузка :)
*provided AS IS
Ответить