CoolCmd! Спасибо за статью, но лучше бы она мне попалась пару лет назад Сейчас стоит рейд0 из ССД, грузится быстро...
у меня вопросы: 1. что будет, если отрубят свет в режиме S3? данные то не пострадают (их свежих нет, ведь была перезагрузка), но , чисто теоретически, чем еще это чревато? 2. по логике самый лучший режим - это "Гибридный сон". - комп уходит в сон, по таймеру или ручками, после нажатия кнопки повер - все грузится из памяти (если там оно есть), - если свет моргнул - грузимся с диска (как при обычной гибернации). в любом случае - начинаем работу с того же места, а не с чистого листа, как в твоем алгоритме. 3. не мешает ли твой скрипт уходу в сон (S3) по таймеру? . . . . еще раз спасибо за статью, довольно необычно и интересно... перезагрузиться, чтобы спать - это надо было мозг вывернуть, чтобы придумать
он лучший когда комп засыпает посреди работы, когда могут пропасть данные. у нас совсем другой случай. зря потратишь время на запись памяти, плюс как я писал, упадет отзывчивость венды. если у тебя каждый день вырубают электричество, то рекомендую купить UPS.
CoolCmd Как раз на msdn написано, что функция имеет 3 параметра, первый из которых переключает S3 или S4. Более того - эта функция никуда не пропала в Win7, а значит использовать PowerShell нет необходимости.
CoolCmd Либо я туплю, либо... Функция SetSuspendState имеет 3 булевых аргумента и находится в powrprof.dll. Появилась там начиная с WinXP и есть по сей день. Что мешает передать ей первый параметр для гибернации как под XP, так и под 7-кой?
Добавлено спустя 3 часа 16 минут 55 секунд: Выше было сказано, что rundll32.exe при вызове функции использует свой собственный постоянный набор параметров. Другими словами, функция должна быть специально разработана для вызова с помощью rundll32.exe. Однако в команде
Код:
rundll32 powrprof.dll,SetSuspendState
вызывается обычная Win32 функция. Как же эта команда работает? Если коротко: через жопу, причем действие команды будет меняться в зависимости от времени года на Марсе.
Подробнее. Функция SetSuspendState() должна вызываться так:
Сначала разберемся с количеством параметров. Их передается на 1 штуку больше. Значит после возврата из SetSuspendState() в стеке останутся 4 лишних байта. Обычно (если не восстановить указатель стэка) это приводит к вызову исключения и падению приложения. rundll32.exe не падает, скорее всего исключение ловит обработчик исключений, например блок __try / __catch.
Теперь смотрим, какие данные получает SetSuspendState() через стэк. Тип BOOLEAN - это unsigned char, но в стеке занимает 4 байта. Таким образом, размер всех параметров в стеке совпадает и равен 4 байтам. Это облегчит разбор.
Требуется BOOLEAN Hibernate. Передается на самом деле HWND hwnd. Скрытое окно создает rundll32.exe. Анализируется младший байт, поэтому в большинстве случаев параметр не равен нулю, а значит венда по возможности отправится в гибернацию. Однако иногда младший байт будет равен нулю и венда заснет. Русская рулетка.
Требуется BOOLEAN ForceCritical. Передается на самом деле HINSTANCE hinst. Это HINSTANCE модуля rundll32.exe. В Windows XP нет Address space layout randomization, поэтому параметр всегда равен базовому адресу, а именно 0x1000000. Младший байт нулевой, как нам и нужно. Фу, пронесло.
Требуется LPSTR lpszCmdLine. Передается на самом деле LPSTR lpszCmdLine. Память для командной строки выделяет LocalAlloc(), поэтому адрес будет меняться. Как и в случае с параметром Hibernate, в большинстве случаев младший байт не равен нулю. Это означает, что разбудить венду программно будет невозможно. Хреново.
Таким образом после использования этой кривой команды венду нельзя программно разбудить, и кроме того иногда венда будет засыпать вместо ухода в гибернацию. В 64-битной венде будет еще веселее, потому что размер параметров в стэке не совпадает.
Цитата:
Author: Soumitra Sengupta MVP
И правда, только индус мог поместить такое кривое решение в базу знаний.
_________________ Разгони форум и сайт overclockers.ru: https://coolcmd.github.io/for/ https://youtu.be/4A67iTiOD_g
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
"останутся 4 лишних байта. Обычно ... это приводит к вызову исключения и падению приложения." Попробуй вызвать wsprintf с шаблоном, который не совпадает с количеством передаваемых параметров. ))
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения