diff options
| author | Nir Bar <nir.bar@panel-sw.co.il> | 2021-01-11 20:07:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-11 12:07:38 -0600 |
| commit | c294fb860ed7710c80fc004af6c9ebb09779c70c (patch) | |
| tree | 20f7a25ebd214ba77959787a97bcb579e24ee4c2 /src/dutil/wiutil.cpp | |
| parent | 0ae3b1e7b5c0beff0fcfb82728c5bf9f25aee250 (diff) | |
| download | wix-c294fb860ed7710c80fc004af6c9ebb09779c70c.tar.gz wix-c294fb860ed7710c80fc004af6c9ebb09779c70c.tar.bz2 wix-c294fb860ed7710c80fc004af6c9ebb09779c70c.zip | |
Add functions to start/end MSI transactions and check whether or not it is supported on the target machine (#22)
* Add functions to start/end MSI transactions and check whether or not it is supported on the target machine
* Add log mode parameter to MSI transaction functions.
* No default log mode for WiuEndTransaction
Diffstat (limited to 'src/dutil/wiutil.cpp')
| -rw-r--r-- | src/dutil/wiutil.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/dutil/wiutil.cpp b/src/dutil/wiutil.cpp index 1b3dd317..7336d685 100644 --- a/src/dutil/wiutil.cpp +++ b/src/dutil/wiutil.cpp | |||
| @@ -42,6 +42,11 @@ static PFN_MSIGETPATCHINFOEXW vpfnMsiGetPatchInfoExWFromLibrary = NULL; | |||
| 42 | static PFN_MSIGETPRODUCTINFOEXW vpfnMsiGetProductInfoExWFromLibrary = NULL; | 42 | static PFN_MSIGETPRODUCTINFOEXW vpfnMsiGetProductInfoExWFromLibrary = NULL; |
| 43 | static PFN_MSISETEXTERNALUIRECORD vpfnMsiSetExternalUIRecordFromLibrary = NULL; | 43 | static PFN_MSISETEXTERNALUIRECORD vpfnMsiSetExternalUIRecordFromLibrary = NULL; |
| 44 | static PFN_MSISOURCELISTADDSOURCEEXW vpfnMsiSourceListAddSourceExWFromLibrary = NULL; | 44 | static PFN_MSISOURCELISTADDSOURCEEXW vpfnMsiSourceListAddSourceExWFromLibrary = NULL; |
| 45 | |||
| 46 | // MSI Transactions v4.5+ | ||
| 47 | static PFN_MSIBEGINTRANSACTIONW vpfnMsiBeginTransaction = NULL; | ||
| 48 | static PFN_MSIENDTRANSACTION vpfnMsiEndTransaction = NULL; | ||
| 49 | |||
| 45 | static BOOL vfWiuInitialized = FALSE; | 50 | static BOOL vfWiuInitialized = FALSE; |
| 46 | 51 | ||
| 47 | // globals | 52 | // globals |
| @@ -176,6 +181,17 @@ extern "C" HRESULT DAPI WiuInitialize( | |||
| 176 | vpfnMsiSourceListAddSourceExW = vpfnMsiSourceListAddSourceExWFromLibrary; | 181 | vpfnMsiSourceListAddSourceExW = vpfnMsiSourceListAddSourceExWFromLibrary; |
| 177 | } | 182 | } |
| 178 | 183 | ||
| 184 | // MSI Transaction functions | ||
| 185 | if (NULL == vpfnMsiBeginTransaction) | ||
| 186 | { | ||
| 187 | vpfnMsiBeginTransaction = reinterpret_cast<PFN_MSIBEGINTRANSACTIONW>(::GetProcAddress(vhMsiDll, "MsiBeginTransactionW")); | ||
| 188 | } | ||
| 189 | |||
| 190 | if (NULL == vpfnMsiEndTransaction) | ||
| 191 | { | ||
| 192 | vpfnMsiEndTransaction = reinterpret_cast<PFN_MSIENDTRANSACTION>(::GetProcAddress(vhMsiDll, "MsiEndTransaction")); | ||
| 193 | } | ||
| 194 | |||
| 179 | vfWiuInitialized = TRUE; | 195 | vfWiuInitialized = TRUE; |
| 180 | 196 | ||
| 181 | LExit: | 197 | LExit: |
| @@ -202,6 +218,8 @@ extern "C" void DAPI WiuUninitialize( | |||
| 202 | vpfnMsiDetermineApplicablePatchesWFromLibrary = NULL; | 218 | vpfnMsiDetermineApplicablePatchesWFromLibrary = NULL; |
| 203 | vpfnMsiDeterminePatchSequenceWFromLibrary = NULL; | 219 | vpfnMsiDeterminePatchSequenceWFromLibrary = NULL; |
| 204 | vpfnMsiSourceListAddSourceExWFromLibrary = NULL; | 220 | vpfnMsiSourceListAddSourceExWFromLibrary = NULL; |
| 221 | vpfnMsiBeginTransaction = NULL; | ||
| 222 | vpfnMsiEndTransaction = NULL; | ||
| 205 | } | 223 | } |
| 206 | 224 | ||
| 207 | vfWiuInitialized = FALSE; | 225 | vfWiuInitialized = FALSE; |
| @@ -886,6 +904,63 @@ LExit: | |||
| 886 | return hr; | 904 | return hr; |
| 887 | } | 905 | } |
| 888 | 906 | ||
| 907 | extern "C" BOOL DAPI WiuIsMsiTransactionSupported( | ||
| 908 | ) | ||
| 909 | { | ||
| 910 | return vpfnMsiBeginTransaction && vpfnMsiEndTransaction; | ||
| 911 | } | ||
| 912 | |||
| 913 | extern "C" HRESULT DAPI WiuBeginTransaction( | ||
| 914 | __in_z LPCWSTR szName, | ||
| 915 | __in DWORD dwTransactionAttributes, | ||
| 916 | __out MSIHANDLE * phTransactionHandle, | ||
| 917 | __out HANDLE * phChangeOfOwnerEvent, | ||
| 918 | __in DWORD dwLogMode, | ||
| 919 | __in_z LPCWSTR szLogPath | ||
| 920 | ) | ||
| 921 | { | ||
| 922 | HRESULT hr = S_OK; | ||
| 923 | DWORD er = ERROR_SUCCESS; | ||
| 924 | |||
| 925 | if (!WiuIsMsiTransactionSupported()) | ||
| 926 | { | ||
| 927 | ExitOnFailure(hr = E_NOTIMPL, "Msi transactions are not supported"); | ||
| 928 | } | ||
| 929 | |||
| 930 | hr = WiuEnableLog(dwLogMode, szLogPath, INSTALLLOGATTRIBUTES_APPEND); | ||
| 931 | ExitOnFailure(hr, "Failed to enable logging for MSI transaction"); | ||
| 932 | |||
| 933 | er = vpfnMsiBeginTransaction(szName, dwTransactionAttributes, phTransactionHandle, phChangeOfOwnerEvent); | ||
| 934 | ExitOnWin32Error(er, hr, "Failed to begin transaction."); | ||
| 935 | |||
| 936 | LExit: | ||
| 937 | return hr; | ||
| 938 | } | ||
| 939 | |||
| 940 | extern "C" HRESULT DAPI WiuEndTransaction( | ||
| 941 | __in DWORD dwTransactionState, | ||
| 942 | __in DWORD dwLogMode, | ||
| 943 | __in_z LPCWSTR szLogPath | ||
| 944 | ) | ||
| 945 | { | ||
| 946 | HRESULT hr = S_OK; | ||
| 947 | DWORD er = ERROR_SUCCESS; | ||
| 948 | |||
| 949 | if (!WiuIsMsiTransactionSupported()) | ||
| 950 | { | ||
| 951 | ExitOnFailure(hr = E_NOTIMPL, "Msi transactions are not supported"); | ||
| 952 | } | ||
| 953 | |||
| 954 | hr = WiuEnableLog(dwLogMode, szLogPath, INSTALLLOGATTRIBUTES_APPEND); | ||
| 955 | ExitOnFailure(hr, "Failed to enable logging for MSI transaction"); | ||
| 956 | |||
| 957 | er = vpfnMsiEndTransaction(dwTransactionState); | ||
| 958 | ExitOnWin32Error(er, hr, "Failed to end transaction."); | ||
| 959 | |||
| 960 | LExit: | ||
| 961 | return hr; | ||
| 962 | } | ||
| 963 | |||
| 889 | 964 | ||
| 890 | 965 | ||
| 891 | static DWORD CheckForRestartErrorCode( | 966 | static DWORD CheckForRestartErrorCode( |
