blob: 91b909e1181117a892d6254bf7f3827c6b9f63a7 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------
// <copyright file="IBootstrapperApplication.h" company="Outercurve Foundation">
// Copyright (c) 2004, Outercurve Foundation.
// This software is released under Microsoft Reciprocal License (MS-RL).
// The license and further copyright text can be found in the file
// LICENSE.TXT at the root directory of the distribution.
// </copyright>
//
// <summary>
// IBootstrapperApplication implemented by a bootstrapper application and used by bootstrapper engine.
// </summary>
//-------------------------------------------------------------------------------------------------
#pragma once
enum BOOTSTRAPPER_DISPLAY
{
BOOTSTRAPPER_DISPLAY_UNKNOWN,
BOOTSTRAPPER_DISPLAY_EMBEDDED,
BOOTSTRAPPER_DISPLAY_NONE,
BOOTSTRAPPER_DISPLAY_PASSIVE,
BOOTSTRAPPER_DISPLAY_FULL,
};
enum BOOTSTRAPPER_RESTART
{
BOOTSTRAPPER_RESTART_UNKNOWN,
BOOTSTRAPPER_RESTART_NEVER,
BOOTSTRAPPER_RESTART_PROMPT,
BOOTSTRAPPER_RESTART_AUTOMATIC,
BOOTSTRAPPER_RESTART_ALWAYS,
};
enum BOOTSTRAPPER_RESUME_TYPE
{
BOOTSTRAPPER_RESUME_TYPE_NONE,
BOOTSTRAPPER_RESUME_TYPE_INVALID, // resume information is present but invalid
BOOTSTRAPPER_RESUME_TYPE_INTERRUPTED, // relaunched after an unexpected interruption
BOOTSTRAPPER_RESUME_TYPE_REBOOT_PENDING, // reboot has not taken place yet
BOOTSTRAPPER_RESUME_TYPE_REBOOT, // relaunched after reboot
BOOTSTRAPPER_RESUME_TYPE_SUSPEND, // relaunched after suspend
BOOTSTRAPPER_RESUME_TYPE_ARP, // launched from ARP
};
enum BOOTSTRAPPER_ERROR_TYPE
{
BOOTSTRAPPER_ERROR_TYPE_ELEVATE, // error occurred trying to elevate.
BOOTSTRAPPER_ERROR_TYPE_WINDOWS_INSTALLER, // error came from windows installer.
BOOTSTRAPPER_ERROR_TYPE_EXE_PACKAGE, // error came from an exe package.
BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_SERVER, // error occurred trying to authenticate with HTTP server.
BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_PROXY, // error occurred trying to authenticate with HTTP proxy.
BOOTSTRAPPER_ERROR_TYPE_APPLY, // error occurred during apply.
};
enum BOOTSTRAPPER_RELATED_OPERATION
{
BOOTSTRAPPER_RELATED_OPERATION_NONE,
BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE,
BOOTSTRAPPER_RELATED_OPERATION_MINOR_UPDATE,
BOOTSTRAPPER_RELATED_OPERATION_MAJOR_UPGRADE,
BOOTSTRAPPER_RELATED_OPERATION_REMOVE,
BOOTSTRAPPER_RELATED_OPERATION_INSTALL,
BOOTSTRAPPER_RELATED_OPERATION_REPAIR,
};
enum BOOTSTRAPPER_CACHE_OPERATION
{
BOOTSTRAPPER_CACHE_OPERATION_COPY,
BOOTSTRAPPER_CACHE_OPERATION_DOWNLOAD,
BOOTSTRAPPER_CACHE_OPERATION_EXTRACT,
};
enum BOOTSTRAPPER_APPLY_RESTART
{
BOOTSTRAPPER_APPLY_RESTART_NONE,
BOOTSTRAPPER_APPLY_RESTART_REQUIRED,
BOOTSTRAPPER_APPLY_RESTART_INITIATED,
};
enum BOOTSTRAPPER_RELATION_TYPE
{
BOOTSTRAPPER_RELATION_NONE,
BOOTSTRAPPER_RELATION_DETECT,
BOOTSTRAPPER_RELATION_UPGRADE,
BOOTSTRAPPER_RELATION_ADDON,
BOOTSTRAPPER_RELATION_PATCH,
BOOTSTRAPPER_RELATION_DEPENDENT,
BOOTSTRAPPER_RELATION_UPDATE,
};
struct BOOTSTRAPPER_COMMAND
{
BOOTSTRAPPER_ACTION action;
BOOTSTRAPPER_DISPLAY display;
BOOTSTRAPPER_RESTART restart;
LPWSTR wzCommandLine;
int nCmdShow;
BOOTSTRAPPER_RESUME_TYPE resumeType;
HWND hwndSplashScreen;
// If this was run from a related bundle, specifies the relation type
BOOTSTRAPPER_RELATION_TYPE relationType;
BOOL fPassthrough;
LPWSTR wzLayoutDirectory;
};
DECLARE_INTERFACE_IID_(IBootstrapperApplication, IUnknown, "53C31D56-49C0-426B-AB06-099D717C67FE")
{
// OnStartup - called when the engine is ready for the bootstrapper application to start.
//
STDMETHOD(OnStartup)() = 0;
// OnShutdown - called after the bootstrapper application quits the engine.
//
// Return:
// IDRESTART instructs the engine to restart. The engine will not launch again after the machine
// is rebooted. Ignored if reboot was already initiated by OnExecutePackageComplete().
//
// IDRELOAD_BOOTSTRAPPER instructs the engine to unload the bootstrapper application and restart
// the engine which will load the bootstrapper application again. Typically
// used to switch from a native bootstrapper application to a managed one.
//
// All other return codes are ignored.
STDMETHOD_(int, OnShutdown)() = 0;
// OnSystemShutdown - called when the operating system is instructed to shutdown the machine.
//
// Return:
// IDCANCEL instructs the engine to block the shutdown of the machine.
//
// All other return codes allow the shutdown to commence.
STDMETHOD_(int, OnSystemShutdown)(
__in DWORD dwEndSession,
__in int nRecommendation
) = 0;
// OnDetectBegin - called when the engine begins detection.
//
// Return:
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnDetectBegin)(
__in BOOL fInstalled,
__in DWORD cPackages
) = 0;
// OnDetectForwardCompatibleBundle - called when the engine detects a forward compatible bundle.
//
// Return:
// IDOK instructs the engine to use the forward compatible bundle.
//
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to not use the forward compatible bundle.
STDMETHOD_(int, OnDetectForwardCompatibleBundle)(
__in_z LPCWSTR wzBundleId,
__in BOOTSTRAPPER_RELATION_TYPE relationType,
__in_z LPCWSTR wzBundleTag,
__in BOOL fPerMachine,
__in DWORD64 dw64Version,
__in int nRecommendation
) = 0;
// OnDetectUpdateBegin - called when the engine begins detection for bundle update.
//
// Return:
// IDOK instructs the engine to attempt update detection.
//
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to skip update detection.
STDMETHOD_(int, OnDetectUpdateBegin)(
__in_z LPCWSTR wzUpdateLocation,
__in int nRecommendation
) = 0;
// OnDetectUpdateComplete - called when the engine completes detection for bundle update.
//
// Remarks:
// wzUpdateLocation is null if no update was available.
STDMETHOD_(void, OnDetectUpdateComplete)(
__in HRESULT hrStatus,
__in_z_opt LPCWSTR wzUpdateLocation
) = 0;
// OnDetectRelatedBundle - called when the engine detects a related bundle.
//
// Return:
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnDetectRelatedBundle)(
__in_z LPCWSTR wzBundleId,
__in BOOTSTRAPPER_RELATION_TYPE relationType,
__in_z LPCWSTR wzBundleTag,
__in BOOL fPerMachine,
__in DWORD64 dw64Version,
__in BOOTSTRAPPER_RELATED_OPERATION operation
) = 0;
// OnDetectPackageBegin - called when the engine begins detecting a package.
//
// Return:
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnDetectPackageBegin)(
__in_z LPCWSTR wzPackageId
) = 0;
// OnDetectRelatedMsiPackage - called when the engine begins detects a related package.
//
// Return:
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnDetectRelatedMsiPackage)(
__in_z LPCWSTR wzPackageId,
__in_z LPCWSTR wzProductCode,
__in BOOL fPerMachine,
__in DWORD64 dw64Version,
__in BOOTSTRAPPER_RELATED_OPERATION operation
) = 0;
// OnDetectTargetMsiPackage - called when the engine detects a target MSI package for
// an MSP package.
//
// Return:
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnDetectTargetMsiPackage)(
__in_z LPCWSTR wzPackageId,
__in_z LPCWSTR wzProductCode,
__in BOOTSTRAPPER_PACKAGE_STATE patchState
) = 0;
// OnDetectMsiFeature - called when the engine detects a feature in an MSI package.
//
// Return:
// IDCANCEL instructs the engine to stop detection.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnDetectMsiFeature)(
__in_z LPCWSTR wzPackageId,
__in_z LPCWSTR wzFeatureId,
__in BOOTSTRAPPER_FEATURE_STATE state
) = 0;
// OnDetectPackageComplete - called after the engine detects a package.
//
STDMETHOD_(void, OnDetectPackageComplete)(
__in_z LPCWSTR wzPackageId,
__in HRESULT hrStatus,
__in BOOTSTRAPPER_PACKAGE_STATE state
) = 0;
// OnDetectPackageComplete - called after the engine completes detection.
//
STDMETHOD_(void, OnDetectComplete)(
__in HRESULT hrStatus
) = 0;
// OnPlanBegin - called when the engine begins planning.
//
// Return:
// IDCANCEL instructs the engine to stop planning.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnPlanBegin)(
__in DWORD cPackages
) = 0;
// OnPlanRelatedBundle - called when the engine begins planning a related bundle.
//
// Return:
// IDCANCEL instructs the engine to stop planning.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnPlanRelatedBundle)(
__in_z LPCWSTR wzBundleId,
__inout BOOTSTRAPPER_REQUEST_STATE* pRequestedState
) = 0;
// OnPlanPackageBegin - called when the engine begins planning a package.
//
// Return:
// IDCANCEL instructs the engine to stop planning.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnPlanPackageBegin)(
__in_z LPCWSTR wzPackageId,
__inout BOOTSTRAPPER_REQUEST_STATE* pRequestedState
) = 0;
// OnPlanTargetMsiPackage - called when the engine plans an MSP package
// to apply to an MSI package.
//
// Return:
// IDCANCEL instructs the engine to stop planning.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnPlanTargetMsiPackage)(
__in_z LPCWSTR wzPackageId,
__in_z LPCWSTR wzProductCode,
__inout BOOTSTRAPPER_REQUEST_STATE* pRequestedState
) = 0;
// OnPlanMsiFeature - called when the engine plans a feature in an
// MSI package.
//
// Return:
// IDCANCEL instructs the engine to stop planning.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnPlanMsiFeature)(
__in_z LPCWSTR wzPackageId,
__in_z LPCWSTR wzFeatureId,
__inout BOOTSTRAPPER_FEATURE_STATE* pRequestedState
) = 0;
// OnPlanPackageComplete - called after the engine plans a package.
//
STDMETHOD_(void, OnPlanPackageComplete)(
__in_z LPCWSTR wzPackageId,
__in HRESULT hrStatus,
__in BOOTSTRAPPER_PACKAGE_STATE state,
__in BOOTSTRAPPER_REQUEST_STATE requested,
__in BOOTSTRAPPER_ACTION_STATE execute,
__in BOOTSTRAPPER_ACTION_STATE rollback
) = 0;
// OnPlanComplete - called when the engine completes planning.
//
STDMETHOD_(void, OnPlanComplete)(
__in HRESULT hrStatus
) = 0;
// OnApplyBegin - called when the engine begins applying the plan.
//
// Return:
// IDCANCEL instructs the engine to stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnApplyBegin)() = 0;
// OnElevate - called before the engine displays an elevation prompt.
// Will only happen once per execution of the engine.
//
// Return:
// IDCANCEL instructs the engine to abort elevation and stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnElevate)() = 0;
// OnProgress - called when the engine makes progress.
//
// Return:
// IDCANCEL instructs the engine to stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnProgress)(
__in DWORD dwProgressPercentage,
__in DWORD dwOverallPercentage
) = 0;
// OnError - called when the engine encounters an error.
//
// Return:
// uiFlags is a combination of valid ID* return values appropriate for
// the error.
//
// IDNOACTION instructs the engine to pass the error through to default
// handling which usually results in the apply failing.
STDMETHOD_(int, OnError)(
__in BOOTSTRAPPER_ERROR_TYPE errorType,
__in_z_opt LPCWSTR wzPackageId,
__in DWORD dwCode,
__in_z_opt LPCWSTR wzError,
__in DWORD uiFlags,
__in DWORD cData,
__in_ecount_z_opt(cData) LPCWSTR* rgwzData,
__in int nRecommendation
) = 0;
// OnRegisterBegin - called when the engine registers the bundle.
//
// Return:
// IDCANCEL instructs the engine to stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnRegisterBegin)() = 0;
// OnRegisterComplete - called when the engine registration is
// complete.
//
STDMETHOD_(void, OnRegisterComplete)(
__in HRESULT hrStatus
) = 0;
// OnCacheBegin - called when the engine begins caching.
//
// Return:
// IDCANCEL instructs the engine to stop caching.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnCacheBegin)() = 0;
// OnCachePackageBegin - called when the engine begins caching
// a package.
//
// Return:
// IDCANCEL instructs the engine to stop caching.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnCachePackageBegin)(
__in_z LPCWSTR wzPackageId,
__in DWORD cCachePayloads,
__in DWORD64 dw64PackageCacheSize
) = 0;
// OnCacheAcquireBegin - called when the engine begins copying or
// downloading a payload to the working folder.
//
// Return:
// IDCANCEL instructs the engine to stop caching.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnCacheAcquireBegin)(
__in_z_opt LPCWSTR wzPackageOrContainerId,
__in_z_opt LPCWSTR wzPayloadId,
__in BOOTSTRAPPER_CACHE_OPERATION operation,
__in_z LPCWSTR wzSource
) = 0;
// OnCacheAcquireProgress - called when the engine makes progresss copying
// or downloading a payload to the working folder.
//
// Return:
// IDCANCEL instructs the engine to stop caching.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnCacheAcquireProgress)(
__in_z_opt LPCWSTR wzPackageOrContainerId,
__in_z_opt LPCWSTR wzPayloadId,
__in DWORD64 dw64Progress,
__in DWORD64 dw64Total,
__in DWORD dwOverallPercentage
) = 0;
// OnResolveSource - called when a payload or container cannot be found locally.
//
// Parameters:
// wzPayloadId will be NULL when resolving a container.
// wzDownloadSource will be NULL if the container or payload does not provide a DownloadURL.
//
// Return:
// IDRETRY instructs the engine to try the local source again.
//
// IDDOWNLOAD instructs the engine to try the download source.
//
// All other return codes result in an error.
//
// Notes:
// It is expected the BA may call IBurnCore::SetLocalSource() or IBurnCore::SetDownloadSource()
// to update the source location before returning IDRETRY or IDDOWNLOAD.
STDMETHOD_(int, OnResolveSource)(
__in_z LPCWSTR wzPackageOrContainerId,
__in_z_opt LPCWSTR wzPayloadId,
__in_z LPCWSTR wzLocalSource,
__in_z_opt LPCWSTR wzDownloadSource
) = 0;
// OnCacheAcquireComplete - called after the engine copied or downloaded
// a payload to the working folder.
//
// Return:
// IDRETRY instructs the engine to try the copy or download of the payload again.
//
// All other return codes are ignored.
STDMETHOD_(int, OnCacheAcquireComplete)(
__in_z_opt LPCWSTR wzPackageOrContainerId,
__in_z_opt LPCWSTR wzPayloadId,
__in HRESULT hrStatus,
__in int nRecommendation
) = 0;
// OnCacheVerifyBegin - called when the engine begins to verify then copy
// a payload or container to the package cache folder.
//
// Return:
// IDCANCEL instructs the engine to stop caching.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnCacheVerifyBegin)(
__in_z_opt LPCWSTR wzPackageOrContainerId,
__in_z_opt LPCWSTR wzPayloadId
) = 0;
// OnCacheVerifyComplete - called after the engine verifies and copies
// a payload or container to the package cache folder.
//
// Return:
// IDRETRY instructs the engine to try the verification of the payload again.
// Ignored if hrStatus is success.
//
// IDTRYAGAIN instructs the engine to acquire the payload again. Ignored if
// hrStatus is success.
//
// All other return codes are ignored.
STDMETHOD_(int, OnCacheVerifyComplete)(
__in_z_opt LPCWSTR wzPackageOrContainerId,
__in_z_opt LPCWSTR wzPayloadId,
__in HRESULT hrStatus,
__in int nRecommendation
) = 0;
// OnCachePackageComplete - called after the engine attempts to copy or download all
// payloads of a package into the package cache folder.
//
// Return:
// IDIGNORE instructs the engine to ignore non-vital package failures and continue with the
// caching. Ignored if hrStatus is a success or the package is vital.
//
// IDRETRY instructs the engine to try the acquisition and verification of the package
// again. Ignored if hrStatus is a success.
//
// All other return codes are ignored.
STDMETHOD_(int, OnCachePackageComplete)(
__in_z LPCWSTR wzPackageId,
__in HRESULT hrStatus,
__in int nRecommendation
) = 0;
// OnCacheComplete - called when the engine caching is complete.
//
STDMETHOD_(void, OnCacheComplete)(
__in HRESULT hrStatus
) = 0;
// OnExecuteBegin - called when the engine begins executing the plan.
//
// Return:
// IDCANCEL instructs the engine to stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnExecuteBegin)(
__in DWORD cExecutingPackages
) = 0;
// OnExecuteBegin - called when the engine begins executing a package.
//
// Return:
// IDCANCEL instructs the engine to stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnExecutePackageBegin)(
__in_z LPCWSTR wzPackageId,
__in BOOL fExecute
) = 0;
// OnExecutePatchTarget - called when the engine executes one or more patches targeting
// a product.
//
// Return:
// IDCANCEL instructs the engine to stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnExecutePatchTarget)(
__in_z LPCWSTR wzPackageId,
__in_z LPCWSTR wzTargetProductCode
) = 0;
// OnExecuteProgress - called when the engine makes progress executing a package.
//
// Return:
// IDCANCEL instructs the engine to stop applying.
//
// IDNOACTION instructs the engine to continue.
STDMETHOD_(int, OnExecuteProgress)(
__in_z LPCWSTR wzPackageId,
__in DWORD dwProgressPercentage,
__in DWORD dwOverallPercentage
) = 0;
// OnExecuteMsiMessage - called when the engine receives an MSI package message.
//
// Return:
// uiFlags is a combination of valid ID* return values appropriate for
// the message.
//
// IDNOACTION instructs the engine to pass the message through to default
// handling which usually results in the execution continuing.
STDMETHOD_(int, OnExecuteMsiMessage)(
__in_z LPCWSTR wzPackageId,
__in INSTALLMESSAGE mt,
__in UINT uiFlags,
__in_z LPCWSTR wzMessage,
__in DWORD cData,
__in_ecount_z_opt(cData) LPCWSTR* rgwzData,
__in int nRecommendation
) = 0;
// OnExecuteFilesInUse - called when the engine encounters files in use while
// executing a package.
//
// Return:
// IDOK instructs the engine to let the Restart Manager attempt to close the
// applications to avoid a restart.
//
// IDCANCEL instructs the engine to abort the execution and start rollback.
//
// IDIGNORE instructs the engine to ignore the running applications. A restart will be
// required.
//
// IDRETRY instructs the engine to check if the applications are still running again.
//
// IDNOACTION is equivalent to ignoring the running applications. A restart will be
// required.
STDMETHOD_(int, OnExecuteFilesInUse)(
__in_z LPCWSTR wzPackageId,
__in DWORD cFiles,
__in_ecount_z(cFiles) LPCWSTR* rgwzFiles
) = 0;
// OnExecutePackageComplete - called when a package execution is complete.
//
// Parameters:
// restart will indicate whether this package requires a reboot or initiated the reboot already.
//
// Return:
// IDIGNORE instructs the engine to ignore non-vital package failures and continue with the
// install. Ignored if hrStatus is a success or the package is vital.
//
// IDRETRY instructs the engine to try the execution of the package again. Ignored if hrStatus
// is a success.
//
// IDRESTART instructs the engine to stop processing the chain and restart. The engine will
// launch again after the machine is restarted.
//
// IDSUSPEND instructs the engine to stop processing the chain and suspend the current state.
//
// All other return codes are ignored.
STDMETHOD_(int, OnExecutePackageComplete)(
__in_z LPCWSTR wzPackageId,
__in HRESULT hrStatus,
__in BOOTSTRAPPER_APPLY_RESTART restart,
__in int nRecommendation
) = 0;
// OnExecuteComplete - called when the engine execution is complete.
//
STDMETHOD_(void, OnExecuteComplete)(
__in HRESULT hrStatus
) = 0;
// OnUnregisterBegin - called when the engine unregisters the bundle.
//
STDMETHOD_(void, OnUnregisterBegin)() = 0;
// OnUnregisterComplete - called when the engine unregistration is complete.
//
STDMETHOD_(void, OnUnregisterComplete)(
__in HRESULT hrStatus
) = 0;
// OnApplyComplete - called after the plan has been applied.
//
// Parameters:
// restart will indicate whether any package required a reboot or initiated the reboot already.
//
// Return:
// IDRESTART instructs the engine to restart. The engine will not launch again after the machine
// is rebooted. Ignored if reboot was already initiated by OnExecutePackageComplete().
//
// All other return codes are ignored.
STDMETHOD_(int, OnApplyComplete)(
__in HRESULT hrStatus,
__in BOOTSTRAPPER_APPLY_RESTART restart
) = 0;
};
extern "C" typedef HRESULT (WINAPI *PFN_BOOTSTRAPPER_APPLICATION_CREATE)(
__in IBootstrapperEngine* pEngine,
__in const BOOTSTRAPPER_COMMAND* pCommand,
__out IBootstrapperApplication** ppApplication
);
extern "C" typedef void (WINAPI *PFN_BOOTSTRAPPER_APPLICATION_DESTROY)();