aboutsummaryrefslogtreecommitdiff
path: root/src/engine/elevation.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/engine/elevation.cpp253
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
59typedef 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
55typedef struct _BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT 66typedef 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 );
113static HRESULT ProcessBurnCacheMessages(
114 __in BURN_PIPE_MESSAGE* pMsg,
115 __in LPVOID pvContext,
116 __out DWORD* pdwResult
117 );
102static HRESULT ProcessGenericExecuteMessages( 118static 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 );
133static HRESULT ProcessProgressRoutineMessage(
134 __in BURN_PIPE_MESSAGE* pMsg,
135 __in LPPROGRESS_ROUTINE pfnProgress,
136 __in LPVOID pvContext,
137 __out DWORD* pdwResult
138 );
117static HRESULT ProcessElevatedChildMessage( 139static 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 );
167static HRESULT OnCacheCompletePayload( 189static 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 );
173static HRESULT OnCacheVerifyPayload( 196static 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 );
252static HRESULT CALLBACK BurnCacheMessageHandler(
253 __in BURN_CACHE_MESSAGE* pMessage,
254 __in LPVOID pvContext
255 );
256static 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 );
228static int GenericExecuteMessageHandler( 267static 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:
618extern "C" HRESULT ElevationCacheVerifyPayload( 665extern "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
1435static 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
1494LExit:
1495 return hr;
1496}
1497
1380static HRESULT ProcessGenericExecuteMessages( 1498static 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
1717static 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
1743LExit:
1744 return hr;
1745}
1746
1599static HRESULT ProcessElevatedChildMessage( 1747static 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
2004static HRESULT OnCacheCompletePayload( 2152static 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
2062static HRESULT OnCacheVerifyPayload( 2211static 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
2726static 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
2770LExit:
2771 ReleaseBuffer(pbData);
2772
2773 return hr;
2774}
2775
2776static 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
2805LExit:
2806 ReleaseBuffer(pbData);
2807
2808 return dwResult;
2809}
2810
2576static int GenericExecuteMessageHandler( 2811static int GenericExecuteMessageHandler(
2577 __in GENERIC_EXECUTE_MESSAGE* pMessage, 2812 __in GENERIC_EXECUTE_MESSAGE* pMessage,
2578 __in LPVOID pvContext 2813 __in LPVOID pvContext