From ca5d60d267051b4b75e22763ad8eda06f0501451 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Wed, 2 Dec 2020 22:38:23 -0600 Subject: WIXFEAT:4626,5386 - Add more BA events. OnBeginMsiTransactionBegin, OnBeginMsiTransactionComplete, OnCommitMsiTransactionBegin, OnCommitMsiTransactionComplete, OnRollbackMsiTransactionBegin, OnRollbackMsiTransactionComplete, OnPauseAutomaticUpdatesBegin, OnPauseAutomaticUpdatesComplete, OnSystemRestorePointBegin, OnSystemRestorePointComplete --- src/WixToolset.Mba.Core/BootstrapperApplication.cs | 278 ++++++++++++++++++++- src/WixToolset.Mba.Core/EventArgs.cs | 191 +++++++++++++- .../IBootstrapperApplication.cs | 64 ++++- .../IDefaultBootstrapperApplication.cs | 15 +- src/balutil/balutil.vcxproj | 8 +- src/balutil/inc/BAFunctions.h | 10 + src/balutil/inc/BalBaseBAFunctions.h | 73 ++++++ src/balutil/inc/BalBaseBAFunctionsProc.h | 10 + src/balutil/inc/BalBaseBootstrapperApplication.h | 75 ++++++ .../inc/BalBaseBootstrapperApplicationProc.h | 119 +++++++++ src/balutil/inc/IBootstrapperApplication.h | 43 ++++ src/balutil/packages.config | 4 +- src/bextutil/bextutil.vcxproj | 8 +- src/bextutil/packages.config | 4 +- src/mbanative/mbanative.vcxproj | 8 +- src/mbanative/packages.config | 4 +- src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj | 8 +- src/test/BalUtilUnitTest/packages.config | 4 +- src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj | 8 +- src/test/BextUtilUnitTest/packages.config | 4 +- 20 files changed, 893 insertions(+), 45 deletions(-) diff --git a/src/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/WixToolset.Mba.Core/BootstrapperApplication.cs index 472c553a..2d527427 100644 --- a/src/WixToolset.Mba.Core/BootstrapperApplication.cs +++ b/src/WixToolset.Mba.Core/BootstrapperApplication.cs @@ -320,12 +320,62 @@ namespace WixToolset.Mba.Core /// /// Fired when the engine is about to launch the preapproved executable. /// - public event EventHandler LaunchApprovedExeBegin; + public event EventHandler LaunchApprovedExeBegin; /// /// Fired when the engine has completed launching the preapproved executable. /// - public event EventHandler LaunchApprovedExeComplete; + public event EventHandler LaunchApprovedExeComplete; + + /// + /// Fired when the engine is about to begin an MSI transaction. + /// + public event EventHandler BeginMsiTransactionBegin; + + /// + /// Fired when the engine has completed beginning an MSI transaction. + /// + public event EventHandler BeginMsiTransactionComplete; + + /// + /// Fired when the engine is about to commit an MSI transaction. + /// + public event EventHandler CommitMsiTransactionBegin; + + /// + /// Fired when the engine has completed comitting an MSI transaction. + /// + public event EventHandler CommitMsiTransactionComplete; + + /// + /// Fired when the engine is about to rollback an MSI transaction. + /// + public event EventHandler RollbackMsiTransactionBegin; + + /// + /// Fired when the engine has completed rolling back an MSI transaction. + /// + public event EventHandler RollbackMsiTransactionComplete; + + /// + /// Fired when the engine is about to pause Windows automatic updates. + /// + public event EventHandler PauseAutomaticUpdatesBegin; + + /// + /// Fired when the engine has completed pausing Windows automatic updates. + /// + public event EventHandler PauseAutomaticUpdatesComplete; + + /// + /// Fired when the engine is about to take a system restore point. + /// + public event EventHandler SystemRestorePointBegin; + + /// + /// Fired when the engine has completed taking a system restore point. + /// + public event EventHandler SystemRestorePointComplete; /// /// Entry point that is called when the bootstrapper application is ready to run. @@ -1071,9 +1121,9 @@ namespace WixToolset.Mba.Core /// Called by the engine before trying to launch the preapproved executable. /// /// Additional arguments for this event. - protected virtual void OnLaunchApprovedExeBegin(LaunchApprovedExeBeginArgs args) + protected virtual void OnLaunchApprovedExeBegin(LaunchApprovedExeBeginEventArgs args) { - EventHandler handler = this.LaunchApprovedExeBegin; + EventHandler handler = this.LaunchApprovedExeBegin; if (null != handler) { handler(this, args); @@ -1084,9 +1134,139 @@ namespace WixToolset.Mba.Core /// Called by the engine after trying to launch the preapproved executable. /// /// Additional arguments for this event. - protected virtual void OnLaunchApprovedExeComplete(LaunchApprovedExeCompleteArgs args) + protected virtual void OnLaunchApprovedExeComplete(LaunchApprovedExeCompleteEventArgs args) + { + EventHandler handler = this.LaunchApprovedExeComplete; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine before beginning an MSI transaction. + /// + /// Additional arguments for this event. + protected virtual void OnBeginMsiTransactionBegin(BeginMsiTransactionBeginEventArgs args) + { + EventHandler handler = this.BeginMsiTransactionBegin; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine after beginning an MSI transaction. + /// + /// Additional arguments for this event. + protected virtual void OnBeginMsiTransactionComplete(BeginMsiTransactionCompleteEventArgs args) + { + EventHandler handler = this.BeginMsiTransactionComplete; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine before committing an MSI transaction. + /// + /// Additional arguments for this event. + protected virtual void OnCommitMsiTransactionBegin(CommitMsiTransactionBeginEventArgs args) + { + EventHandler handler = this.CommitMsiTransactionBegin; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine after committing an MSI transaction. + /// + /// Additional arguments for this event. + protected virtual void OnCommitMsiTransactionComplete(CommitMsiTransactionCompleteEventArgs args) + { + EventHandler handler = this.CommitMsiTransactionComplete; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine before rolling back an MSI transaction. + /// + /// Additional arguments for this event. + protected virtual void OnRollbackMsiTransactionBegin(RollbackMsiTransactionBeginEventArgs args) + { + EventHandler handler = this.RollbackMsiTransactionBegin; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine after rolling back an MSI transaction. + /// + /// Additional arguments for this event. + protected virtual void OnRollbackMsiTransactionComplete(RollbackMsiTransactionCompleteEventArgs args) + { + EventHandler handler = this.RollbackMsiTransactionComplete; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine before pausing Windows automatic updates. + /// + /// Additional arguments for this event. + protected virtual void OnPauseAutomaticUpdatesBegin(PauseAutomaticUpdatesBeginEventArgs args) + { + EventHandler handler = this.PauseAutomaticUpdatesBegin; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine after pausing Windows automatic updates. + /// + /// Additional arguments for this event. + protected virtual void OnPauseAutomaticUpdatesComplete(PauseAutomaticUpdatesCompleteEventArgs args) + { + EventHandler handler = this.PauseAutomaticUpdatesComplete; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine before taking a system restore point. + /// + /// Additional arguments for this event. + protected virtual void OnSystemRestorePointBegin(SystemRestorePointBeginEventArgs args) { - EventHandler handler = this.LaunchApprovedExeComplete; + EventHandler handler = this.SystemRestorePointBegin; + if (null != handler) + { + handler(this, args); + } + } + + /// + /// Called by the engine after taking a system restore point. + /// + /// Additional arguments for this event. + protected virtual void OnSystemRestorePointComplete(SystemRestorePointCompleteEventArgs args) + { + EventHandler handler = this.SystemRestorePointComplete; if (null != handler) { handler(this, args); @@ -1588,7 +1768,7 @@ namespace WixToolset.Mba.Core int IBootstrapperApplication.OnLaunchApprovedExeBegin(ref bool fCancel) { - LaunchApprovedExeBeginArgs args = new LaunchApprovedExeBeginArgs(fCancel); + LaunchApprovedExeBeginEventArgs args = new LaunchApprovedExeBeginEventArgs(fCancel); this.OnLaunchApprovedExeBegin(args); fCancel = args.Cancel; @@ -1597,12 +1777,94 @@ namespace WixToolset.Mba.Core int IBootstrapperApplication.OnLaunchApprovedExeComplete(int hrStatus, int processId) { - LaunchApprovedExeCompleteArgs args = new LaunchApprovedExeCompleteArgs(hrStatus, processId); + LaunchApprovedExeCompleteEventArgs args = new LaunchApprovedExeCompleteEventArgs(hrStatus, processId); this.OnLaunchApprovedExeComplete(args); return args.HResult; } + int IBootstrapperApplication.OnBeginMsiTransactionBegin(string transactionId, ref bool fCancel) + { + BeginMsiTransactionBeginEventArgs args = new BeginMsiTransactionBeginEventArgs(transactionId, fCancel); + this.OnBeginMsiTransactionBegin(args); + + fCancel = args.Cancel; + return args.HResult; + } + + int IBootstrapperApplication.OnBeginMsiTransactionComplete(string transactionId, int hrStatus) + { + BeginMsiTransactionCompleteEventArgs args = new BeginMsiTransactionCompleteEventArgs(transactionId, hrStatus); + this.OnBeginMsiTransactionComplete(args); + + return args.HResult; + } + + int IBootstrapperApplication.OnCommitMsiTransactionBegin(string transactionId, ref bool fCancel) + { + CommitMsiTransactionBeginEventArgs args = new CommitMsiTransactionBeginEventArgs(transactionId, fCancel); + this.OnCommitMsiTransactionBegin(args); + + fCancel = args.Cancel; + return args.HResult; + } + + int IBootstrapperApplication.OnCommitMsiTransactionComplete(string transactionId, int hrStatus) + { + CommitMsiTransactionCompleteEventArgs args = new CommitMsiTransactionCompleteEventArgs(transactionId, hrStatus); + this.OnCommitMsiTransactionComplete(args); + + return args.HResult; + } + + int IBootstrapperApplication.OnRollbackMsiTransactionBegin(string transactionId) + { + RollbackMsiTransactionBeginEventArgs args = new RollbackMsiTransactionBeginEventArgs(transactionId); + this.OnRollbackMsiTransactionBegin(args); + + return args.HResult; + } + + int IBootstrapperApplication.OnRollbackMsiTransactionComplete(string transactionId, int hrStatus) + { + RollbackMsiTransactionCompleteEventArgs args = new RollbackMsiTransactionCompleteEventArgs(transactionId, hrStatus); + this.OnRollbackMsiTransactionComplete(args); + + return args.HResult; + } + + int IBootstrapperApplication.OnPauseAutomaticUpdatesBegin() + { + PauseAutomaticUpdatesBeginEventArgs args = new PauseAutomaticUpdatesBeginEventArgs(); + this.OnPauseAutomaticUpdatesBegin(args); + + return args.HResult; + } + + int IBootstrapperApplication.OnPauseAutomaticUpdatesComplete(int hrStatus) + { + PauseAutomaticUpdatesCompleteEventArgs args = new PauseAutomaticUpdatesCompleteEventArgs(hrStatus); + this.OnPauseAutomaticUpdatesComplete(args); + + return args.HResult; + } + + int IBootstrapperApplication.OnSystemRestorePointBegin() + { + SystemRestorePointBeginEventArgs args = new SystemRestorePointBeginEventArgs(); + this.OnSystemRestorePointBegin(args); + + return args.HResult; + } + + int IBootstrapperApplication.OnSystemRestorePointComplete(int hrStatus) + { + SystemRestorePointCompleteEventArgs args = new SystemRestorePointCompleteEventArgs(hrStatus); + this.OnSystemRestorePointComplete(args); + + return args.HResult; + } + int IBootstrapperApplication.BAProc(int message, IntPtr pvArgs, IntPtr pvResults, IntPtr pvContext) { switch (message) diff --git a/src/WixToolset.Mba.Core/EventArgs.cs b/src/WixToolset.Mba.Core/EventArgs.cs index 71bd15e1..b52b893a 100644 --- a/src/WixToolset.Mba.Core/EventArgs.cs +++ b/src/WixToolset.Mba.Core/EventArgs.cs @@ -1948,9 +1948,9 @@ namespace WixToolset.Mba.Core /// Additional arguments passed by the engine before it tries to launch the preapproved executable. /// [Serializable] - public class LaunchApprovedExeBeginArgs : CancellableHResultEventArgs + public class LaunchApprovedExeBeginEventArgs : CancellableHResultEventArgs { - public LaunchApprovedExeBeginArgs(bool cancelRecommendation) + public LaunchApprovedExeBeginEventArgs(bool cancelRecommendation) : base(cancelRecommendation) { } @@ -1960,11 +1960,11 @@ namespace WixToolset.Mba.Core /// Additional arguments passed by the engine after it finished trying to launch the preapproved executable. /// [Serializable] - public class LaunchApprovedExeCompleteArgs : StatusEventArgs + public class LaunchApprovedExeCompleteEventArgs : StatusEventArgs { private int processId; - public LaunchApprovedExeCompleteArgs(int hrStatus, int processId) + public LaunchApprovedExeCompleteEventArgs(int hrStatus, int processId) : base(hrStatus) { this.processId = processId; @@ -1979,4 +1979,187 @@ namespace WixToolset.Mba.Core get { return this.processId; } } } + + /// + /// Additional arguments passed by the engine before beginning an MSI transaction. + /// + [Serializable] + public class BeginMsiTransactionBeginEventArgs : CancellableHResultEventArgs + { + private string transactionId; + + public BeginMsiTransactionBeginEventArgs(string transactionId, bool cancelRecommendation) + : base(cancelRecommendation) + { + this.transactionId = transactionId; + } + + /// + /// Gets the MSI transaction Id. + /// + public string TransactionId + { + get { return this.transactionId; } + } + } + + /// + /// Additional arguments passed by the engine after beginning an MSI transaction. + /// + [Serializable] + public class BeginMsiTransactionCompleteEventArgs : StatusEventArgs + { + private string transactionId; + + public BeginMsiTransactionCompleteEventArgs(string transactionId, int hrStatus) + : base(hrStatus) + { + this.transactionId = transactionId; + } + + /// + /// Gets the MSI transaction Id. + /// + public string TransactionId + { + get { return this.transactionId; } + } + } + + /// + /// Additional arguments passed by the engine before committing an MSI transaction. + /// + [Serializable] + public class CommitMsiTransactionBeginEventArgs : CancellableHResultEventArgs + { + private string transactionId; + + public CommitMsiTransactionBeginEventArgs(string transactionId, bool cancelRecommendation) + : base(cancelRecommendation) + { + this.transactionId = transactionId; + } + + /// + /// Gets the MSI transaction Id. + /// + public string TransactionId + { + get { return this.transactionId; } + } + } + + /// + /// Additional arguments passed by the engine after committing an MSI transaction. + /// + [Serializable] + public class CommitMsiTransactionCompleteEventArgs : StatusEventArgs + { + private string transactionId; + + public CommitMsiTransactionCompleteEventArgs(string transactionId, int hrStatus) + : base(hrStatus) + { + this.transactionId = transactionId; + } + + /// + /// Gets the MSI transaction Id. + /// + public string TransactionId + { + get { return this.transactionId; } + } + } + + /// + /// Additional arguments passed by the engine before rolling back an MSI transaction. + /// + [Serializable] + public class RollbackMsiTransactionBeginEventArgs : HResultEventArgs + { + private string transactionId; + + public RollbackMsiTransactionBeginEventArgs(string transactionId) + { + this.transactionId = transactionId; + } + + /// + /// Gets the MSI transaction Id. + /// + public string TransactionId + { + get { return this.transactionId; } + } + } + + /// + /// Additional arguments passed by the engine after rolling back an MSI transaction. + /// + [Serializable] + public class RollbackMsiTransactionCompleteEventArgs : StatusEventArgs + { + private string transactionId; + + public RollbackMsiTransactionCompleteEventArgs(string transactionId, int hrStatus) + : base(hrStatus) + { + this.transactionId = transactionId; + } + + /// + /// Gets the MSI transaction Id. + /// + public string TransactionId + { + get { return this.transactionId; } + } + } + + /// + /// Additional arguments passed by the engine before pausing Windows automatic updates. + /// + [Serializable] + public class PauseAutomaticUpdatesBeginEventArgs : HResultEventArgs + { + public PauseAutomaticUpdatesBeginEventArgs() + { + } + } + + /// + /// Additional arguments passed by the engine after pausing Windows automatic updates. + /// + [Serializable] + public class PauseAutomaticUpdatesCompleteEventArgs : StatusEventArgs + { + public PauseAutomaticUpdatesCompleteEventArgs(int hrStatus) + : base(hrStatus) + { + } + } + + /// + /// Additional arguments passed by the engine before taking a system restore point. + /// + [Serializable] + public class SystemRestorePointBeginEventArgs : HResultEventArgs + { + public SystemRestorePointBeginEventArgs() + { + } + } + + /// + /// Additional arguments passed by the engine after taking a system restore point. + /// + [Serializable] + public class SystemRestorePointCompleteEventArgs : StatusEventArgs + { + public SystemRestorePointCompleteEventArgs(int hrStatus) + : base(hrStatus) + { + } + } } diff --git a/src/WixToolset.Mba.Core/IBootstrapperApplication.cs b/src/WixToolset.Mba.Core/IBootstrapperApplication.cs index 0d79122d..f1a631a3 100644 --- a/src/WixToolset.Mba.Core/IBootstrapperApplication.cs +++ b/src/WixToolset.Mba.Core/IBootstrapperApplication.cs @@ -12,7 +12,6 @@ namespace WixToolset.Mba.Core [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("53C31D56-49C0-426B-AB06-099D717C67FE")] - [GeneratedCodeAttribute("WixToolset.Bootstrapper.InteropCodeGenerator", "1.0.0.0")] public interface IBootstrapperApplication { [PreserveSig] @@ -500,6 +499,69 @@ namespace WixToolset.Mba.Core int processId ); + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnBeginMsiTransactionBegin( + [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId, + [MarshalAs(UnmanagedType.Bool)] ref bool fCancel + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnBeginMsiTransactionComplete( + [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId, + int hrStatus + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnCommitMsiTransactionBegin( + [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId, + [MarshalAs(UnmanagedType.Bool)] ref bool fCancel + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnCommitMsiTransactionComplete( + [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId, + int hrStatus + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnRollbackMsiTransactionBegin( + [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnRollbackMsiTransactionComplete( + [MarshalAs(UnmanagedType.LPWStr)] string wzTransactionId, + int hrStatus + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnPauseAutomaticUpdatesBegin( + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnPauseAutomaticUpdatesComplete( + int hrStatus + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnSystemRestorePointBegin( + ); + + [PreserveSig] + [return: MarshalAs(UnmanagedType.I4)] + int OnSystemRestorePointComplete( + int hrStatus + ); + [PreserveSig] [return: MarshalAs(UnmanagedType.I4)] int BAProc( diff --git a/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs b/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs index 9bea6418..4a30da7e 100644 --- a/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs +++ b/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs @@ -8,6 +8,8 @@ namespace WixToolset.Mba.Core { event EventHandler ApplyBegin; event EventHandler ApplyComplete; + event EventHandler BeginMsiTransactionBegin; + event EventHandler BeginMsiTransactionComplete; event EventHandler CacheAcquireBegin; event EventHandler CacheAcquireComplete; event EventHandler CacheAcquireProgress; @@ -17,6 +19,8 @@ namespace WixToolset.Mba.Core event EventHandler CachePackageComplete; event EventHandler CacheVerifyBegin; event EventHandler CacheVerifyComplete; + event EventHandler CommitMsiTransactionBegin; + event EventHandler CommitMsiTransactionComplete; event EventHandler DetectBegin; event EventHandler DetectCompatibleMsiPackage; event EventHandler DetectComplete; @@ -41,13 +45,16 @@ namespace WixToolset.Mba.Core event EventHandler ExecutePackageComplete; event EventHandler ExecutePatchTarget; event EventHandler ExecuteProgress; - event EventHandler LaunchApprovedExeBegin; - event EventHandler LaunchApprovedExeComplete; + event EventHandler LaunchApprovedExeBegin; + event EventHandler LaunchApprovedExeComplete; + event EventHandler PauseAutomaticUpdatesBegin; + event EventHandler PauseAutomaticUpdatesComplete; event EventHandler PlanBegin; event EventHandler PlanCompatibleMsiPackageBegin; event EventHandler PlanCompatibleMsiPackageComplete; event EventHandler PlanComplete; event EventHandler PlanMsiFeature; + event EventHandler PlanMsiPackage; event EventHandler PlanPackageBegin; event EventHandler PlanPackageComplete; event EventHandler PlanRelatedBundle; @@ -56,8 +63,12 @@ namespace WixToolset.Mba.Core event EventHandler RegisterBegin; event EventHandler RegisterComplete; event EventHandler ResolveSource; + event EventHandler RollbackMsiTransactionBegin; + event EventHandler RollbackMsiTransactionComplete; event EventHandler Shutdown; event EventHandler Startup; + event EventHandler SystemRestorePointBegin; + event EventHandler SystemRestorePointComplete; event EventHandler SystemShutdown; event EventHandler UnregisterBegin; event EventHandler UnregisterComplete; diff --git a/src/balutil/balutil.vcxproj b/src/balutil/balutil.vcxproj index d35a7a77..4793770a 100644 --- a/src/balutil/balutil.vcxproj +++ b/src/balutil/balutil.vcxproj @@ -2,8 +2,8 @@ - - + + @@ -98,8 +98,8 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + diff --git a/src/balutil/inc/BAFunctions.h b/src/balutil/inc/BAFunctions.h index 8101afdb..a95b7a03 100644 --- a/src/balutil/inc/BAFunctions.h +++ b/src/balutil/inc/BAFunctions.h @@ -65,6 +65,16 @@ enum BA_FUNCTIONS_MESSAGE BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN, BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, BA_FUNCTIONS_MESSAGE_ONPLANMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE, + BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN, + BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE, + BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN, + BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE, + BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN, + BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE, + BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN, + BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE, + BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN, + BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE, BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024, BA_FUNCTIONS_MESSAGE_WNDPROC, diff --git a/src/balutil/inc/BalBaseBAFunctions.h b/src/balutil/inc/BalBaseBAFunctions.h index 72edadd5..39934128 100644 --- a/src/balutil/inc/BalBaseBAFunctions.h +++ b/src/balutil/inc/BalBaseBAFunctions.h @@ -612,6 +612,79 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnBeginMsiTransactionBegin( + __in_z LPCWSTR /*wzTransactionId*/, + __inout BOOL* /*pfCancel*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnBeginMsiTransactionComplete( + __in_z LPCWSTR /*wzTransactionId*/, + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnCommitMsiTransactionBegin( + __in_z LPCWSTR /*wzTransactionId*/, + __inout BOOL* /*pfCancel*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnCommitMsiTransactionComplete( + __in_z LPCWSTR /*wzTransactionId*/, + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnRollbackMsiTransactionBegin( + __in_z LPCWSTR /*wzTransactionId*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnRollbackMsiTransactionComplete( + __in_z LPCWSTR /*wzTransactionId*/, + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnPauseAutomaticUpdatesBegin( + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnPauseAutomaticUpdatesComplete( + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnSystemRestorePointBegin( + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnSystemRestorePointComplete( + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP_(HRESULT) BAProc( __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/, __in const LPVOID /*pvArgs*/, diff --git a/src/balutil/inc/BalBaseBAFunctionsProc.h b/src/balutil/inc/BalBaseBAFunctionsProc.h index f6ebd9f6..69843301 100644 --- a/src/balutil/inc/BalBaseBAFunctionsProc.h +++ b/src/balutil/inc/BalBaseBAFunctionsProc.h @@ -100,6 +100,16 @@ static HRESULT WINAPI BalBaseBAFunctionsProc( case BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN: case BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE: case BA_FUNCTIONS_MESSAGE_ONPLANMSIPACKAGE: + case BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONBEGIN: + case BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN: + case BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN: + case BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN: + case BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE: + case BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN: + case BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE: hr = BalBaseBootstrapperApplicationProc((BOOTSTRAPPER_APPLICATION_MESSAGE)message, pvArgs, pvResults, pvContext); break; case BA_FUNCTIONS_MESSAGE_ONTHEMELOADED: diff --git a/src/balutil/inc/BalBaseBootstrapperApplication.h b/src/balutil/inc/BalBaseBootstrapperApplication.h index 612faf54..ad0c60e5 100644 --- a/src/balutil/inc/BalBaseBootstrapperApplication.h +++ b/src/balutil/inc/BalBaseBootstrapperApplication.h @@ -798,6 +798,81 @@ public: // IBootstrapperApplication return S_OK; } + virtual STDMETHODIMP OnBeginMsiTransactionBegin( + __in_z LPCWSTR /*wzTransactionId*/, + __inout BOOL* pfCancel + ) + { + *pfCancel |= CheckCanceled(); + return S_OK; + } + + virtual STDMETHODIMP OnBeginMsiTransactionComplete( + __in_z LPCWSTR /*wzTransactionId*/, + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnCommitMsiTransactionBegin( + __in_z LPCWSTR /*wzTransactionId*/, + __inout BOOL* pfCancel + ) + { + *pfCancel |= CheckCanceled(); + return S_OK; + } + + virtual STDMETHODIMP OnCommitMsiTransactionComplete( + __in_z LPCWSTR /*wzTransactionId*/, + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnRollbackMsiTransactionBegin( + __in_z LPCWSTR /*wzTransactionId*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnRollbackMsiTransactionComplete( + __in_z LPCWSTR /*wzTransactionId*/, + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnPauseAutomaticUpdatesBegin( + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnPauseAutomaticUpdatesComplete( + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnSystemRestorePointBegin( + ) + { + return S_OK; + } + + virtual STDMETHODIMP OnSystemRestorePointComplete( + __in HRESULT /*hrStatus*/ + ) + { + return S_OK; + } + virtual STDMETHODIMP_(HRESULT) BAProc( __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/, __in const LPVOID /*pvArgs*/, diff --git a/src/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/balutil/inc/BalBaseBootstrapperApplicationProc.h index 7d5de8e4..648252b5 100644 --- a/src/balutil/inc/BalBaseBootstrapperApplicationProc.h +++ b/src/balutil/inc/BalBaseBootstrapperApplicationProc.h @@ -513,6 +513,96 @@ static HRESULT BalBaseBAProcOnPlanMsiPackage( return pBA->OnPlanMsiPackage(pArgs->wzPackageId, pArgs->fExecute, pArgs->action, &pResults->fCancel, &pResults->actionMsiProperty, &pResults->uiLevel, &pResults->fDisableExternalUiHandler); } +static HRESULT BalBaseBAProcOnBeginMsiTransactionBegin( + __in IBootstrapperApplication* pBA, + __in BA_ONBEGINMSITRANSACTIONBEGIN_ARGS* pArgs, + __inout BA_ONBEGINMSITRANSACTIONBEGIN_RESULTS* pResults + ) +{ + return pBA->OnBeginMsiTransactionBegin(pArgs->wzTransactionId, &pResults->fCancel); +} + +static HRESULT BalBaseBAProcOnBeginMsiTransactionComplete( + __in IBootstrapperApplication* pBA, + __in BA_ONBEGINMSITRANSACTIONCOMPLETE_ARGS* pArgs, + __inout BA_ONBEGINMSITRANSACTIONCOMPLETE_RESULTS* /*pResults*/ + ) +{ + return pBA->OnBeginMsiTransactionComplete(pArgs->wzTransactionId, pArgs->hrStatus); +} + +static HRESULT BalBaseBAProcOnCommitMsiTransactionBegin( + __in IBootstrapperApplication* pBA, + __in BA_ONCOMMITMSITRANSACTIONBEGIN_ARGS* pArgs, + __inout BA_ONCOMMITMSITRANSACTIONBEGIN_RESULTS* pResults + ) +{ + return pBA->OnCommitMsiTransactionBegin(pArgs->wzTransactionId, &pResults->fCancel); +} + +static HRESULT BalBaseBAProcOnCommitMsiTransactionComplete( + __in IBootstrapperApplication* pBA, + __in BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS* pArgs, + __inout BA_ONCOMMITMSITRANSACTIONCOMPLETE_RESULTS* /*pResults*/ + ) +{ + return pBA->OnCommitMsiTransactionComplete(pArgs->wzTransactionId, pArgs->hrStatus); +} + +static HRESULT BalBaseBAProcOnRollbackMsiTransactionBegin( + __in IBootstrapperApplication* pBA, + __in BA_ONROLLBACKMSITRANSACTIONBEGIN_ARGS* pArgs, + __inout BA_ONROLLBACKMSITRANSACTIONBEGIN_RESULTS* /*pResults*/ + ) +{ + return pBA->OnRollbackMsiTransactionBegin(pArgs->wzTransactionId); +} + +static HRESULT BalBaseBAProcOnRollbackMsiTransactionComplete( + __in IBootstrapperApplication* pBA, + __in BA_ONROLLBACKMSITRANSACTIONCOMPLETE_ARGS* pArgs, + __inout BA_ONROLLBACKMSITRANSACTIONCOMPLETE_RESULTS* /*pResults*/ + ) +{ + return pBA->OnRollbackMsiTransactionComplete(pArgs->wzTransactionId, pArgs->hrStatus); +} + +static HRESULT BalBaseBAProcOnPauseAutomaticUpdatesBegin( + __in IBootstrapperApplication* pBA, + __in BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS* /*pArgs*/, + __inout BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS* /*pResults*/ + ) +{ + return pBA->OnPauseAutomaticUpdatesBegin(); +} + +static HRESULT BalBaseBAProcOnPauseAutomaticUpdatesComplete( + __in IBootstrapperApplication* pBA, + __in BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS* pArgs, + __inout BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS* /*pResults*/ + ) +{ + return pBA->OnPauseAutomaticUpdatesComplete(pArgs->hrStatus); +} + +static HRESULT BalBaseBAProcOnSystemRestorePointBegin( + __in IBootstrapperApplication* pBA, + __in BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS* /*pArgs*/, + __inout BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS* /*pResults*/ + ) +{ + return pBA->OnSystemRestorePointBegin(); +} + +static HRESULT BalBaseBAProcOnSystemRestorePointComplete( + __in IBootstrapperApplication* pBA, + __in BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS* pArgs, + __inout BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS* /*pResults*/ + ) +{ + return pBA->OnSystemRestorePointComplete(pArgs->hrStatus); +} + /******************************************************************* BalBaseBootstrapperApplicationProc - requires pvContext to be of type IBootstrapperApplication. Provides a default mapping between the new message based BA interface and @@ -701,6 +791,35 @@ static HRESULT WINAPI BalBaseBootstrapperApplicationProc( case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE: hr = BalBaseBAProcOnPlanMsiPackage(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN: + hr = BalBaseBAProcOnBeginMsiTransactionBegin(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE: + hr = BalBaseBAProcOnBeginMsiTransactionComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN: + hr = BalBaseBAProcOnCommitMsiTransactionBegin(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE: + hr = BalBaseBAProcOnCommitMsiTransactionComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN: + hr = BalBaseBAProcOnRollbackMsiTransactionBegin(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE: + hr = BalBaseBAProcOnRollbackMsiTransactionComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN: + hr = BalBaseBAProcOnPauseAutomaticUpdatesBegin(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE: + hr = BalBaseBAProcOnPauseAutomaticUpdatesComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN: + hr = BalBaseBAProcOnSystemRestorePointBegin(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE: + hr = BalBaseBAProcOnSystemRestorePointComplete(pBA, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; } } diff --git a/src/balutil/inc/IBootstrapperApplication.h b/src/balutil/inc/IBootstrapperApplication.h index 75ea7bc9..dd8f8024 100644 --- a/src/balutil/inc/IBootstrapperApplication.h +++ b/src/balutil/inc/IBootstrapperApplication.h @@ -518,6 +518,49 @@ DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-A __in DWORD dwProcessId ) = 0; + STDMETHOD(OnBeginMsiTransactionBegin)( + __in_z LPCWSTR wzTransactionId, + __inout BOOL* pfCancel + ) = 0; + + STDMETHOD(OnBeginMsiTransactionComplete)( + __in_z LPCWSTR wzTransactionId, + __in HRESULT hrStatus + ) = 0; + + STDMETHOD(OnCommitMsiTransactionBegin)( + __in_z LPCWSTR wzTransactionId, + __inout BOOL* pfCancel + ) = 0; + + STDMETHOD(OnCommitMsiTransactionComplete)( + __in_z LPCWSTR wzTransactionId, + __in HRESULT hrStatus + ) = 0; + + STDMETHOD(OnRollbackMsiTransactionBegin)( + __in_z LPCWSTR wzTransactionId + ) = 0; + + STDMETHOD(OnRollbackMsiTransactionComplete)( + __in_z LPCWSTR wzTransactionId, + __in HRESULT hrStatus + ) = 0; + + STDMETHOD(OnPauseAutomaticUpdatesBegin)( + ) = 0; + + STDMETHOD(OnPauseAutomaticUpdatesComplete)( + __in HRESULT hrStatus + ) = 0; + + STDMETHOD(OnSystemRestorePointBegin)( + ) = 0; + + STDMETHOD(OnSystemRestorePointComplete)( + __in HRESULT hrStatus + ) = 0; + // BAProc - The PFN_BOOTSTRAPPER_APPLICATION_PROC can call this method to give the BA raw access to the callback from the engine. // This might be used to help the BA support more than one version of the engine. STDMETHOD(BAProc)( diff --git a/src/balutil/packages.config b/src/balutil/packages.config index dbc4eb18..e6716363 100644 --- a/src/balutil/packages.config +++ b/src/balutil/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/src/bextutil/bextutil.vcxproj b/src/bextutil/bextutil.vcxproj index def0dd59..2e248d2c 100644 --- a/src/bextutil/bextutil.vcxproj +++ b/src/bextutil/bextutil.vcxproj @@ -2,8 +2,8 @@ - - + + @@ -87,8 +87,8 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + diff --git a/src/bextutil/packages.config b/src/bextutil/packages.config index dbc4eb18..e6716363 100644 --- a/src/bextutil/packages.config +++ b/src/bextutil/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/src/mbanative/mbanative.vcxproj b/src/mbanative/mbanative.vcxproj index 69309f8a..be60f3a9 100644 --- a/src/mbanative/mbanative.vcxproj +++ b/src/mbanative/mbanative.vcxproj @@ -5,8 +5,8 @@ - - + + @@ -94,7 +94,7 @@ - - + + \ No newline at end of file diff --git a/src/mbanative/packages.config b/src/mbanative/packages.config index 20047373..46972411 100644 --- a/src/mbanative/packages.config +++ b/src/mbanative/packages.config @@ -4,6 +4,6 @@ - - + + \ No newline at end of file diff --git a/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj b/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj index 53d14cd7..a57c6f01 100644 --- a/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj +++ b/src/test/BalUtilUnitTest/BalUtilUnitTest.vcxproj @@ -4,8 +4,8 @@ - - + + Debug @@ -67,7 +67,7 @@ - - + + diff --git a/src/test/BalUtilUnitTest/packages.config b/src/test/BalUtilUnitTest/packages.config index b8423837..e3b144e6 100644 --- a/src/test/BalUtilUnitTest/packages.config +++ b/src/test/BalUtilUnitTest/packages.config @@ -10,6 +10,6 @@ - - + + \ No newline at end of file diff --git a/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj b/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj index 15a1f51d..c1cf107c 100644 --- a/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj +++ b/src/test/BextUtilUnitTest/BextUtilUnitTest.vcxproj @@ -4,8 +4,8 @@ - - + + Debug @@ -66,7 +66,7 @@ - - + + diff --git a/src/test/BextUtilUnitTest/packages.config b/src/test/BextUtilUnitTest/packages.config index b8423837..e3b144e6 100644 --- a/src/test/BextUtilUnitTest/packages.config +++ b/src/test/BextUtilUnitTest/packages.config @@ -10,6 +10,6 @@ - - + + \ No newline at end of file -- cgit v1.2.3-55-g6feb