Is the file
C:\windows\system32\shutdown.exe necessary to shutdown or restart Windows?
Is the file
Your question of course originates from your answer at https://codegolf.stackexchange.com/a/24011/18907 , in particular from
kinokijuf's comment upon the initial revision of your answer.
kinokijuf said, Windows is not Unix. On Unices and Linux,
shutdown is indeed involved in the full shutdown process. It is the program that sends regular warning messages to logged-in users and that writes the
/run/nologin file to prevent further logging-on a short while before the scheduled shutdown time.
On Windows NT, this is not the case.
The "Shut down" action on the "power button" on the Windows Explorer Start menu, the "Shutdown" menu option in Task Manager,
REBOOT /S in TCC or Take Command, and other applications programs that allow you to shut the system down all initiate shutdown by directly calling one of two Win32 API calls:
ExitWindowsEx(). They don't do things indirectly by running the
shutdown program. (That actually needs more code to do than just calling the Win32 API call.) The
shutdown program, when one is doing a local shutdown, calls those same Win32 API calls too.
smss that are the programs that shut down Windows NT. In particular, it is
winlogon that does the main work of processing deferred shutdown requests.
- Jonathan de Boyne Pollard (2006). The Windows NT 6 shutdown process. Frequently Given Answers.
shutdown. FreeBSD 9.2 manual pages. 2013-03-19.
systemdmanual pages. 2013. Freedesktop.org.
upstartmanual pages. 2009. Canonical Ltd.
InitiateSystemShutdownEx. MSDN. Microsoft corporation.
ExitWindowsEx. MSDN. Microsoft corporation.
REBOOT. Take Command / TCC Help. JP Software.
Explorer doesn't call this command when you shut down from the Start menu.
Shutting down the system is possible with a Win32 API call (@JdeBP's answer provides great details on that if interested). The command is just a convenient way to do it from a script, scheduled task, or the Run dialog.
As explained by ultrasawblade (upvote), the system shutdown is a Win32 API call to: ExitWindowsEx
The link also has an example on how to implement a shutdown from C. Also, you can do it from C# using P/Invoke (Platform Invoke). pinvoke.net has a bunch of signatures available for use:http://www.pinvoke.net/default.aspx/user32/exitwindowsex.html