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.cpp176
1 files changed, 164 insertions, 12 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index 8488b649..504ddaea 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -20,6 +20,7 @@ typedef enum _BURN_ELEVATION_MESSAGE_TYPE
20 BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP, 20 BURN_ELEVATION_MESSAGE_TYPE_CACHE_CLEANUP,
21 BURN_ELEVATION_MESSAGE_TYPE_PROCESS_DEPENDENT_REGISTRATION, 21 BURN_ELEVATION_MESSAGE_TYPE_PROCESS_DEPENDENT_REGISTRATION,
22 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_RELATED_BUNDLE, 22 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_RELATED_BUNDLE,
23 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_BUNDLE_PACKAGE,
23 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_EXE_PACKAGE, 24 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_EXE_PACKAGE,
24 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_PACKAGE, 25 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSI_PACKAGE,
25 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSP_PACKAGE, 26 BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_MSP_PACKAGE,
@@ -250,6 +251,14 @@ static HRESULT OnExecuteRelatedBundle(
250 __in BYTE* pbData, 251 __in BYTE* pbData,
251 __in SIZE_T cbData 252 __in SIZE_T cbData
252 ); 253 );
254static HRESULT OnExecuteBundlePackage(
255 __in HANDLE hPipe,
256 __in BURN_CACHE* pCache,
257 __in BURN_PACKAGES* pPackages,
258 __in BURN_VARIABLES* pVariables,
259 __in BYTE* pbData,
260 __in SIZE_T cbData
261 );
253static HRESULT OnExecuteExePackage( 262static HRESULT OnExecuteExePackage(
254 __in HANDLE hPipe, 263 __in HANDLE hPipe,
255 __in BURN_CACHE* pCache, 264 __in BURN_CACHE* pCache,
@@ -911,6 +920,63 @@ LExit:
911} 920}
912 921
913/******************************************************************* 922/*******************************************************************
923 ElevationExecuteBundlePackage -
924
925*******************************************************************/
926extern "C" HRESULT ElevationExecuteBundlePackage(
927 __in HANDLE hPipe,
928 __in BURN_EXECUTE_ACTION* pExecuteAction,
929 __in BURN_VARIABLES* pVariables,
930 __in BOOL fRollback,
931 __in PFN_GENERICMESSAGEHANDLER pfnGenericMessageHandler,
932 __in LPVOID pvContext,
933 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
934 )
935{
936 HRESULT hr = S_OK;
937 BYTE* pbData = NULL;
938 SIZE_T cbData = 0;
939 BURN_ELEVATION_GENERIC_MESSAGE_CONTEXT context = { };
940 DWORD dwResult = 0;
941
942 // serialize message data
943 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->bundlePackage.pPackage->sczId);
944 ExitOnFailure(hr, "Failed to write package id to message buffer.");
945
946 hr = BuffWriteNumber(&pbData, &cbData, (DWORD)pExecuteAction->bundlePackage.action);
947 ExitOnFailure(hr, "Failed to write action to message buffer.");
948
949 hr = BuffWriteNumber(&pbData, &cbData, fRollback);
950 ExitOnFailure(hr, "Failed to write rollback.");
951
952 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->bundlePackage.sczIgnoreDependencies);
953 ExitOnFailure(hr, "Failed to write the list of dependencies to ignore to the message buffer.");
954
955 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->bundlePackage.sczAncestors);
956 ExitOnFailure(hr, "Failed to write the list of ancestors to the message buffer.");
957
958 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->bundlePackage.sczEngineWorkingDirectory);
959 ExitOnFailure(hr, "Failed to write the custom working directory to the message buffer.");
960
961 hr = VariableSerialize(pVariables, FALSE, &pbData, &cbData);
962 ExitOnFailure(hr, "Failed to write variables.");
963
964 // send message
965 context.pfnGenericMessageHandler = pfnGenericMessageHandler;
966 context.pvContext = pvContext;
967
968 hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_BUNDLE_PACKAGE, pbData, cbData, ProcessGenericExecuteMessages, &context, &dwResult);
969 ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_BUNDLE_PACKAGE message to per-machine process.");
970
971 hr = ProcessResult(dwResult, pRestart);
972
973LExit:
974 ReleaseBuffer(pbData);
975
976 return hr;
977}
978
979/*******************************************************************
914 ElevationExecuteExePackage - 980 ElevationExecuteExePackage -
915 981
916*******************************************************************/ 982*******************************************************************/
@@ -940,9 +1006,6 @@ extern "C" HRESULT ElevationExecuteExePackage(
940 hr = BuffWriteNumber(&pbData, &cbData, fRollback); 1006 hr = BuffWriteNumber(&pbData, &cbData, fRollback);
941 ExitOnFailure(hr, "Failed to write rollback."); 1007 ExitOnFailure(hr, "Failed to write rollback.");
942 1008
943 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->exePackage.sczIgnoreDependencies);
944 ExitOnFailure(hr, "Failed to write the list of dependencies to ignore to the message buffer.");
945
946 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->exePackage.sczAncestors); 1009 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->exePackage.sczAncestors);
947 ExitOnFailure(hr, "Failed to write the list of ancestors to the message buffer."); 1010 ExitOnFailure(hr, "Failed to write the list of ancestors to the message buffer.");
948 1011
@@ -2124,6 +2187,10 @@ static HRESULT ProcessElevatedChildMessage(
2124 hrResult = OnExecuteRelatedBundle(pContext->hPipe, pContext->pCache, &pContext->pRegistration->relatedBundles, pContext->pVariables, (BYTE*)pMsg->pvData, pMsg->cbData); 2187 hrResult = OnExecuteRelatedBundle(pContext->hPipe, pContext->pCache, &pContext->pRegistration->relatedBundles, pContext->pVariables, (BYTE*)pMsg->pvData, pMsg->cbData);
2125 break; 2188 break;
2126 2189
2190 case BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_BUNDLE_PACKAGE:
2191 hrResult = OnExecuteBundlePackage(pContext->hPipe, pContext->pCache, pContext->pPackages, pContext->pVariables, (BYTE*)pMsg->pvData, pMsg->cbData);
2192 break;
2193
2127 case BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_EXE_PACKAGE: 2194 case BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_EXE_PACKAGE:
2128 hrResult = OnExecuteExePackage(pContext->hPipe, pContext->pCache, pContext->pPackages, pContext->pVariables, (BYTE*)pMsg->pvData, pMsg->cbData); 2195 hrResult = OnExecuteExePackage(pContext->hPipe, pContext->pCache, pContext->pPackages, pContext->pVariables, (BYTE*)pMsg->pvData, pMsg->cbData);
2129 break; 2196 break;
@@ -2839,7 +2906,7 @@ LExit:
2839 return hr; 2906 return hr;
2840} 2907}
2841 2908
2842static HRESULT OnExecuteExePackage( 2909static HRESULT OnExecuteBundlePackage(
2843 __in HANDLE hPipe, 2910 __in HANDLE hPipe,
2844 __in BURN_CACHE* pCache, 2911 __in BURN_CACHE* pCache,
2845 __in BURN_PACKAGES* pPackages, 2912 __in BURN_PACKAGES* pPackages,
@@ -2856,15 +2923,15 @@ static HRESULT OnExecuteExePackage(
2856 LPWSTR sczIgnoreDependencies = NULL; 2923 LPWSTR sczIgnoreDependencies = NULL;
2857 LPWSTR sczAncestors = NULL; 2924 LPWSTR sczAncestors = NULL;
2858 LPWSTR sczEngineWorkingDirectory = NULL; 2925 LPWSTR sczEngineWorkingDirectory = NULL;
2859 BOOTSTRAPPER_APPLY_RESTART exeRestart = BOOTSTRAPPER_APPLY_RESTART_NONE; 2926 BOOTSTRAPPER_APPLY_RESTART bundleRestart = BOOTSTRAPPER_APPLY_RESTART_NONE;
2860 2927
2861 executeAction.type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE; 2928 executeAction.type = BURN_EXECUTE_ACTION_TYPE_BUNDLE_PACKAGE;
2862 2929
2863 // Deserialize message data. 2930 // Deserialize message data.
2864 hr = BuffReadString(pbData, cbData, &iData, &sczPackage); 2931 hr = BuffReadString(pbData, cbData, &iData, &sczPackage);
2865 ExitOnFailure(hr, "Failed to read EXE package id."); 2932 ExitOnFailure(hr, "Failed to read EXE package id.");
2866 2933
2867 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.exePackage.action); 2934 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.bundlePackage.action);
2868 ExitOnFailure(hr, "Failed to read action."); 2935 ExitOnFailure(hr, "Failed to read action.");
2869 2936
2870 hr = BuffReadNumber(pbData, cbData, &iData, &dwRollback); 2937 hr = BuffReadNumber(pbData, cbData, &iData, &dwRollback);
@@ -2882,24 +2949,110 @@ static HRESULT OnExecuteExePackage(
2882 hr = VariableDeserialize(pVariables, FALSE, pbData, cbData, &iData); 2949 hr = VariableDeserialize(pVariables, FALSE, pbData, cbData, &iData);
2883 ExitOnFailure(hr, "Failed to read variables."); 2950 ExitOnFailure(hr, "Failed to read variables.");
2884 2951
2885 hr = PackageFindById(pPackages, sczPackage, &executeAction.exePackage.pPackage); 2952 hr = PackageFindById(pPackages, sczPackage, &executeAction.bundlePackage.pPackage);
2886 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); 2953 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
2887 2954
2888 if (BURN_PACKAGE_TYPE_EXE != executeAction.exePackage.pPackage->type) 2955 if (BURN_PACKAGE_TYPE_BUNDLE != executeAction.bundlePackage.pPackage->type)
2889 { 2956 {
2890 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not an EXE package: %ls", sczPackage); 2957 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not a BUNDLE package: %ls", sczPackage);
2891 } 2958 }
2892 2959
2893 // Pass the list of dependencies to ignore, if any, to the related bundle. 2960 // Pass the list of dependencies to ignore, if any, to the related bundle.
2894 if (sczIgnoreDependencies && *sczIgnoreDependencies) 2961 if (sczIgnoreDependencies && *sczIgnoreDependencies)
2895 { 2962 {
2896 hr = StrAllocString(&executeAction.exePackage.sczIgnoreDependencies, sczIgnoreDependencies, 0); 2963 hr = StrAllocString(&executeAction.bundlePackage.sczIgnoreDependencies, sczIgnoreDependencies, 0);
2897 ExitOnFailure(hr, "Failed to allocate the list of dependencies to ignore."); 2964 ExitOnFailure(hr, "Failed to allocate the list of dependencies to ignore.");
2898 } 2965 }
2899 2966
2900 // Pass the list of ancestors, if any, to the related bundle. 2967 // Pass the list of ancestors, if any, to the related bundle.
2901 if (sczAncestors && *sczAncestors) 2968 if (sczAncestors && *sczAncestors)
2902 { 2969 {
2970 hr = StrAllocString(&executeAction.bundlePackage.sczAncestors, sczAncestors, 0);
2971 ExitOnFailure(hr, "Failed to allocate the list of ancestors.");
2972 }
2973
2974 if (sczEngineWorkingDirectory && *sczEngineWorkingDirectory)
2975 {
2976 hr = StrAllocString(&executeAction.bundlePackage.sczEngineWorkingDirectory, sczEngineWorkingDirectory, 0);
2977 ExitOnFailure(hr, "Failed to allocate the custom working directory.");
2978 }
2979
2980 // Execute BUNDLE package.
2981 hr = BundlePackageEngineExecutePackage(&executeAction, pCache, pVariables, static_cast<BOOL>(dwRollback), GenericExecuteMessageHandler, hPipe, &bundleRestart);
2982 ExitOnFailure(hr, "Failed to execute BUNDLE package.");
2983
2984LExit:
2985 ReleaseStr(sczEngineWorkingDirectory);
2986 ReleaseStr(sczAncestors);
2987 ReleaseStr(sczIgnoreDependencies);
2988 ReleaseStr(sczPackage);
2989 PlanUninitializeExecuteAction(&executeAction);
2990
2991 if (SUCCEEDED(hr))
2992 {
2993 if (BOOTSTRAPPER_APPLY_RESTART_REQUIRED == bundleRestart)
2994 {
2995 hr = HRESULT_FROM_WIN32(ERROR_SUCCESS_REBOOT_REQUIRED);
2996 }
2997 else if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == bundleRestart)
2998 {
2999 hr = HRESULT_FROM_WIN32(ERROR_SUCCESS_REBOOT_INITIATED);
3000 }
3001 }
3002
3003 return hr;
3004}
3005
3006static HRESULT OnExecuteExePackage(
3007 __in HANDLE hPipe,
3008 __in BURN_CACHE* pCache,
3009 __in BURN_PACKAGES* pPackages,
3010 __in BURN_VARIABLES* pVariables,
3011 __in BYTE* pbData,
3012 __in SIZE_T cbData
3013 )
3014{
3015 HRESULT hr = S_OK;
3016 SIZE_T iData = 0;
3017 LPWSTR sczPackage = NULL;
3018 DWORD dwRollback = 0;
3019 BURN_EXECUTE_ACTION executeAction = { };
3020 LPWSTR sczAncestors = NULL;
3021 LPWSTR sczEngineWorkingDirectory = NULL;
3022 BOOTSTRAPPER_APPLY_RESTART exeRestart = BOOTSTRAPPER_APPLY_RESTART_NONE;
3023
3024 executeAction.type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE;
3025
3026 // Deserialize message data.
3027 hr = BuffReadString(pbData, cbData, &iData, &sczPackage);
3028 ExitOnFailure(hr, "Failed to read EXE package id.");
3029
3030 hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&executeAction.exePackage.action);
3031 ExitOnFailure(hr, "Failed to read action.");
3032
3033 hr = BuffReadNumber(pbData, cbData, &iData, &dwRollback);
3034 ExitOnFailure(hr, "Failed to read rollback.");
3035
3036 hr = BuffReadString(pbData, cbData, &iData, &sczAncestors);
3037 ExitOnFailure(hr, "Failed to read the list of ancestors.");
3038
3039 hr = BuffReadString(pbData, cbData, &iData, &sczEngineWorkingDirectory);
3040 ExitOnFailure(hr, "Failed to read the custom working directory.");
3041
3042 hr = VariableDeserialize(pVariables, FALSE, pbData, cbData, &iData);
3043 ExitOnFailure(hr, "Failed to read variables.");
3044
3045 hr = PackageFindById(pPackages, sczPackage, &executeAction.exePackage.pPackage);
3046 ExitOnFailure(hr, "Failed to find package: %ls", sczPackage);
3047
3048 if (BURN_PACKAGE_TYPE_EXE != executeAction.exePackage.pPackage->type)
3049 {
3050 ExitWithRootFailure(hr, E_INVALIDARG, "Package is not an EXE package: %ls", sczPackage);
3051 }
3052
3053 // Pass the list of ancestors, if any, to the related bundle.
3054 if (sczAncestors && *sczAncestors)
3055 {
2903 hr = StrAllocString(&executeAction.exePackage.sczAncestors, sczAncestors, 0); 3056 hr = StrAllocString(&executeAction.exePackage.sczAncestors, sczAncestors, 0);
2904 ExitOnFailure(hr, "Failed to allocate the list of ancestors."); 3057 ExitOnFailure(hr, "Failed to allocate the list of ancestors.");
2905 } 3058 }
@@ -2917,7 +3070,6 @@ static HRESULT OnExecuteExePackage(
2917LExit: 3070LExit:
2918 ReleaseStr(sczEngineWorkingDirectory); 3071 ReleaseStr(sczEngineWorkingDirectory);
2919 ReleaseStr(sczAncestors); 3072 ReleaseStr(sczAncestors);
2920 ReleaseStr(sczIgnoreDependencies);
2921 ReleaseStr(sczPackage); 3073 ReleaseStr(sczPackage);
2922 PlanUninitializeExecuteAction(&executeAction); 3074 PlanUninitializeExecuteAction(&executeAction);
2923 3075