Skip to content

Commit c541032

Browse files
committed
Use InitiateShutdown instead of ExitWindowsEx for shutdown/restart
Windows start menu uses it that way too. ExitWindowsEx is also annotated as legacy API in SDK. We will also put shutdown handling into separate function, so that we have it handled at one place (will make further changes easier).
1 parent db0e768 commit c541032

File tree

1 file changed

+66
-67
lines changed

1 file changed

+66
-67
lines changed

Src/StartMenu/StartMenuDLL/MenuCommands.cpp

Lines changed: 66 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -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

666726
NTSTATUS
667727
NTAPI
@@ -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

Comments
 (0)