@@ -658,10 +658,70 @@ class ExitGuard
658
658
bool m_bArmed;
659
659
};
660
660
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
+ }
665
725
666
726
NTSTATUS
667
727
NTAPI
@@ -828,40 +888,6 @@ static bool ExecuteSysCommand( TMenuID menuCommand )
828
888
}
829
889
return true ;
830
890
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
-
865
891
case MENU_SWITCHUSER: // switch_user
866
892
if (GetWinVersion ()>=WIN_VER_WIN10)
867
893
{
@@ -877,35 +903,6 @@ static bool ExecuteSysCommand( TMenuID menuCommand )
877
903
LockWorkStation ();
878
904
return true ;
879
905
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
-
909
906
case MENU_SLEEP:
910
907
if (GetSystemMetrics (SM_REMOTESESSION))
911
908
{
@@ -965,6 +962,8 @@ static bool ExecuteSysCommand( TMenuID menuCommand )
965
962
return true ;
966
963
967
964
default :
965
+ if (ExecuteShutdownCommand (menuCommand))
966
+ return true ;
968
967
return false ;
969
968
}
970
969
}
0 commit comments