Необходим ли файл C:\windows\system32\shutdown.exe
для завершения работы или перезапуска Windows?
4 ответа
Нет.
Explorer не вызывает эту команду, когда вы закрываете меню «Пуск».
Завершение работы системы возможно с помощью вызова Win32 API (ответ @ JdeBP содержит подробные сведения об этом, если интересно). Команда - это просто удобный способ сделать это из сценария, запланированного задания или диалога «Выполнить».
Ваш вопрос, конечно же, исходит из вашего ответа на https://codegolf.stackexchange.com/a/24011/18907 , в частности из комментария kinokijuf
после первоначального пересмотра вашего ответа.
Как сказал kinokijuf
, Windows - это не Unix. В Unices и Linux shutdown
действительно входит в процесс полного выключения. Это программа, которая отправляет регулярные предупреждающие сообщения зарегистрированным пользователям и записывает файл /run/nologin
чтобы предотвратить дальнейший вход в систему незадолго до запланированного времени завершения работы.
В Windows NT это не так.
Действие "Завершение работы" над "кнопкой питания" в меню "Пуск" проводника Windows, пункт меню "Завершение работы" в диспетчере задач, REBOOT /S
в TCC или Take Command и другие прикладные программы, которые позволяют выключить систему все инициируют отключение, напрямую вызывая один из двух вызовов Win32 API: InitiateSystemShutdownEx()
или ExitWindowsEx()
. Они не делают вещи косвенно, запустив программу shutdown
. (На самом деле для этого нужно больше кода, чем просто вызов Win32 API.) Программа shutdown
, когда выполняется локальное отключение, также вызывает те же вызовы Win32 API.
Это на самом деле winlogon
, csrss
и smss
- программы, закрывающие Windows NT. В частности, именно winlogon
выполняет основную работу по обработке отложенных запросов на отключение.
дальнейшее чтение
- Джонатан де Бойн Поллард (2006). Процесс завершения работы Windows NT 6. Часто задаваемые ответы.
shutdown
Руководства FreeBSD 9.2. 2013-03-19.shutdown
systemd
справочные страницы. 2013. Freedesktop.org.shutdown
upstart
справочных страниц. 2009. Canonical Ltd.InitiateSystemShutdownEx
. MSDN. Корпорация Майкрософт.ExitWindowsEx
. MSDN. Корпорация Майкрософт.REBOOT
. Возьмите Command / TCC Help. JP Software.
Как пояснил ultrasawblade (upvote), выключение системы - это вызов Win32 API для: ExitWindowsEx
Ссылка также содержит пример того, как осуществить отключение от C. Также вы можете сделать это из C #, используя P/Invoke (Platform Invoke). У pinvoke.net есть набор подписей, доступных для использования:http://www.pinvoke.net/default.aspx/user32/exitwindowsex.html
Это не обязательно. shutdown.exe
- это просто утилита для выключения локального или удаленного компьютера. Похоже, что shutdown.exe
использует NtShutdownsystem
Native API. Хотя Windows использует ExitWindowsEx
(как уже упоминалось).