aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNir Bar <nir.bar@panel-sw.co.il>2021-01-11 20:07:38 +0200
committerGitHub <noreply@github.com>2021-01-11 12:07:38 -0600
commitc294fb860ed7710c80fc004af6c9ebb09779c70c (patch)
tree20f7a25ebd214ba77959787a97bcb579e24ee4c2
parent0ae3b1e7b5c0beff0fcfb82728c5bf9f25aee250 (diff)
downloadwix-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
-rw-r--r--src/dutil/inc/wiutil.h24
-rw-r--r--src/dutil/wiutil.cpp75
2 files changed, 99 insertions, 0 deletions
diff --git a/src/dutil/inc/wiutil.h b/src/dutil/inc/wiutil.h
index 07f6b56c..10d003b0 100644
--- a/src/dutil/inc/wiutil.h
+++ b/src/dutil/inc/wiutil.h
@@ -226,6 +226,15 @@ typedef UINT (WINAPI *PFN_MSISOURCELISTADDSOURCEEXW)(
226 __in LPCWSTR szSource, 226 __in LPCWSTR szSource,
227 __in_opt DWORD dwIndex 227 __in_opt DWORD dwIndex
228 ); 228 );
229typedef UINT(WINAPI* PFN_MSIBEGINTRANSACTIONW)(
230 __in LPCWSTR szName,
231 __in DWORD dwTransactionAttributes,
232 __out MSIHANDLE* phTransactionHandle,
233 __out HANDLE* phChangeOfOwnerEvent
234 );
235typedef UINT(WINAPI* PFN_MSIENDTRANSACTION)(
236 __in DWORD dwTransactionState
237 );
229 238
230 239
231HRESULT DAPI WiuInitialize( 240HRESULT DAPI WiuInitialize(
@@ -372,6 +381,21 @@ HRESULT DAPI WiuSourceListAddSourceEx(
372 __in_z LPCWSTR wzSource, 381 __in_z LPCWSTR wzSource,
373 __in_opt DWORD dwIndex 382 __in_opt DWORD dwIndex
374 ); 383 );
384HRESULT DAPI WiuBeginTransaction(
385 __in_z LPCWSTR szName,
386 __in DWORD dwTransactionAttributes,
387 __out MSIHANDLE* phTransactionHandle,
388 __out HANDLE* phChangeOfOwnerEvent,
389 __in DWORD dwLogMode,
390 __in_z LPCWSTR szLogPath
391 );
392HRESULT DAPI WiuEndTransaction(
393 __in DWORD dwTransactionState,
394 __in DWORD dwLogMode,
395 __in_z LPCWSTR szLogPath
396 );
397BOOL DAPI WiuIsMsiTransactionSupported(
398 );
375 399
376#ifdef __cplusplus 400#ifdef __cplusplus
377} 401}
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;
42static PFN_MSIGETPRODUCTINFOEXW vpfnMsiGetProductInfoExWFromLibrary = NULL; 42static PFN_MSIGETPRODUCTINFOEXW vpfnMsiGetProductInfoExWFromLibrary = NULL;
43static PFN_MSISETEXTERNALUIRECORD vpfnMsiSetExternalUIRecordFromLibrary = NULL; 43static PFN_MSISETEXTERNALUIRECORD vpfnMsiSetExternalUIRecordFromLibrary = NULL;
44static PFN_MSISOURCELISTADDSOURCEEXW vpfnMsiSourceListAddSourceExWFromLibrary = NULL; 44static PFN_MSISOURCELISTADDSOURCEEXW vpfnMsiSourceListAddSourceExWFromLibrary = NULL;
45
46// MSI Transactions v4.5+
47static PFN_MSIBEGINTRANSACTIONW vpfnMsiBeginTransaction = NULL;
48static PFN_MSIENDTRANSACTION vpfnMsiEndTransaction = NULL;
49
45static BOOL vfWiuInitialized = FALSE; 50static 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
181LExit: 197LExit:
@@ -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
907extern "C" BOOL DAPI WiuIsMsiTransactionSupported(
908 )
909{
910 return vpfnMsiBeginTransaction && vpfnMsiEndTransaction;
911}
912
913extern "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
936LExit:
937 return hr;
938}
939
940extern "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
960LExit:
961 return hr;
962}
963
889 964
890 965
891static DWORD CheckForRestartErrorCode( 966static DWORD CheckForRestartErrorCode(