summaryrefslogtreecommitdiff
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.cpp36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index 12c9f296..6c4a775f 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -42,7 +42,8 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
42 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS, 42 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PROGRESS,
43 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR, 43 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR,
44 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE, 44 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE,
45 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE, 45 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_FILES_IN_USE,
46 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_NETFX_FILES_IN_USE,
46 BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE_PROCESSID, 47 BURN_ELEVATION_MESSAGE_TYPE_LAUNCH_APPROVED_EXE_PROCESSID,
47 BURN_ELEVATION_MESSAGE_TYPE_PROGRESS_ROUTINE, 48 BURN_ELEVATION_MESSAGE_TYPE_PROGRESS_ROUTINE,
48} BURN_ELEVATION_MESSAGE_TYPE; 49} BURN_ELEVATION_MESSAGE_TYPE;
@@ -1618,7 +1619,7 @@ static HRESULT ProcessGenericExecuteMessages(
1618 LPWSTR* rgwzFiles = NULL; 1619 LPWSTR* rgwzFiles = NULL;
1619 GENERIC_EXECUTE_MESSAGE message = { }; 1620 GENERIC_EXECUTE_MESSAGE message = { };
1620 1621
1621 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwAllowedResults); 1622 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwUIHint);
1622 ExitOnFailure(hr, "Failed to allowed results."); 1623 ExitOnFailure(hr, "Failed to allowed results.");
1623 1624
1624 // Process the message. 1625 // Process the message.
@@ -1645,8 +1646,8 @@ static HRESULT ProcessGenericExecuteMessages(
1645 message.error.wzMessage = sczMessage; 1646 message.error.wzMessage = sczMessage;
1646 break; 1647 break;
1647 1648
1648 case BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE: 1649 case BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_NETFX_FILES_IN_USE:
1649 message.type = GENERIC_EXECUTE_MESSAGE_FILES_IN_USE; 1650 message.type = GENERIC_EXECUTE_MESSAGE_NETFX_FILES_IN_USE;
1650 1651
1651 // read message parameters 1652 // read message parameters
1652 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &cFiles); 1653 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &cFiles);
@@ -1701,6 +1702,7 @@ static HRESULT ProcessMsiPackageMessages(
1701 LPWSTR* rgwzMsiData = NULL; 1702 LPWSTR* rgwzMsiData = NULL;
1702 BURN_ELEVATION_MSI_MESSAGE_CONTEXT* pContext = static_cast<BURN_ELEVATION_MSI_MESSAGE_CONTEXT*>(pvContext); 1703 BURN_ELEVATION_MSI_MESSAGE_CONTEXT* pContext = static_cast<BURN_ELEVATION_MSI_MESSAGE_CONTEXT*>(pvContext);
1703 LPWSTR sczMessage = NULL; 1704 LPWSTR sczMessage = NULL;
1705 BOOL fRestartManager = FALSE;
1704 1706
1705 // Read MSI extended message data. 1707 // Read MSI extended message data.
1706 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &cMsiData); 1708 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &cMsiData);
@@ -1721,7 +1723,7 @@ static HRESULT ProcessMsiPackageMessages(
1721 message.rgwzData = (LPCWSTR*)rgwzMsiData; 1723 message.rgwzData = (LPCWSTR*)rgwzMsiData;
1722 } 1724 }
1723 1725
1724 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwAllowedResults); 1726 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, &message.dwUIHint);
1725 ExitOnFailure(hr, "Failed to read UI flags."); 1727 ExitOnFailure(hr, "Failed to read UI flags.");
1726 1728
1727 // Process the rest of the message. 1729 // Process the rest of the message.
@@ -1759,8 +1761,11 @@ static HRESULT ProcessMsiPackageMessages(
1759 message.msiMessage.wzMessage = sczMessage; 1761 message.msiMessage.wzMessage = sczMessage;
1760 break; 1762 break;
1761 1763
1762 case BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE: 1764 case BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_FILES_IN_USE:
1763 message.type = WIU_MSI_EXECUTE_MESSAGE_MSI_FILES_IN_USE; 1765 hr = BuffReadNumber((BYTE*)pMsg->pvData, pMsg->cbData, &iData, (DWORD*)&fRestartManager);
1766 ExitOnFailure(hr, "Failed to read fRestartManager.");
1767
1768 message.type = fRestartManager ? WIU_MSI_EXECUTE_MESSAGE_MSI_RM_FILES_IN_USE : WIU_MSI_EXECUTE_MESSAGE_MSI_FILES_IN_USE;
1764 message.msiFilesInUse.cFiles = cMsiData; 1769 message.msiFilesInUse.cFiles = cMsiData;
1765 message.msiFilesInUse.rgwzFiles = (LPCWSTR*)rgwzMsiData; 1770 message.msiFilesInUse.rgwzFiles = (LPCWSTR*)rgwzMsiData;
1766 break; 1771 break;
@@ -3006,7 +3011,7 @@ static int GenericExecuteMessageHandler(
3006 SIZE_T cbData = 0; 3011 SIZE_T cbData = 0;
3007 DWORD dwMessage = 0; 3012 DWORD dwMessage = 0;
3008 3013
3009 hr = BuffWriteNumber(&pbData, &cbData, pMessage->dwAllowedResults); 3014 hr = BuffWriteNumber(&pbData, &cbData, pMessage->dwUIHint);
3010 ExitOnFailure(hr, "Failed to write UI flags."); 3015 ExitOnFailure(hr, "Failed to write UI flags.");
3011 3016
3012 switch(pMessage->type) 3017 switch(pMessage->type)
@@ -3030,7 +3035,7 @@ static int GenericExecuteMessageHandler(
3030 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR; 3035 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_ERROR;
3031 break; 3036 break;
3032 3037
3033 case GENERIC_EXECUTE_MESSAGE_FILES_IN_USE: 3038 case GENERIC_EXECUTE_MESSAGE_NETFX_FILES_IN_USE:
3034 hr = BuffWriteNumber(&pbData, &cbData, pMessage->filesInUse.cFiles); 3039 hr = BuffWriteNumber(&pbData, &cbData, pMessage->filesInUse.cFiles);
3035 ExitOnFailure(hr, "Failed to count of files in use to message buffer."); 3040 ExitOnFailure(hr, "Failed to count of files in use to message buffer.");
3036 3041
@@ -3040,7 +3045,7 @@ static int GenericExecuteMessageHandler(
3040 ExitOnFailure(hr, "Failed to write file in use to message buffer."); 3045 ExitOnFailure(hr, "Failed to write file in use to message buffer.");
3041 } 3046 }
3042 3047
3043 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE; 3048 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_NETFX_FILES_IN_USE;
3044 break; 3049 break;
3045 } 3050 }
3046 3051
@@ -3065,6 +3070,7 @@ static int MsiExecuteMessageHandler(
3065 BYTE* pbData = NULL; 3070 BYTE* pbData = NULL;
3066 SIZE_T cbData = 0; 3071 SIZE_T cbData = 0;
3067 DWORD dwMessage = 0; 3072 DWORD dwMessage = 0;
3073 BOOL fRestartManager = FALSE;
3068 3074
3069 // Always send any extra data via the struct first. 3075 // Always send any extra data via the struct first.
3070 hr = BuffWriteNumber(&pbData, &cbData, pMessage->cData); 3076 hr = BuffWriteNumber(&pbData, &cbData, pMessage->cData);
@@ -3076,7 +3082,7 @@ static int MsiExecuteMessageHandler(
3076 ExitOnFailure(hr, "Failed to write MSI data to message buffer."); 3082 ExitOnFailure(hr, "Failed to write MSI data to message buffer.");
3077 } 3083 }
3078 3084
3079 hr = BuffWriteNumber(&pbData, &cbData, pMessage->dwAllowedResults); 3085 hr = BuffWriteNumber(&pbData, &cbData, pMessage->dwUIHint);
3080 ExitOnFailure(hr, "Failed to write UI flags."); 3086 ExitOnFailure(hr, "Failed to write UI flags.");
3081 3087
3082 switch (pMessage->type) 3088 switch (pMessage->type)
@@ -3114,11 +3120,15 @@ static int MsiExecuteMessageHandler(
3114 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE; 3120 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_MESSAGE;
3115 break; 3121 break;
3116 3122
3123 case WIU_MSI_EXECUTE_MESSAGE_MSI_RM_FILES_IN_USE:
3124 fRestartManager = TRUE;
3125 __fallthrough;
3117 case WIU_MSI_EXECUTE_MESSAGE_MSI_FILES_IN_USE: 3126 case WIU_MSI_EXECUTE_MESSAGE_MSI_FILES_IN_USE:
3118 // NOTE: we do not serialize other message data here because all the "files in use" are in the data above. 3127 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)fRestartManager);
3128 ExitOnFailure(hr, "Failed to write fRestartManager to message buffer.");
3119 3129
3120 // set message id 3130 // set message id
3121 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_FILES_IN_USE; 3131 dwMessage = BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_FILES_IN_USE;
3122 break; 3132 break;
3123 3133
3124 default: 3134 default: