diff options
Diffstat (limited to 'src/burn/engine/elevation.cpp')
-rw-r--r-- | src/burn/engine/elevation.cpp | 82 |
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 | ); |
190 | static HRESULT OnCachePreparePackage( | ||
191 | __in BURN_PACKAGES* pPackages, | ||
192 | __in BYTE* pbData, | ||
193 | __in SIZE_T cbData | ||
194 | ); | ||
189 | static HRESULT OnCacheCompletePayload( | 195 | static 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 | ||
621 | extern "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 | |||
641 | LExit: | ||
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 | ||
2192 | static 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 | |||
2221 | LExit: | ||
2222 | ReleaseStr(scz); | ||
2223 | |||
2224 | return hr; | ||
2225 | } | ||
2226 | |||
2156 | static HRESULT OnCacheCompletePayload( | 2227 | static 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 | ||
2263 | LExit: | 2336 | LExit: |
2264 | ReleaseStr(sczCacheDirectory); | ||
2265 | ReleaseStr(scz); | 2337 | ReleaseStr(scz); |
2266 | 2338 | ||
2267 | return hr; | 2339 | return hr; |