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( |