https://docs.microsoft.com/en-us/windows/desktop/shutdown/wm-queryendsession https://docs.microsoft.com/en-us/windows/desktop/api/winreg/nf-winreg-abortsystemshutdowna
Нужно было уточнить в самом начале. Не должно появляться каких то окон, что какое то приложение блокирует завершение работы. Поэтому первый вариант не подходит. По второй ссылке, если я правильно понимаю эта функция не сработает, она отменяет завершение инициированное только через InitiateSystemShutdown с таймаутом. Через пуск - другая история: https://docs.microsoft.com/ru-ru/windows/desktop/api/winuser/nf-winuser-exitwindowsex
Тогда остается инжект в explorer.exe и сабклассить саму кнопку (SetWindowLong+GWL_WNDPROC) и TrackPopupMenu при клике правой кнопкой по кнопке пуск (там тоже завершение работы есть). Возможно еще в локальных политиках что-то такое есть.
Я ничего не понял как обычно. Процесс shutdown запускается из командной строки. Как его можно инициировать через кнопку Пуск? И самое главное где эта кнопка находится? Это кнопка включения компьютера? Ты хочешь прервать выключение сразу после включения? "в лк" - это значит что тебе в личку нужно написать этот страшный секрет?
Пользователь нажимает Пуск -> Завершение работы. Нужно не дать системе завершить работу. Тихо, без окон или уведомлений. Как будто туда и не нажимали. в лк - с тем кто возьмется за это дело, предлагается обсудить в личке все более подробно.
Hard reset или Power off аппаратные перехватывать придется, а это в SMM обработчик лезть может понадобиться. А если он залоченый через D_LOCK, то никак. И если гипервизор перехватывающий обращения к SMM, тоже никак.
..угу, скажи ещё из юзера. наиболее приземлённый вариант - это вообще убрать буттон "Завершение работы"
Звучит как то дико сложно. Может есть вариант перехватить клик мышки в меню до всего этого? не от юзера, права админские убрать кнопку к сожалению не подходит.
Я посмотрел в 8-ке. Действительно вызывается ExitWinEx() без каких либо проверок до этого, что бы событие можно было отключить. Эта апи посылает запрос в серверный процесс. Интересно что эта часть совпадает с сурками XP winsrv.SrvExitWindowsEx и в этой же группе есть сервис SrvCancelShutdown, который вызывается так же и при завершении работы из предыдущей апи в случае ошибки. Смотрим откуда вызывается - user32.CancelShutdown(). Судя по гуглу апи не паблик. Вот наверно её стоит потестить.
Представил я такой прикол. Хочет виндусятник завершить работу, вкладку открывает, а кнопки "выключить" нету... Эко у него мозги на бекрень встанут.
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer Создаем DWORG ключ с именем "NoClose" Значение: 0 = завершение разрешено, 1 = завершение заблокировано
нене, это всё баян и список твиков (уверен что далеко не полный) есть например тут: http://www.rusdoc.ru/material/os/win/reestr.shtml. вернёмся к сути, господа: надо так, чтобы при нажатии пимпы "завершить работу" не происходило ничего. f13nd прав, я тоже кроме сабкласса ничего не вижу рационального.
b1337z это всё верно, и детально расписано тут https://docs.microsoft.com/en-us/windows/desktop/shutdown/system-shutdown но в тз
sn0w, Тс ушёл с инфой про CancelShutdown() ничего не сказав, если бы это не сработало, то продолжил вопрос. Так что всё ясно.