diff options
Diffstat (limited to '')
-rw-r--r-- | src/engine/elevation.cpp | 253 |
1 files changed, 244 insertions, 9 deletions
diff --git a/src/engine/elevation.cpp b/src/engine/elevation.cpp index 502c5462..3a448923 100644 --- a/src/engine/elevation.cpp +++ b/src/engine/elevation.cpp | |||
@@ -35,11 +35,15 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE | |||
35 | BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_COMPLETE, | 35 | BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_PAUSE_AU_COMPLETE, |
36 | BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_BEGIN, | 36 | BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_BEGIN, |
37 | BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_COMPLETE, | 37 | BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE_SYSTEM_RESTORE_POINT_COMPLETE, |
38 | BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_BEGIN, | ||
39 | BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_COMPLETE, | ||
40 | BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_SUCCESS, | ||
38 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS, | 41 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS, |
39 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR, | 42 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR, |
40 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE, | 43 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE, |
41 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE, | 44 | BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE, |
42 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE_PROCESSID, | 45 | BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE_PROCESSID, |
46 | BURN_ELEVATION_MESSAGE_TYPE_PROGRESS_ROUTINE, | ||
43 | } BURN_ELEVATION_MESSAGE_TYPE; | 47 | } BURN_ELEVATION_MESSAGE_TYPE; |
44 | 48 | ||
45 | 49 | ||
@@ -52,6 +56,13 @@ typedef struct _BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT | |||
52 | BOOL fSrpCompleteNeeded; | 56 | BOOL fSrpCompleteNeeded; |
53 | } BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT; | 57 | } BURN_ELEVATION_APPLY_INITIALIZE_MESSAGE_CONTEXT; |
54 | 58 | ||
59 | typedef struct _BURN_ELEVATION_CACHE_MESSAGE_CONTEXT | ||
60 | { | ||
61 | PFN_BURNCACHEMESSAGEHANDLER pfnCacheMessageHandler; | ||
62 | LPPROGRESS_ROUTINE pfnProgress; | ||
63 | LPVOID pvContext; | ||
64 | } BURN_ELEVATION_CACHE_MESSAGE_CONTEXT; | ||
65 | |||
55 | typedef struct _BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT | 66 | typedef struct _BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT |
56 | { | 67 | { |
57 | PFN_GENERICMESSAGEHANDLER pfnGenericMessageHandler; | 68 | PFN_GENERICMESSAGEHANDLER pfnGenericMessageHandler; |
@@ -99,6 +110,11 @@ static HRESULT ProcessApplyInitializeMessages( | |||
99 | __in_opt LPVOID pvContext, | 110 | __in_opt LPVOID pvContext, |
100 | __out DWORD* pdwResult | 111 | __out DWORD* pdwResult |
101 | ); | 112 | ); |
113 | static HRESULT ProcessBurnCacheMessages( | ||
114 | __in BURN_PIPE_MESSAGE* pMsg, | ||
115 | __in LPVOID pvContext, | ||
116 | __out DWORD* pdwResult | ||
117 | ); | ||
102 | static HRESULT ProcessGenericExecuteMessages( | 118 | static HRESULT ProcessGenericExecuteMessages( |
103 | __in BURN_PIPE_MESSAGE* pMsg, | 119 | __in BURN_PIPE_MESSAGE* pMsg, |
104 | __in LPVOID pvContext, | 120 | __in LPVOID pvContext, |
@@ -114,6 +130,12 @@ static HRESULT ProcessLaunchApprovedExeMessages( | |||
114 | __in_opt LPVOID pvContext, | 130 | __in_opt LPVOID pvContext, |
115 | __out DWORD* pdwResult | 131 | __out DWORD* pdwResult |
116 | ); | 132 | ); |
133 | static HRESULT ProcessProgressRoutineMessage( | ||
134 | __in BURN_PIPE_MESSAGE* pMsg, | ||
135 | __in LPPROGRESS_ROUTINE pfnProgress, | ||
136 | __in LPVOID pvContext, | ||
137 | __out DWORD* pdwResult | ||
138 | ); | ||
117 | static HRESULT ProcessElevatedChildMessage( | 139 | static HRESULT ProcessElevatedChildMessage( |
118 | __in BURN_PIPE_MESSAGE* pMsg, | 140 | __in BURN_PIPE_MESSAGE* pMsg, |
119 | __in_opt LPVOID pvContext, | 141 | __in_opt LPVOID pvContext, |
@@ -165,12 +187,14 @@ static HRESULT OnSaveState( | |||
165 | __in DWORD cbData | 187 | __in DWORD cbData |
166 | ); | 188 | ); |
167 | static HRESULT OnCacheCompletePayload( | 189 | static HRESULT OnCacheCompletePayload( |
190 | __in HANDLE hPipe, | ||
168 | __in BURN_PACKAGES* pPackages, | 191 | __in BURN_PACKAGES* pPackages, |
169 | __in BURN_PAYLOADS* pPayloads, | 192 | __in BURN_PAYLOADS* pPayloads, |
170 | __in BYTE* pbData, | 193 | __in BYTE* pbData, |
171 | __in DWORD cbData | 194 | __in DWORD cbData |
172 | ); | 195 | ); |
173 | static HRESULT OnCacheVerifyPayload( | 196 | static HRESULT OnCacheVerifyPayload( |
197 | __in HANDLE hPipe, | ||
174 | __in BURN_PACKAGES* pPackages, | 198 | __in BURN_PACKAGES* pPackages, |
175 | __in BURN_PAYLOADS* pPayloads, | 199 | __in BURN_PAYLOADS* pPayloads, |
176 | __in BYTE* pbData, | 200 | __in BYTE* pbData, |
@@ -225,6 +249,21 @@ static HRESULT OnExecutePackageDependencyAction( | |||
225 | __in BYTE* pbData, | 249 | __in BYTE* pbData, |
226 | __in DWORD cbData | 250 | __in DWORD cbData |
227 | ); | 251 | ); |
252 | static HRESULT CALLBACK BurnCacheMessageHandler( | ||
253 | __in BURN_CACHE_MESSAGE* pMessage, | ||
254 | __in LPVOID pvContext | ||
255 | ); | ||
256 | static DWORD CALLBACK ElevatedProgressRoutine( | ||
257 | __in LARGE_INTEGER TotalFileSize, | ||
258 | __in LARGE_INTEGER TotalBytesTransferred, | ||
259 | __in LARGE_INTEGER StreamSize, | ||
260 | __in LARGE_INTEGER StreamBytesTransferred, | ||
261 | __in DWORD dwStreamNumber, | ||
262 | __in DWORD dwCallbackReason, | ||
263 | __in HANDLE hSourceFile, | ||
264 | __in HANDLE hDestinationFile, | ||
265 | __in_opt LPVOID lpData | ||
266 | ); | ||
228 | static int GenericExecuteMessageHandler( | 267 | static int GenericExecuteMessageHandler( |
229 | __in GENERIC_EXECUTE_MESSAGE* pMessage, | 268 | __in GENERIC_EXECUTE_MESSAGE* pMessage, |
230 | __in LPVOID pvContext | 269 | __in LPVOID pvContext |
@@ -582,13 +621,21 @@ extern "C" HRESULT ElevationCacheCompletePayload( | |||
582 | __in BURN_PACKAGE* pPackage, | 621 | __in BURN_PACKAGE* pPackage, |
583 | __in BURN_PAYLOAD* pPayload, | 622 | __in BURN_PAYLOAD* pPayload, |
584 | __in_z LPCWSTR wzUnverifiedPath, | 623 | __in_z LPCWSTR wzUnverifiedPath, |
585 | __in BOOL fMove | 624 | __in BOOL fMove, |
625 | __in PFN_BURNCACHEMESSAGEHANDLER pfnCacheMessageHandler, | ||
626 | __in LPPROGRESS_ROUTINE pfnProgress, | ||
627 | __in LPVOID pContext | ||
586 | ) | 628 | ) |
587 | { | 629 | { |
588 | HRESULT hr = S_OK; | 630 | HRESULT hr = S_OK; |
589 | BYTE* pbData = NULL; | 631 | BYTE* pbData = NULL; |
590 | SIZE_T cbData = 0; | 632 | SIZE_T cbData = 0; |
591 | DWORD dwResult = 0; | 633 | DWORD dwResult = 0; |
634 | BURN_ELEVATION_CACHE_MESSAGE_CONTEXT context = { }; | ||
635 | |||
636 | context.pfnCacheMessageHandler = pfnCacheMessageHandler; | ||
637 | context.pfnProgress = pfnProgress; | ||
638 | context.pvContext = pContext; | ||
592 | 639 | ||
593 | // serialize message data | 640 | // serialize message data |
594 | hr = BuffWriteString(&pbData, &cbData, pPackage->sczId); | 641 | hr = BuffWriteString(&pbData, &cbData, pPackage->sczId); |
@@ -604,7 +651,7 @@ extern "C" HRESULT ElevationCacheCompletePayload( | |||
604 | ExitOnFailure(hr, "Failed to write move flag to message buffer."); | 651 | ExitOnFailure(hr, "Failed to write move flag to message buffer."); |
605 | 652 | ||
606 | // send message | 653 | // send message |
607 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD, pbData, cbData, NULL, NULL, &dwResult); | 654 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD, pbData, cbData, ProcessBurnCacheMessages, &context, &dwResult); |
608 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD message to per-machine process."); | 655 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD message to per-machine process."); |
609 | 656 | ||
610 | hr = (HRESULT)dwResult; | 657 | hr = (HRESULT)dwResult; |
@@ -618,13 +665,21 @@ LExit: | |||
618 | extern "C" HRESULT ElevationCacheVerifyPayload( | 665 | extern "C" HRESULT ElevationCacheVerifyPayload( |
619 | __in HANDLE hPipe, | 666 | __in HANDLE hPipe, |
620 | __in BURN_PACKAGE* pPackage, | 667 | __in BURN_PACKAGE* pPackage, |
621 | __in BURN_PAYLOAD* pPayload | 668 | __in BURN_PAYLOAD* pPayload, |
669 | __in PFN_BURNCACHEMESSAGEHANDLER pfnCacheMessageHandler, | ||
670 | __in LPPROGRESS_ROUTINE pfnProgress, | ||
671 | __in LPVOID pContext | ||
622 | ) | 672 | ) |
623 | { | 673 | { |
624 | HRESULT hr = S_OK; | 674 | HRESULT hr = S_OK; |
625 | BYTE* pbData = NULL; | 675 | BYTE* pbData = NULL; |
626 | SIZE_T cbData = 0; | 676 | SIZE_T cbData = 0; |
627 | DWORD dwResult = 0; | 677 | DWORD dwResult = 0; |
678 | BURN_ELEVATION_CACHE_MESSAGE_CONTEXT context = { }; | ||
679 | |||
680 | context.pfnCacheMessageHandler = pfnCacheMessageHandler; | ||
681 | context.pfnProgress = pfnProgress; | ||
682 | context.pvContext = pContext; | ||
628 | 683 | ||
629 | // serialize message data | 684 | // serialize message data |
630 | hr = BuffWriteString(&pbData, &cbData, pPackage->sczId); | 685 | hr = BuffWriteString(&pbData, &cbData, pPackage->sczId); |
@@ -634,7 +689,7 @@ extern "C" HRESULT ElevationCacheVerifyPayload( | |||
634 | ExitOnFailure(hr, "Failed to write payload id to message buffer."); | 689 | ExitOnFailure(hr, "Failed to write payload id to message buffer."); |
635 | 690 | ||
636 | // send message | 691 | // send message |
637 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD, pbData, cbData, NULL, NULL, &dwResult); | 692 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD, pbData, cbData, ProcessBurnCacheMessages, &context, &dwResult); |
638 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD message to per-machine process."); | 693 | ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD message to per-machine process."); |
639 | 694 | ||
640 | hr = (HRESULT)dwResult; | 695 | hr = (HRESULT)dwResult; |
@@ -1377,6 +1432,69 @@ LExit: | |||
1377 | return hr; | 1432 | return hr; |
1378 | } | 1433 | } |
1379 | 1434 | ||
1435 | static HRESULT ProcessBurnCacheMessages( | ||
1436 | __in BURN_PIPE_MESSAGE* pMsg, | ||
1437 | __in LPVOID pvContext, | ||
1438 | __out DWORD* pdwResult | ||
1439 | ) | ||
1440 | { | ||
1441 | HRESULT hr = S_OK; | ||
1442 | SIZE_T iData = 0; | ||
1443 | BURN_ELEVATION_CACHE_MESSAGE_CONTEXT* pContext = static_cast<BURN_ELEVATION_CACHE_MESSAGE_CONTEXT*>(pvContext); | ||
1444 | BURN_CACHE_MESSAGE message = { }; | ||
1445 | BOOL fProgressRoutine = FALSE; | ||
1446 | |||
1447 | // Process the message. | ||
1448 | switch (pMsg->dwMessage) | ||
1449 | { | ||
1450 | case BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_BEGIN: | ||
1451 | // read message parameters | ||
1452 | hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, reinterpret_cast<DWORD*>(&message.begin.cacheStep)); | ||
1453 | ExitOnFailure(hr, "Failed to read begin cache step."); | ||
1454 | |||
1455 | message.type = BURN_CACHE_MESSAGE_BEGIN; | ||
1456 | break; | ||
1457 | |||
1458 | case BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_COMPLETE: | ||
1459 | // read message parameters | ||
1460 | hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, reinterpret_cast<DWORD*>(&message.complete.hrStatus)); | ||
1461 | ExitOnFailure(hr, "Failed to read complete hresult."); | ||
1462 | |||
1463 | message.type = BURN_CACHE_MESSAGE_COMPLETE; | ||
1464 | break; | ||
1465 | |||
1466 | case BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_SUCCESS: | ||
1467 | // read message parameters | ||
1468 | hr = BuffReadNumber64((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.success.qwFileSize); | ||
1469 | ExitOnFailure(hr, "Failed to read begin cache step."); | ||
1470 | |||
1471 | message.type = BURN_CACHE_MESSAGE_SUCCESS; | ||
1472 | break; | ||
1473 | |||
1474 | case BURN_ELEVATION_MESSAGE_TYPE_PROGRESS_ROUTINE: | ||
1475 | fProgressRoutine = TRUE; | ||
1476 | break; | ||
1477 | |||
1478 | default: | ||
1479 | hr = E_INVALIDARG; | ||
1480 | ExitOnRootFailure(hr, "Invalid burn cache message."); | ||
1481 | break; | ||
1482 | } | ||
1483 | |||
1484 | if (fProgressRoutine) | ||
1485 | { | ||
1486 | hr = ProcessProgressRoutineMessage(pMsg, pContext->pfnProgress, pContext->pvContext, pdwResult); | ||
1487 | } | ||
1488 | else | ||
1489 | { | ||
1490 | hr = pContext->pfnCacheMessageHandler(&message, pContext->pvContext); | ||
1491 | *pdwResult = static_cast<DWORD>(hr); | ||
1492 | } | ||
1493 | |||
1494 | LExit: | ||
1495 | return hr; | ||
1496 | } | ||
1497 | |||
1380 | static HRESULT ProcessGenericExecuteMessages( | 1498 | static HRESULT ProcessGenericExecuteMessages( |
1381 | __in BURN_PIPE_MESSAGE* pMsg, | 1499 | __in BURN_PIPE_MESSAGE* pMsg, |
1382 | __in LPVOID pvContext, | 1500 | __in LPVOID pvContext, |
@@ -1596,11 +1714,41 @@ LExit: | |||
1596 | return hr; | 1714 | return hr; |
1597 | } | 1715 | } |
1598 | 1716 | ||
1717 | static HRESULT ProcessProgressRoutineMessage( | ||
1718 | __in BURN_PIPE_MESSAGE* pMsg, | ||
1719 | __in LPPROGRESS_ROUTINE pfnProgress, | ||
1720 | __in LPVOID pvContext, | ||
1721 | __out DWORD* pdwResult | ||
1722 | ) | ||
1723 | { | ||
1724 | HRESULT hr = S_OK; | ||
1725 | SIZE_T iData = 0; | ||
1726 | LARGE_INTEGER liTotalFileSize = { }; | ||
1727 | LARGE_INTEGER liTotalBytesTransferred = { }; | ||
1728 | LARGE_INTEGER liStreamSize = { }; | ||
1729 | LARGE_INTEGER liStreamBytesTransferred = { }; | ||
1730 | DWORD dwStreamNumber = 0; | ||
1731 | DWORD dwCallbackReason = CALLBACK_CHUNK_FINISHED; | ||
1732 | HANDLE hSourceFile = INVALID_HANDLE_VALUE; | ||
1733 | HANDLE hDestinationFile = INVALID_HANDLE_VALUE; | ||
1734 | |||
1735 | hr = BuffReadNumber64((BYTE*)pMsg->pvData, pMsg->cbData, &iData, reinterpret_cast<DWORD64*>(&liTotalFileSize.QuadPart)); | ||
1736 | ExitOnFailure(hr, "Failed to read total file size for progress."); | ||
1737 | |||
1738 | hr = BuffReadNumber64((BYTE*)pMsg->pvData, pMsg->cbData, &iData, reinterpret_cast<DWORD64*>(&liTotalBytesTransferred.QuadPart)); | ||
1739 | ExitOnFailure(hr, "Failed to read total bytes transferred for progress."); | ||
1740 | |||
1741 | *pdwResult = pfnProgress(liTotalFileSize, liTotalBytesTransferred, liStreamSize, liStreamBytesTransferred, dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile, pvContext); | ||
1742 | |||
1743 | LExit: | ||
1744 | return hr; | ||
1745 | } | ||
1746 | |||
1599 | static HRESULT ProcessElevatedChildMessage( | 1747 | static HRESULT ProcessElevatedChildMessage( |
1600 | __in BURN_PIPE_MESSAGE* pMsg, | 1748 | __in BURN_PIPE_MESSAGE* pMsg, |
1601 | __in_opt LPVOID pvContext, | 1749 | __in_opt LPVOID pvContext, |
1602 | __out DWORD* pdwResult | 1750 | __out DWORD* pdwResult |
1603 | ) | 1751 | ) |
1604 | { | 1752 | { |
1605 | HRESULT hr = S_OK; | 1753 | HRESULT hr = S_OK; |
1606 | BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext = static_cast<BURN_ELEVATION_CHILD_MESSAGE_CONTEXT*>(pvContext); | 1754 | BURN_ELEVATION_CHILD_MESSAGE_CONTEXT* pContext = static_cast<BURN_ELEVATION_CHILD_MESSAGE_CONTEXT*>(pvContext); |
@@ -1705,11 +1853,11 @@ static HRESULT ProcessElevatedChildCacheMessage( | |||
1705 | switch (pMsg->dwMessage) | 1853 | switch (pMsg->dwMessage) |
1706 | { | 1854 | { |
1707 | case BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD: | 1855 | case BURN_ELEVATION_MESSAGE_TYPE_CACHE_COMPLETE_PAYLOAD: |
1708 | hrResult = OnCacheCompletePayload(pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData); | 1856 | hrResult = OnCacheCompletePayload(pContext->hPipe, pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData); |
1709 | break; | 1857 | break; |
1710 | 1858 | ||
1711 | case BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD: | 1859 | case BURN_ELEVATION_MESSAGE_TYPE_CACHE_VERIFY_PAYLOAD: |
1712 | hrResult = OnCacheVerifyPayload(pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData); | 1860 | hrResult = OnCacheVerifyPayload(pContext->hPipe, pContext->pPackages, pContext->pPayloads, (BYTE*)pMsg->pvData, pMsg->cbData); |
1713 | break; | 1861 | break; |
1714 | 1862 | ||
1715 | case BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP: | 1863 | case BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP: |
@@ -2002,6 +2150,7 @@ LExit: | |||
2002 | } | 2150 | } |
2003 | 2151 | ||
2004 | static HRESULT OnCacheCompletePayload( | 2152 | static HRESULT OnCacheCompletePayload( |
2153 | __in HANDLE hPipe, | ||
2005 | __in BURN_PACKAGES* pPackages, | 2154 | __in BURN_PACKAGES* pPackages, |
2006 | __in BURN_PAYLOADS* pPayloads, | 2155 | __in BURN_PAYLOADS* pPayloads, |
2007 | __in BYTE* pbData, | 2156 | __in BYTE* pbData, |
@@ -2043,7 +2192,7 @@ static HRESULT OnCacheCompletePayload( | |||
2043 | 2192 | ||
2044 | if (pPackage && pPayload) // complete payload. | 2193 | if (pPackage && pPayload) // complete payload. |
2045 | { | 2194 | { |
2046 | hr = CacheCompletePayload(pPackage->fPerMachine, pPayload, pPackage->sczCacheId, sczUnverifiedPath, fMove); | 2195 | hr = CacheCompletePayload(pPackage->fPerMachine, pPayload, pPackage->sczCacheId, sczUnverifiedPath, fMove, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe); |
2047 | ExitOnFailure(hr, "Failed to cache payload: %ls", pPayload->sczKey); | 2196 | ExitOnFailure(hr, "Failed to cache payload: %ls", pPayload->sczKey); |
2048 | } | 2197 | } |
2049 | else | 2198 | else |
@@ -2060,6 +2209,7 @@ LExit: | |||
2060 | } | 2209 | } |
2061 | 2210 | ||
2062 | static HRESULT OnCacheVerifyPayload( | 2211 | static HRESULT OnCacheVerifyPayload( |
2212 | __in HANDLE hPipe, | ||
2063 | __in BURN_PACKAGES* pPackages, | 2213 | __in BURN_PACKAGES* pPackages, |
2064 | __in BURN_PAYLOADS* pPayloads, | 2214 | __in BURN_PAYLOADS* pPayloads, |
2065 | __in BYTE* pbData, | 2215 | __in BYTE* pbData, |
@@ -2097,7 +2247,7 @@ static HRESULT OnCacheVerifyPayload( | |||
2097 | hr = CacheGetCompletedPath(TRUE, pPackage->sczCacheId, &sczCacheDirectory); | 2247 | hr = CacheGetCompletedPath(TRUE, pPackage->sczCacheId, &sczCacheDirectory); |
2098 | ExitOnFailure(hr, "Failed to get cached path for package with cache id: %ls", pPackage->sczCacheId); | 2248 | ExitOnFailure(hr, "Failed to get cached path for package with cache id: %ls", pPackage->sczCacheId); |
2099 | 2249 | ||
2100 | hr = CacheVerifyPayload(pPayload, sczCacheDirectory); | 2250 | hr = CacheVerifyPayload(pPayload, sczCacheDirectory, BurnCacheMessageHandler, ElevatedProgressRoutine, hPipe); |
2101 | } | 2251 | } |
2102 | else | 2252 | else |
2103 | { | 2253 | { |
@@ -2573,6 +2723,91 @@ LExit: | |||
2573 | return hr; | 2723 | return hr; |
2574 | } | 2724 | } |
2575 | 2725 | ||
2726 | static HRESULT CALLBACK BurnCacheMessageHandler( | ||
2727 | __in BURN_CACHE_MESSAGE* pMessage, | ||
2728 | __in LPVOID pvContext | ||
2729 | ) | ||
2730 | { | ||
2731 | HRESULT hr = S_OK; | ||
2732 | DWORD dwResult = 0; | ||
2733 | HANDLE hPipe = (HANDLE)pvContext; | ||
2734 | BYTE* pbData = NULL; | ||
2735 | SIZE_T cbData = 0; | ||
2736 | DWORD dwMessage = 0; | ||
2737 | |||
2738 | switch (pMessage->type) | ||
2739 | { | ||
2740 | case BURN_CACHE_MESSAGE_BEGIN: | ||
2741 | // serialize message data | ||
2742 | hr = BuffWriteNumber(&pbData, &cbData, pMessage->begin.cacheStep); | ||
2743 | ExitOnFailure(hr, "Failed to write progress percentage to message buffer."); | ||
2744 | |||
2745 | dwMessage = BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_BEGIN; | ||
2746 | break; | ||
2747 | |||
2748 | case BURN_CACHE_MESSAGE_COMPLETE: | ||
2749 | // serialize message data | ||
2750 | hr = BuffWriteNumber(&pbData, &cbData, pMessage->complete.hrStatus); | ||
2751 | ExitOnFailure(hr, "Failed to write error code to message buffer."); | ||
2752 | |||
2753 | dwMessage = BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_COMPLETE; | ||
2754 | break; | ||
2755 | |||
2756 | case BURN_CACHE_MESSAGE_SUCCESS: | ||
2757 | hr = BuffWriteNumber64(&pbData, &cbData, pMessage->success.qwFileSize); | ||
2758 | ExitOnFailure(hr, "Failed to count of files in use to message buffer."); | ||
2759 | |||
2760 | dwMessage = BURN_ELEVATION_MESSAGE_TYPE_BURN_CACHE_SUCCESS; | ||
2761 | break; | ||
2762 | } | ||
2763 | |||
2764 | // send message | ||
2765 | hr = PipeSendMessage(hPipe, dwMessage, pbData, cbData, NULL, NULL, &dwResult); | ||
2766 | ExitOnFailure(hr, "Failed to send burn cache message to per-user process."); | ||
2767 | |||
2768 | hr = dwResult; | ||
2769 | |||
2770 | LExit: | ||
2771 | ReleaseBuffer(pbData); | ||
2772 | |||
2773 | return hr; | ||
2774 | } | ||
2775 | |||
2776 | static DWORD CALLBACK ElevatedProgressRoutine( | ||
2777 | __in LARGE_INTEGER TotalFileSize, | ||
2778 | __in LARGE_INTEGER TotalBytesTransferred, | ||
2779 | __in LARGE_INTEGER /*StreamSize*/, | ||
2780 | __in LARGE_INTEGER /*StreamBytesTransferred*/, | ||
2781 | __in DWORD /*dwStreamNumber*/, | ||
2782 | __in DWORD /*dwCallbackReason*/, | ||
2783 | __in HANDLE /*hSourceFile*/, | ||
2784 | __in HANDLE /*hDestinationFile*/, | ||
2785 | __in_opt LPVOID lpData | ||
2786 | ) | ||
2787 | { | ||
2788 | HRESULT hr = S_OK; | ||
2789 | DWORD dwResult = 0; | ||
2790 | HANDLE hPipe = (HANDLE)lpData; | ||
2791 | BYTE* pbData = NULL; | ||
2792 | SIZE_T cbData = 0; | ||
2793 | DWORD dwMessage = BURN_ELEVATION_MESSAGE_TYPE_PROGRESS_ROUTINE; | ||
2794 | |||
2795 | hr = BuffWriteNumber64(&pbData, &cbData, TotalFileSize.QuadPart); | ||
2796 | ExitOnFailure(hr, "Failed to write total file size progress to message buffer."); | ||
2797 | |||
2798 | hr = BuffWriteNumber64(&pbData, &cbData, TotalBytesTransferred.QuadPart); | ||
2799 | ExitOnFailure(hr, "Failed to write total bytes transferred progress to message buffer."); | ||
2800 | |||
2801 | // send message | ||
2802 | hr = PipeSendMessage(hPipe, dwMessage, pbData, cbData, NULL, NULL, &dwResult); | ||
2803 | ExitOnFailure(hr, "Failed to send progress routine message to per-user process."); | ||
2804 | |||
2805 | LExit: | ||
2806 | ReleaseBuffer(pbData); | ||
2807 | |||
2808 | return dwResult; | ||
2809 | } | ||
2810 | |||
2576 | static int GenericExecuteMessageHandler( | 2811 | static int GenericExecuteMessageHandler( |
2577 | __in GENERIC_EXECUTE_MESSAGE* pMessage, | 2812 | __in GENERIC_EXECUTE_MESSAGE* pMessage, |
2578 | __in LPVOID pvContext | 2813 | __in LPVOID pvContext |