diff options
Diffstat (limited to 'src/burn/engine/elevation.cpp')
-rw-r--r-- | src/burn/engine/elevation.cpp | 36 |
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: |