summaryrefslogtreecommitdiff
path: root/src/burn/engine/uithread.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-05-03 15:30:50 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-05-04 10:05:21 -0500
commit29f7e00586412163a20e298fbf84505f8a917425 (patch)
tree30257a3544f6982ded159443ebed0eb933f11a51 /src/burn/engine/uithread.cpp
parent41d2c12d60ee84cefc26ec99abb328701883c8f5 (diff)
downloadwix-29f7e00586412163a20e298fbf84505f8a917425.tar.gz
wix-29f7e00586412163a20e298fbf84505f8a917425.tar.bz2
wix-29f7e00586412163a20e298fbf84505f8a917425.zip
Only block shutdown during Apply.
Diffstat (limited to 'src/burn/engine/uithread.cpp')
-rw-r--r--src/burn/engine/uithread.cpp20
1 files changed, 7 insertions, 13 deletions
diff --git a/src/burn/engine/uithread.cpp b/src/burn/engine/uithread.cpp
index bb1e5972..cdd8613c 100644
--- a/src/burn/engine/uithread.cpp
+++ b/src/burn/engine/uithread.cpp
@@ -17,8 +17,7 @@ struct UITHREAD_CONTEXT
17struct UITHREAD_INFO 17struct UITHREAD_INFO
18{ 18{
19 BOOL fElevatedEngine; 19 BOOL fElevatedEngine;
20 BURN_USER_EXPERIENCE* pUserExperience; 20 BURN_ENGINE_STATE* pEngineState;
21 BOOL* pfCriticalShutdownInitiated;
22}; 21};
23 22
24 23
@@ -132,8 +131,7 @@ static DWORD WINAPI ThreadProc(
132 fRegistered = TRUE; 131 fRegistered = TRUE;
133 132
134 info.fElevatedEngine = fElevatedEngine; 133 info.fElevatedEngine = fElevatedEngine;
135 info.pUserExperience = &pEngineState->userExperience; 134 info.pEngineState = pEngineState;
136 info.pfCriticalShutdownInitiated = &pEngineState->fCriticalShutdownInitiated;
137 135
138 // Create the window to handle reboots without activating it. 136 // Create the window to handle reboots without activating it.
139 hWnd = ::CreateWindowExW(WS_EX_NOACTIVATE, wc.lpszClassName, NULL, WS_POPUP, 0, 0, 0, 0, HWND_DESKTOP, NULL, pContext->hInstance, &info); 137 hWnd = ::CreateWindowExW(WS_EX_NOACTIVATE, wc.lpszClassName, NULL, WS_POPUP, 0, 0, 0, 0, HWND_DESKTOP, NULL, pContext->hInstance, &info);
@@ -196,21 +194,17 @@ static LRESULT CALLBACK WndProc(
196 { 194 {
197 DWORD dwEndSession = static_cast<DWORD>(lParam); 195 DWORD dwEndSession = static_cast<DWORD>(lParam);
198 BOOL fCritical = ENDSESSION_CRITICAL & dwEndSession; 196 BOOL fCritical = ENDSESSION_CRITICAL & dwEndSession;
199 BOOL fCancel = TRUE; 197 BOOL fCancel = FALSE;
200 BOOL fRet = FALSE; 198 BOOL fRet = FALSE;
201 199
202 // Always block shutdown in the elevated process, but ask the BA in the non-elevated. 200 // Always block shutdown during apply.
203 UITHREAD_INFO* pInfo = reinterpret_cast<UITHREAD_INFO*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); 201 UITHREAD_INFO* pInfo = reinterpret_cast<UITHREAD_INFO*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA));
204 if (!pInfo->fElevatedEngine) 202 if (pInfo->pEngineState->plan.fApplying)
205 { 203 {
206 // TODO: instead of recommending canceling all non-critical shutdowns, maybe we should only recommend cancel 204 fCancel = TRUE;
207 // when the engine is doing work?
208 fCancel = !fCritical;
209 // TODO: There's a race condition here where the BA may not have been loaded, or already was unloaded.
210 UserExperienceOnSystemShutdown(pInfo->pUserExperience, dwEndSession, &fCancel);
211 } 205 }
212 206
213 *pInfo->pfCriticalShutdownInitiated |= fCritical; 207 pInfo->pEngineState->fCriticalShutdownInitiated |= fCritical;
214 208
215 fRet = !fCancel; 209 fRet = !fCancel;
216 LogId(REPORT_STANDARD, MSG_SYSTEM_SHUTDOWN, LoggingBoolToString(fCritical), LoggingBoolToString(pInfo->fElevatedEngine), LoggingBoolToString(fRet)); 210 LogId(REPORT_STANDARD, MSG_SYSTEM_SHUTDOWN, LoggingBoolToString(fCritical), LoggingBoolToString(pInfo->fElevatedEngine), LoggingBoolToString(fRet));