@@ -658,10 +658,70 @@ class ExitGuard
658658 bool m_bArmed;
659659};
660660
661- #ifndef EWX_HYBRID_SHUTDOWN
662- #define EWX_HYBRID_SHUTDOWN 0x00400000
663- #endif
664- #define EWX_INSTALL_UPDATES 0x00100000 // undocumented switch to install updates on shutdown
661+
662+ static bool ExecuteShutdownCommand (TMenuID menuCommand)
663+ {
664+ DWORD flags = 0 ;
665+
666+ switch (menuCommand)
667+ {
668+ case MENU_RESTART: // restart
669+ case MENU_RESTART_NOUPDATE:
670+ case MENU_RESTART_UPDATE: // update and restart
671+ case MENU_RESTART_ADVANCED: // advanced restart
672+ flags = SHUTDOWN_RESTART;
673+
674+ if (menuCommand == MENU_RESTART_UPDATE)
675+ flags |= SHUTDOWN_INSTALL_UPDATES;
676+
677+ if (menuCommand == MENU_RESTART_ADVANCED)
678+ {
679+ STARTUPINFO startupInfo = { sizeof (startupInfo) };
680+ PROCESS_INFORMATION processInfo;
681+ memset (&processInfo, 0 , sizeof (processInfo));
682+ wchar_t exe[_MAX_PATH] = L" %windir%\\ system32\\ shutdown.exe" ;
683+ DoEnvironmentSubst (exe, _countof (exe));
684+ if (CreateProcess (exe, (LPWSTR)L" shutdown.exe /r /o /t 0" , NULL , NULL , FALSE , CREATE_NO_WINDOW, NULL , NULL , &startupInfo, &processInfo))
685+ {
686+ CloseHandle (processInfo.hThread );
687+ CloseHandle (processInfo.hProcess );
688+ }
689+ return true ;
690+ }
691+ break ;
692+
693+ case MENU_SHUTDOWN: // shutdown
694+ case MENU_SHUTDOWN_NOUPDATE:
695+ case MENU_SHUTDOWN_UPDATE: // update and shutdown
696+ case MENU_SHUTDOWN_HYBRID: // hybrid shutdown
697+ flags = SHUTDOWN_POWEROFF;
698+
699+ if (menuCommand == MENU_SHUTDOWN_UPDATE)
700+ flags |= SHUTDOWN_INSTALL_UPDATES;
701+
702+ if (menuCommand == MENU_SHUTDOWN_HYBRID)
703+ {
704+ CRegKey regPower;
705+ if (regPower.Open (HKEY_LOCAL_MACHINE, L" SYSTEM\\ CurrentControlSet\\ Control\\ Session Manager\\ Power" , KEY_READ) == ERROR_SUCCESS)
706+ {
707+ DWORD val = 0 ;
708+ if (regPower.QueryDWORDValue (L" HiberbootEnabled" , val) == ERROR_SUCCESS && val == 1 )
709+ flags |= SHUTDOWN_HYBRID;
710+ }
711+ }
712+ break ;
713+ }
714+
715+ if (flags)
716+ {
717+ SetShutdownPrivileges ();
718+ InitiateShutdown (NULL , NULL , 0 , flags, SHTDN_REASON_FLAG_PLANNED);
719+
720+ return true ;
721+ }
722+
723+ return false ;
724+ }
665725
666726NTSTATUS
667727NTAPI
@@ -828,40 +888,6 @@ static bool ExecuteSysCommand( TMenuID menuCommand )
828888 }
829889 return true ;
830890
831- case MENU_RESTART: // restart
832- case MENU_RESTART_NOUPDATE:
833- SetShutdownPrivileges ();
834- ExitWindowsEx (EWX_REBOOT,SHTDN_REASON_FLAG_PLANNED);
835- return true ;
836-
837- case MENU_RESTART_ADVANCED: // advanced restart
838- if (GetWinVersion ()>=WIN_VER_WIN8)
839- {
840- STARTUPINFO startupInfo={sizeof (startupInfo)};
841- PROCESS_INFORMATION processInfo;
842- memset (&processInfo,0 ,sizeof (processInfo));
843- wchar_t exe[_MAX_PATH]=L" %windir%\\ system32\\ shutdown.exe" ;
844- DoEnvironmentSubst (exe,_countof (exe));
845- if (CreateProcess (exe,(LPWSTR)L" shutdown.exe /r /o /t 0" ,NULL ,NULL ,FALSE ,CREATE_NO_WINDOW,NULL ,NULL ,&startupInfo,&processInfo))
846- {
847- CloseHandle (processInfo.hThread );
848- CloseHandle (processInfo.hProcess );
849- }
850- }
851- else
852- ExitWindowsEx (EWX_REBOOT,SHTDN_REASON_FLAG_PLANNED);
853- return true ;
854-
855- case MENU_RESTART_UPDATE: // update and restart
856- {
857- UINT flags=EWX_REBOOT;
858- if (GetWinVersion ()>=WIN_VER_WIN8)
859- flags|=EWX_INSTALL_UPDATES;
860- SetShutdownPrivileges ();
861- ExitWindowsEx (flags,SHTDN_REASON_FLAG_PLANNED);
862- }
863- return true ;
864-
865891 case MENU_SWITCHUSER: // switch_user
866892 if (GetWinVersion ()>=WIN_VER_WIN10)
867893 {
@@ -877,35 +903,6 @@ static bool ExecuteSysCommand( TMenuID menuCommand )
877903 LockWorkStation ();
878904 return true ;
879905
880- case MENU_SHUTDOWN: // shutdown
881- case MENU_SHUTDOWN_NOUPDATE:
882- SetShutdownPrivileges ();
883- ExitWindowsEx (EWX_SHUTDOWN,SHTDN_REASON_FLAG_PLANNED);
884- return true ;
885-
886- case MENU_SHUTDOWN_UPDATE: // update and shutdown
887- SetShutdownPrivileges ();
888- ExitWindowsEx (EWX_SHUTDOWN|EWX_INSTALL_UPDATES,SHTDN_REASON_FLAG_PLANNED);
889- return true ;
890-
891- case MENU_SHUTDOWN_HYBRID: // hybrid shutdown
892- SetShutdownPrivileges ();
893- {
894- UINT flags=EWX_SHUTDOWN;
895- if (GetWinVersion ()>=WIN_VER_WIN8)
896- {
897- CRegKey regPower;
898- if (regPower.Open (HKEY_LOCAL_MACHINE,L" SYSTEM\\ CurrentControlSet\\ Control\\ Session Manager\\ Power" ,KEY_READ)==ERROR_SUCCESS)
899- {
900- DWORD val;
901- if (regPower.QueryDWORDValue (L" HiberbootEnabled" ,val)==ERROR_SUCCESS && val==1 )
902- flags|=EWX_HYBRID_SHUTDOWN;
903- }
904- }
905- ExitWindowsEx (flags,SHTDN_REASON_FLAG_PLANNED);
906- }
907- return true ;
908-
909906 case MENU_SLEEP:
910907 if (GetSystemMetrics (SM_REMOTESESSION))
911908 {
@@ -965,6 +962,8 @@ static bool ExecuteSysCommand( TMenuID menuCommand )
965962 return true ;
966963
967964 default :
965+ if (ExecuteShutdownCommand (menuCommand))
966+ return true ;
968967 return false ;
969968 }
970969}
0 commit comments