Необходим ли файл 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 (как уже упоминалось).
