aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/elevation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/elevation.cpp')
-rw-r--r--src/burn/engine/elevation.cpp82
1 files changed, 77 insertions, 5 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index 9d1b8fc7..85e4b692 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -14,6 +14,7 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
14 BURN_ELEVATION_MESSAGE_TYPE_SESSION_RESUME, 14 BURN_ELEVATION_MESSAGE_TYPE_SESSION_RESUME,
15 BURN_ELEVATION_MESSAGE_TYPE_SESSION_END, 15 BURN_ELEVATION_MESSAGE_TYPE_SESSION_END,
16 BURN_ELEVATION_MESSAGE_TYPE_SAVE_STATE, 16 BURN_ELEVATION_MESSAGE_TYPE_SAVE_STATE,
17 BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE,
17 BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD, 18 BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD,
18 BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD, 19 BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD,
19 BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP, 20 BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP,
@@ -186,6 +187,11 @@ static HRESULT OnSaveState(
186 __in BYTE* pbData, 187 __in BYTE* pbData,
187 __in SIZE_T cbData 188 __in SIZE_T cbData
188 ); 189 );
190static HRESULT OnCachePreparePackage(
191 __in BURN_PACKAGES* pPackages,
192 __in BYTE* pbData,
193 __in SIZE_T cbData
194 );
189static HRESULT OnCacheCompletePayload( 195static HRESULT OnCacheCompletePayload(
190 __in HANDLE hPipe, 196 __in HANDLE hPipe,
191 __in BURN_PACKAGES* pPackages, 197 __in BURN_PACKAGES* pPackages,
@@ -612,6 +618,32 @@ LExit:
612 return hr; 618 return hr;
613} 619}
614 620
621extern "C" HRESULT ElevationCachePreparePackage(
622 __in HANDLE hPipe,
623 __in BURN_PACKAGE* pPackage
624 )
625{
626 HRESULT hr = S_OK;
627 BYTE* pbData = NULL;
628 SIZE_T cbData = 0;
629 DWORD dwResult = 0;
630
631 // Serialize message data.
632 hr = BuffWriteString(&pbData, &cbData, pPackage ? pPackage->sczId : NULL);
633 ExitOnFailure(hr, "Failed to write package id to message buffer.");
634
635 // Send message.
636 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE, pbData, cbData, NULL, NULL, &dwResult);
637 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE message to per-machine process.");
638
639 hr = (HRESULT)dwResult;
640
641LExit:
642 ReleaseBuffer(pbData);
643
644 return hr;
645}
646
615/******************************************************************* 647/*******************************************************************
616 ElevationCacheCompletePayload - 648 ElevationCacheCompletePayload -
617 649
@@ -1856,6 +1888,10 @@ static HRESULT ProcessElevatedChildCacheMessage(
1856 1888
1857 switch (pMsg->dwMessage) 1889 switch (pMsg->dwMessage)
1858 { 1890 {
1891 case BURN_ELEVATION_MESSAGE_TYPE_CACHE_PREPARE_PACKAGE:
1892 hrResult = OnCachePreparePackage(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData);
1893 break;
1894
1859 case BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD: 1895 case BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD:
1860 hrResult = OnCacheCompletePayload(pContext->hPipe, pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData); 1896 hrResult = OnCacheCompletePayload(pContext->hPipe, pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData);
1861 break; 1897 break;
@@ -2153,6 +2189,41 @@ LExit:
2153 return hr; 2189 return hr;
2154} 2190}
2155 2191
2192static HRESULT OnCachePreparePackage(
2193 __in BURN_PACKAGES* pPackages,
2194 __in BYTE* pbData,
2195 __in SIZE_T cbData
2196 )
2197{
2198 HRESULT hr = S_OK;
2199 SIZE_T iData = 0;
2200 LPWSTR scz = NULL;
2201 BURN_PACKAGE* pPackage = NULL;
2202
2203 // Deserialize message data.
2204 hr = BuffReadString(pbData, cbData, &iData, &scz);
2205 ExitOnFailure(hr, "Failed to read package id.");
2206
2207 if (scz && *scz)
2208 {
2209 hr = PackageFindById(pPackages, scz, &pPackage);
2210 ExitOnFailure(hr, "Failed to find package: %ls", scz);
2211 }
2212 else
2213 {
2214 hr = E_INVALIDARG;
2215 ExitOnRootFailure(hr, "Invalid data passed to cache prepare package.");
2216 }
2217
2218 hr = CachePreparePackage(pPackage);
2219 ExitOnFailure(hr, "Failed to prepare cache package.");
2220
2221LExit:
2222 ReleaseStr(scz);
2223
2224 return hr;
2225}
2226
2156static HRESULT OnCacheCompletePayload( 2227static HRESULT OnCacheCompletePayload(
2157 __in HANDLE hPipe, 2228 __in HANDLE hPipe,
2158 __in BURN_PACKAGES* pPackages, 2229 __in BURN_PACKAGES* pPackages,
@@ -2225,7 +2296,6 @@ static HRESULT OnCacheVerifyPayload(
2225 LPWSTR scz = NULL; 2296 LPWSTR scz = NULL;
2226 BURN_PACKAGE* pPackage = NULL; 2297 BURN_PACKAGE* pPackage = NULL;
2227 BURN_PAYLOAD* pPayload = NULL; 2298 BURN_PAYLOAD* pPayload = NULL;
2228 LPWSTR sczCacheDirectory = NULL;
2229 2299
2230 // Deserialize message data. 2300 // Deserialize message data.
2231 hr = BuffReadString(pbData, cbData, &iData, &scz); 2301 hr = BuffReadString(pbData, cbData, &iData, &scz);
@@ -2248,10 +2318,13 @@ static HRESULT OnCacheVerifyPayload(
2248 2318
2249 if (pPackage && pPayload) 2319 if (pPackage && pPayload)
2250 { 2320 {
2251 hr = CacheGetCompletedPath(TRUE, pPackage->sczCacheId, &sczCacheDirectory); 2321 if (!pPackage->sczCacheFolder)
2252 ExitOnFailure(hr, "Failed to get cached path for package with cache id: %ls", pPackage->sczCacheId); 2322 {
2323 hr = E_INVALIDSTATE;
2324 ExitOnRootFailure(hr, "Cache verify payload called without starting its package.");
2325 }
2253 2326
2254 hr = CacheVerifyPayload(pPayload, sczCacheDirectory, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe); 2327 hr = CacheVerifyPayload(pPayload, pPackage->sczCacheFolder, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe);
2255 } 2328 }
2256 else 2329 else
2257 { 2330 {
@@ -2261,7 +2334,6 @@ static HRESULT OnCacheVerifyPayload(
2261 // Nothing should be logged on failure. 2334 // Nothing should be logged on failure.
2262 2335
2263LExit: 2336LExit:
2264 ReleaseStr(sczCacheDirectory);
2265 ReleaseStr(scz); 2337 ReleaseStr(scz);
2266 2338
2267 return hr; 2339 return hr;