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

Ясен перец, что без привилегий НТю не перегрузишь. Вопрос в другом: если взялся писать универсальную ф-цию, делай это правильно. Еще раз повторю: а) SetProcessShutdownParameters нет в Win9x, поэтому твой код там работать не будет - выскочит что-то типа "XXX.dll на которую ссылается программа не найдена"; б) SetProcessShutdownParameters вообще не нужна для установки привилегий: она задает приоритет выгрузки вызвавшего ее процесса, т.е. раньше или позже относительно других процессов в системе.
Добавлено: 20 апр 2004, 18:34
Eugie
Не вдаваясь в подробности: можно программно перегрузить комп, если либо
а) процессор работает в реальном режиме (как в ДОС), пример кода в сообщении Andy,
б) -- в защищенном режиме (как в современных Виндах) если соотв. фрагмент кода выполняется на высшем уровне привилегий (ring 0)
Что делает ExitWindowsEx (в режиме EWX_REBOOT):
- рассылает всем приложениям сообщения WM_QURYENDSESSION, чтобы они могли корректно завершиться и при необходимости принудительно их завершает;
- выполняет logoff для всех залогиненных пользователей;
- выгружает все системные сервисы;
- записывает отображенное в память содержимое своп-файла на диск;
- выполняет собственно перезагрузку компа.
Добавлено: 23 апр 2004, 20:05
delphi-coder
Итак, чтобы перезагрузить комп, не обращаясь к API ОС, необходимо вызвать int 19h прерывание процессора. Это если проц не работает в защищённом режиме, т.е. твой код выполняется в нулевом кольце защиты.
Однако под современными многозадачными ОС сделать это невозможно, т.к. в нулевом кольце работает только ядро самой системы. Т.е. выход у нас - либо выполнить свой код в нулевом кольце, либо использовать API системы. Первое реально, но сложно в реализации, второе как раз для этого и предназначено...
Добавлено: 23 апр 2004, 21:12
Eugie
2 Татьяна
Можно ли НЕ проделывая такого количества разлиных действий перезагрузить комп, работая в windows, и при этом к самой ОС винд... не обращаться НИ В КАКОМ виде? Или "грубой силой" не получится?
Можно. Кнопкой Reset

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