From 47567abf279faefd48ad1bec8dc48ffc06eaab61 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 22 May 2018 17:35:33 +0200 Subject: [PATCH] [MSGINA] Do not try to impersonate the user on shutdown when we are already logged off --- dll/win32/msgina/gui.c | 43 ++++++++++++++++++++++--------------- dll/win32/msgina/msgina.h | 6 ++++++ dll/win32/msgina/shutdown.c | 18 ++++++++++++++++ 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/dll/win32/msgina/gui.c b/dll/win32/msgina/gui.c index c520f07b316..1e1069eb27c 100644 --- a/dll/win32/msgina/gui.c +++ b/dll/win32/msgina/gui.c @@ -624,31 +624,40 @@ OnShutDown( INT ret; DWORD ShutdownOptions; - if (ImpersonateLoggedOnUser(pgContext->UserToken)) + TRACE("OnShutDown(%p %p)\n", hwndDlg, pgContext); + + pgContext->nShutdownAction = GetDefaultShutdownSelState(); + ShutdownOptions = GetDefaultShutdownOptions(); + + if (pgContext->UserToken != NULL) { - pgContext->nShutdownAction = LoadShutdownSelState(); - ShutdownOptions = GetAllowedShutdownOptions(); - RevertToSelf(); - } - else - { - ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError()); - pgContext->nShutdownAction = 0; - ShutdownOptions = 0; + if (ImpersonateLoggedOnUser(pgContext->UserToken)) + { + pgContext->nShutdownAction = LoadShutdownSelState(); + ShutdownOptions = GetAllowedShutdownOptions(); + RevertToSelf(); + } + else + { + ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError()); + } } ret = ShutdownDialog(hwndDlg, ShutdownOptions, pgContext); if (ret == IDOK) { - if (ImpersonateLoggedOnUser(pgContext->UserToken)) + if (pgContext->UserToken != NULL) { - SaveShutdownSelState(pgContext->nShutdownAction); - RevertToSelf(); - } - else - { - ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError()); + if (ImpersonateLoggedOnUser(pgContext->UserToken)) + { + SaveShutdownSelState(pgContext->nShutdownAction); + RevertToSelf(); + } + else + { + ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError()); + } } } diff --git a/dll/win32/msgina/msgina.h b/dll/win32/msgina/msgina.h index 19eabf9eb34..e2b6b5bfb46 100644 --- a/dll/win32/msgina/msgina.h +++ b/dll/win32/msgina/msgina.h @@ -132,12 +132,18 @@ CreateProfile( /* shutdown.c */ +DWORD +GetDefaultShutdownSelState(VOID); + DWORD LoadShutdownSelState(VOID); VOID SaveShutdownSelState(DWORD ShutdownCode); +DWORD +GetDefaultShutdownOptions(VOID); + DWORD GetAllowedShutdownOptions(VOID); diff --git a/dll/win32/msgina/shutdown.c b/dll/win32/msgina/shutdown.c index ca2528a7bbb..1351eabc142 100644 --- a/dll/win32/msgina/shutdown.c +++ b/dll/win32/msgina/shutdown.c @@ -90,6 +90,11 @@ GetShutdownReasonUI(VOID) // return (VersionInfo.wProductType == VER_NT_WORKSTATION) ? FALSE : TRUE; } +DWORD +GetDefaultShutdownSelState(VOID) +{ + return WLX_SAS_ACTION_SHUTDOWN_POWER_OFF; +} DWORD LoadShutdownSelState(VOID) @@ -211,6 +216,12 @@ SaveShutdownSelState( RegCloseKey(hKey); } +DWORD +GetDefaultShutdownOptions(VOID) +{ + return WLX_SHUTDOWN_STATE_POWER_OFF | WLX_SHUTDOWN_STATE_REBOOT; +} + DWORD GetAllowedShutdownOptions(VOID) { @@ -271,6 +282,13 @@ UpdateShutdownDesc( LoadStringW(pContext->pgContext->hDllInstance, DescId, szBuffer, _countof(szBuffer)); SetDlgItemTextW(hDlg, IDC_SHUTDOWN_DESCRIPTION, szBuffer); + + if (pContext->bReasonUI) + { + EnableWindow(GetDlgItem(hDlg, IDC_REASON_PLANNED), (ShutdownCode != WLX_SAS_ACTION_LOGOFF)); + EnableWindow(GetDlgItem(hDlg, IDC_REASON_LIST), (ShutdownCode != WLX_SAS_ACTION_LOGOFF)); + EnableWindow(GetDlgItem(hDlg, IDC_REASON_COMMENT), (ShutdownCode != WLX_SAS_ACTION_LOGOFF)); + } } static VOID