diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2022-05-03 15:30:50 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2022-05-04 10:05:21 -0500 |
commit | 29f7e00586412163a20e298fbf84505f8a917425 (patch) | |
tree | 30257a3544f6982ded159443ebed0eb933f11a51 /src/burn/engine/uithread.cpp | |
parent | 41d2c12d60ee84cefc26ec99abb328701883c8f5 (diff) | |
download | wix-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.cpp | 20 |
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 | |||
17 | struct UITHREAD_INFO | 17 | struct 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)); |