aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/elevation.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/elevation.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/elevation.cpp')
-rw-r--r--src/burn/engine/elevation.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index d2c5c8c6..75b24ec3 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -94,6 +94,7 @@ typedef struct _BURN_ELEVATION_CHILD_MESSAGE_CONTEXT
94 HANDLE hPipe; 94 HANDLE hPipe;
95 HANDLE* phLock; 95 HANDLE* phLock;
96 BOOL* pfDisabledAutomaticUpdates; 96 BOOL* pfDisabledAutomaticUpdates;
97 BOOL* pfApplying;
97 BURN_APPROVED_EXES* pApprovedExes; 98 BURN_APPROVED_EXES* pApprovedExes;
98 BURN_CACHE* pCache; 99 BURN_CACHE* pCache;
99 BURN_CONTAINERS* pContainers; 100 BURN_CONTAINERS* pContainers;
@@ -176,6 +177,7 @@ static HRESULT OnApplyInitialize(
176 __in BURN_PACKAGES* pPackages, 177 __in BURN_PACKAGES* pPackages,
177 __in HANDLE* phLock, 178 __in HANDLE* phLock,
178 __in BOOL* pfDisabledWindowsUpdate, 179 __in BOOL* pfDisabledWindowsUpdate,
180 __in BOOL* pfApplying,
179 __in BYTE* pbData, 181 __in BYTE* pbData,
180 __in SIZE_T cbData 182 __in SIZE_T cbData
181 ); 183 );
@@ -185,7 +187,8 @@ static HRESULT ElevatedProcessDetect(
185 __in BURN_PACKAGES* pPackages 187 __in BURN_PACKAGES* pPackages
186 ); 188 );
187static HRESULT OnApplyUninitialize( 189static HRESULT OnApplyUninitialize(
188 __in HANDLE* phLock 190 __in HANDLE* phLock,
191 __in BOOL* pfApplying
189 ); 192 );
190static HRESULT OnSessionBegin( 193static HRESULT OnSessionBegin(
191 __in BURN_CACHE* pCache, 194 __in BURN_CACHE* pCache,
@@ -1538,7 +1541,8 @@ extern "C" HRESULT ElevationChildPumpMessages(
1538 __out HANDLE* phLock, 1541 __out HANDLE* phLock,
1539 __out BOOL* pfDisabledAutomaticUpdates, 1542 __out BOOL* pfDisabledAutomaticUpdates,
1540 __out DWORD* pdwChildExitCode, 1543 __out DWORD* pdwChildExitCode,
1541 __out BOOL* pfRestart 1544 __out BOOL* pfRestart,
1545 __out BOOL* pfApplying
1542 ) 1546 )
1543{ 1547{
1544 HRESULT hr = S_OK; 1548 HRESULT hr = S_OK;
@@ -1561,6 +1565,7 @@ extern "C" HRESULT ElevationChildPumpMessages(
1561 context.hPipe = hPipe; 1565 context.hPipe = hPipe;
1562 context.phLock = phLock; 1566 context.phLock = phLock;
1563 context.pfDisabledAutomaticUpdates = pfDisabledAutomaticUpdates; 1567 context.pfDisabledAutomaticUpdates = pfDisabledAutomaticUpdates;
1568 context.pfApplying = pfApplying;
1564 context.pApprovedExes = pApprovedExes; 1569 context.pApprovedExes = pApprovedExes;
1565 context.pCache = pCache; 1570 context.pCache = pCache;
1566 context.pContainers = pContainers; 1571 context.pContainers = pContainers;
@@ -2114,11 +2119,11 @@ static HRESULT ProcessElevatedChildMessage(
2114 break; 2119 break;
2115 2120
2116 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: 2121 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE:
2117 hrResult = OnApplyInitialize(pContext->hPipe, pContext->pVariables, pContext->pRegistration, pContext->pPackages, pContext->phLock, pContext->pfDisabledAutomaticUpdates, (BYTE*)pMsg->pvData, pMsg->cbData); 2122 hrResult = OnApplyInitialize(pContext->hPipe, pContext->pVariables, pContext->pRegistration, pContext->pPackages, pContext->phLock, pContext->pfDisabledAutomaticUpdates, pContext->pfApplying, (BYTE*)pMsg->pvData, pMsg->cbData);
2118 break; 2123 break;
2119 2124
2120 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_UNINITIALIZE: 2125 case BURN_ELEVATION_MESSAGE_TYPE_APPLY_UNINITIALIZE:
2121 hrResult = OnApplyUninitialize(pContext->phLock); 2126 hrResult = OnApplyUninitialize(pContext->phLock, pContext->pfApplying);
2122 break; 2127 break;
2123 2128
2124 case BURN_ELEVATION_MESSAGE_TYPE_SESSION_BEGIN: 2129 case BURN_ELEVATION_MESSAGE_TYPE_SESSION_BEGIN:
@@ -2267,6 +2272,7 @@ static HRESULT OnApplyInitialize(
2267 __in BURN_PACKAGES* pPackages, 2272 __in BURN_PACKAGES* pPackages,
2268 __in HANDLE* phLock, 2273 __in HANDLE* phLock,
2269 __in BOOL* pfDisabledWindowsUpdate, 2274 __in BOOL* pfDisabledWindowsUpdate,
2275 __in BOOL* pfApplying,
2270 __in BYTE* pbData, 2276 __in BYTE* pbData,
2271 __in SIZE_T cbData 2277 __in SIZE_T cbData
2272 ) 2278 )
@@ -2296,6 +2302,8 @@ static HRESULT OnApplyInitialize(
2296 hr = ApplyLock(TRUE, phLock); 2302 hr = ApplyLock(TRUE, phLock);
2297 ExitOnFailure(hr, "Failed to acquire lock due to setup in other session."); 2303 ExitOnFailure(hr, "Failed to acquire lock due to setup in other session.");
2298 2304
2305 *pfApplying = TRUE;
2306
2299 // Detect. 2307 // Detect.
2300 hr = ElevatedProcessDetect(pRegistration, pVariables, pPackages); 2308 hr = ElevatedProcessDetect(pRegistration, pVariables, pPackages);
2301 ExitOnFailure(hr, "Failed to run detection in elevated process."); 2309 ExitOnFailure(hr, "Failed to run detection in elevated process.");
@@ -2419,13 +2427,16 @@ LExit:
2419} 2427}
2420 2428
2421static HRESULT OnApplyUninitialize( 2429static HRESULT OnApplyUninitialize(
2422 __in HANDLE* phLock 2430 __in HANDLE* phLock,
2431 __in BOOL* pfApplying
2423 ) 2432 )
2424{ 2433{
2425 Assert(phLock); 2434 Assert(phLock);
2426 2435
2427 // TODO: end system restore point. 2436 // TODO: end system restore point.
2428 2437
2438 *pfApplying = FALSE;
2439
2429 if (*phLock) 2440 if (*phLock)
2430 { 2441 {
2431 ::ReleaseMutex(*phLock); 2442 ::ReleaseMutex(*phLock);