Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add debug logging mode #30

Open
wants to merge 31 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
bad0fa8
Expand the checks used to determine the RebootPending property value.
barnson Jul 23, 2015
700f72c
Review feedback
barnson Jul 23, 2015
2f21b33
Add BOOTSTRAPPER_ACTION_STATE_MEND and BOOTSTRAPPER_REQUEST_STATE_MEN…
barnson Mar 21, 2016
7938b7d
Merge pull request #15 from firegiant/bob/BurnMend
robmen Mar 22, 2016
5392db2
Add BOOTSTRAPPER_ACTION_STATE_MEND and BOOTSTRAPPER_REQUEST_STATE_MEN…
barnson Dec 9, 2016
295f6ca
Merge pull request #16 from firegiant/bob/add.mend.to.mba
robmen Dec 9, 2016
6a911db
Clarify another limitation of duplicate GUIDs in LGHT1137 message.
barnson Dec 20, 2016
e204df7
Merge pull request #17 from firegiant/bob/LGHT1137.clarification
robmen Dec 21, 2016
40e0533
Add condition to RemoveFoldersEx. #1507, #1508, #1509
barnson Jan 4, 2017
023b1cb
Merge pull request #18 from firegiant/bob/RemoveFoldersExCondition
robmen Jan 4, 2017
331ccd3
Support WOW64 file-system redirection in WixRemoveFoldersEx.
barnson Jan 5, 2017
ca069f3
Merge pull request #19 from firegiant/bob/RemoveFoldersExCondition
robmen Jan 5, 2017
67ff727
WixRemoveRegistryKeyEx: Extension to conditionally remove registry keys
barnson Jan 13, 2017
70e3118
Merge pull request #20 from firegiant/bob/WixRemoveRegistryKeyEx
robmen Jan 14, 2017
5a95d34
Add wixtasks.dll fallback to WiX v3.10.
barnson Mar 16, 2017
fd2406d
Merge pull request #22 from firegiant/bob/wix.ca.targets.2017.fix3
robmen Mar 16, 2017
f506c4b
Scale splashscreen bitmap and avoid double painting.
barnson Mar 21, 2017
536fd3d
Merge pull request #23 from firegiant/bob/scaled.splashscreen.1656
robmen Mar 22, 2017
9e25a0a
Format log prefix to support variable references.
barnson Mar 23, 2017
d01fc81
Merge pull request #24 from firegiant/bob/formatted.log.names.1655
robmen Mar 23, 2017
2e8f5f3
Implement RepairCondition on ExePackage, MsiPackage, and MspPackage.
barnson Mar 29, 2017
5d81109
Merge pull request #25 from firegiant/bob/repaircondition
robmen Mar 29, 2017
12b3679
Let superseded patches repair by default.
barnson Mar 31, 2017
cd4631b
Merge pull request #26 from firegiant/bob/superseded.patch.repair
robmen Mar 31, 2017
adecc82
- Add IBootstrapperEngine::SetUpdateSource to let a BA update the fee…
barnson Apr 26, 2017
4bc90e2
Merge pull request #27 from firegiant/bob/SetUpdateSource
robmen Apr 26, 2017
2f9bed3
Fix bad formatting types in a Burn engine message.
barnson May 30, 2017
f874f77
Merge pull request #28 from firegiant/bob/burn.engine.message.arg.types
robmen May 30, 2017
9e1da45
Reverse checks to look for per-machine package registration first, be…
barnson Jun 5, 2017
730320f
Merge pull request #29 from firegiant/bob/burn.per.machine.detection
robmen Jun 5, 2017
5fb89ea
Add debug logging mode. Add debug logging around WM_ENDSESSION messag…
barnson Jul 10, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 29 additions & 1 deletion src/burn/engine/EngineForApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -742,7 +742,7 @@ class CEngineForApplication : public IBootstrapperEngine, public IMarshal
__in_z LPCWSTR wzApprovedExeForElevationId,
__in_z_opt LPCWSTR wzArguments,
__in DWORD dwWaitForInputIdleTimeout
)
)
{
HRESULT hr = S_OK;
BURN_APPROVED_EXE* pApprovedExe = NULL;
Expand Down Expand Up @@ -797,6 +797,34 @@ class CEngineForApplication : public IBootstrapperEngine, public IMarshal
return hr;
}

virtual STDMETHODIMP SetUpdateSource(
__in_z LPCWSTR wzUrl,
__in_z_opt LPWSTR /*wzUser*/,
__in_z_opt LPWSTR /*wzPassword*/
)
{
HRESULT hr = S_OK;

::EnterCriticalSection(&m_pEngineState->csActive);
UserExperienceDeactivateEngine(&m_pEngineState->userExperience);

if (wzUrl && *wzUrl)
{
hr = StrAllocString(&m_pEngineState->update.sczUpdateSource, wzUrl, 0);
ExitOnFailure(hr, "Failed to set feed download URL.");
}
else // no URL provided means clear out the whole download source.
{
ReleaseNullStr(m_pEngineState->update.sczUpdateSource);
}

LExit:
UserExperienceActivateEngine(&m_pEngineState->userExperience, NULL);
::LeaveCriticalSection(&m_pEngineState->csActive);

return hr;
}

public: // IMarshal
virtual STDMETHODIMP GetUnmarshalClass(
__in REFIID /*riid*/,
Expand Down
1 change: 1 addition & 0 deletions src/burn/engine/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ typedef struct _BURN_ENGINE_STATE
BURN_AU_PAUSE_ACTION automaticUpdates;

DWORD dwElevatedLoggingTlsId;
BOOL fDebugLogging;

LPWSTR sczBundleEngineWorkingPath;
BURN_PIPE_CONNECTION companionConnection;
Expand Down
1 change: 1 addition & 0 deletions src/burn/engine/dependency.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -924,6 +924,7 @@ static void CalculateDependencyActionStates(
break;
case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough;
case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough;
case BOOTSTRAPPER_ACTION_STATE_MEND: __fallthrough;
case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough;
case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE: __fallthrough;
case BOOTSTRAPPER_ACTION_STATE_MAJOR_UPGRADE: __fallthrough;
Expand Down
8 changes: 7 additions & 1 deletion src/burn/engine/detect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ extern "C" HRESULT DetectUpdate(
HRESULT hr = S_OK;
int nResult = IDNOACTION;
BOOL fBeginCalled = FALSE;
LPWSTR sczOriginalSource = NULL;

// If no update source was specified, skip update detection.
if (!pUpdate->sczUpdateSource || !*pUpdate->sczUpdateSource)
Expand All @@ -228,7 +229,10 @@ extern "C" HRESULT DetectUpdate(

fBeginCalled = TRUE;

nResult = pUX->pUserExperience->OnDetectUpdateBegin(pUpdate->sczUpdateSource, IDNOACTION);
hr = StrAllocString(&sczOriginalSource, pUpdate->sczUpdateSource, 0);
ExitOnFailure(hr, "Failed to duplicate update feed source.");

nResult = pUX->pUserExperience->OnDetectUpdateBegin(sczOriginalSource, IDNOACTION);
hr = UserExperienceInterpretResult(pUX, MB_OKCANCEL, nResult);
ExitOnRootFailure(hr, "UX aborted detect update begin.");

Expand All @@ -243,6 +247,8 @@ extern "C" HRESULT DetectUpdate(
}

LExit:
ReleaseStr(sczOriginalSource);

if (fBeginCalled)
{
pUX->pUserExperience->OnDetectUpdateComplete(hr, pUpdate->fUpdateAvailable ? pUpdate->sczUpdateSource : NULL);
Expand Down
11 changes: 11 additions & 0 deletions src/burn/engine/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -593,6 +593,12 @@ static HRESULT RunElevated(
ExitWithLastError(hr, "Failed to set elevated pipe into thread local storage for logging.");
}

if (0 < ::GetEnvironmentVariableW(L"WIX_BURN_DEBUG_LOGGING", NULL, 0))
{
pEngineState->fDebugLogging = TRUE;
LogSetLevel(REPORT_DEBUG, FALSE);
}

LogRedirect(RedirectLoggingOverPipe, pEngineState);

// Create a top-level window to prevent shutting down the elevated process.
Expand Down Expand Up @@ -801,6 +807,11 @@ static HRESULT DAPI RedirectLoggingOverPipe(
SIZE_T cbData = 0;
DWORD dwResult = 0;

if (pEngineState->fDebugLogging)
{
::OutputDebugStringA(szString);
}

// Prevent this function from being called recursively.
if (s_fCurrentlyLoggingToPipe)
{
Expand Down
2 changes: 1 addition & 1 deletion src/burn/engine/engine.mc
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ MessageId=152
Severity=Error
SymbolicName=MSG_FAILED_READ_RELATED_PACKAGE_LANGUAGE
Language=English
Detected related package: %2!ls!, but failed to read language: %3!hs!, error: 0x%1!x!
Detected related package: %2!ls!, but failed to read language: %3!ls!, error: 0x%1!ls!
.

MessageId=170
Expand Down
11 changes: 10 additions & 1 deletion src/burn/engine/logging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ extern "C" HRESULT LoggingOpen(
{
HRESULT hr = S_OK;
LPWSTR sczLoggingBaseFolder = NULL;
LPWSTR sczFormattedPrefix = NULL;

// Check if the logging policy is set and configure the logging appropriately.
CheckLoggingPolicy(&pLog->dwAttributes);
Expand Down Expand Up @@ -108,8 +109,11 @@ extern "C" HRESULT LoggingOpen(
hr = GetNonSessionSpecificTempFolder(&sczLoggingBaseFolder);
ExitOnFailure(hr, "Failed to get non-session specific TEMP folder.");

// don't fail if formatting fails for some reason
VariableFormatString(pVariables, pLog->sczPrefix, &sczFormattedPrefix, NULL);

// Best effort to open default logging.
hr = LogOpen(sczLoggingBaseFolder, pLog->sczPrefix, NULL, pLog->sczExtension, FALSE, FALSE, &pLog->sczPath);
hr = LogOpen(sczLoggingBaseFolder, sczFormattedPrefix ? sczFormattedPrefix : pLog->sczPrefix, NULL, pLog->sczExtension, FALSE, FALSE, &pLog->sczPath);
if (FAILED(hr))
{
LogDisable();
Expand Down Expand Up @@ -154,6 +158,7 @@ extern "C" HRESULT LoggingOpen(
}

LExit:
ReleaseStr(sczFormattedPrefix);
ReleaseStr(sczLoggingBaseFolder);

return hr;
Expand Down Expand Up @@ -282,6 +287,8 @@ extern "C" LPCSTR LoggingActionStateToString(
return "AdminInstall";
case BOOTSTRAPPER_ACTION_STATE_MODIFY:
return "Modify";
case BOOTSTRAPPER_ACTION_STATE_MEND:
return "Mend";
case BOOTSTRAPPER_ACTION_STATE_REPAIR:
return "Repair";
case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE:
Expand Down Expand Up @@ -561,6 +568,8 @@ extern "C" LPCSTR LoggingRequestStateToString(
return "Cache";
case BOOTSTRAPPER_REQUEST_STATE_PRESENT:
return "Present";
case BOOTSTRAPPER_REQUEST_STATE_MEND:
return "Mend";
case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
return "Repair";
default:
Expand Down
24 changes: 16 additions & 8 deletions src/burn/engine/msiengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -491,19 +491,19 @@ extern "C" HRESULT MsiEngineDetectPackage(
}

// get product version
hr = WiuGetProductInfoEx(wzProductCode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion);
hr = WiuGetProductInfoEx(wzProductCode, NULL, MSIINSTALLCONTEXT_MACHINE, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion);
if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) != hr && HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) != hr)
{
ExitOnFailure1(hr, "Failed to get version for product in user unmanaged context: %ls", wzProductCode);
fPerMachine = FALSE;
ExitOnFailure1(hr, "Failed to get version for product in machine context: %ls", wzProductCode);
fPerMachine = TRUE;
}
else
{
hr = WiuGetProductInfoEx(wzProductCode, NULL, MSIINSTALLCONTEXT_MACHINE, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion);
hr = WiuGetProductInfoEx(wzProductCode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_VERSIONSTRING, &sczInstalledVersion);
if (HRESULT_FROM_WIN32(ERROR_UNKNOWN_PRODUCT) != hr && HRESULT_FROM_WIN32(ERROR_UNKNOWN_PROPERTY) != hr)
{
ExitOnFailure1(hr, "Failed to get version for product in machine context: %ls", wzProductCode);
fPerMachine = TRUE;
ExitOnFailure1(hr, "Failed to get version for product in user unmanaged context: %ls", wzProductCode);
fPerMachine = FALSE;
}
else
{
Expand Down Expand Up @@ -727,7 +727,7 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
{
case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: __fallthrough;
case BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED:
if (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested)
if (BOOTSTRAPPER_REQUEST_STATE_PRESENT == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_MEND == pPackage->requested || BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested)
{
// Take a look at the version and determine if this is a potential
// minor upgrade (same ProductCode newer ProductVersion), otherwise,
Expand All @@ -736,6 +736,10 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
{
execute = BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE;
}
else if (BOOTSTRAPPER_REQUEST_STATE_MEND == pPackage->requested)
{
execute = BOOTSTRAPPER_ACTION_STATE_MEND;
}
else if (BOOTSTRAPPER_REQUEST_STATE_REPAIR == pPackage->requested)
{
execute = BOOTSTRAPPER_ACTION_STATE_REPAIR;
Expand Down Expand Up @@ -764,6 +768,7 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
switch (pPackage->requested)
{
case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough;
case BOOTSTRAPPER_REQUEST_STATE_MEND: __fallthrough;
case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
execute = BOOTSTRAPPER_ACTION_STATE_INSTALL;
break;
Expand All @@ -779,6 +784,7 @@ extern "C" HRESULT MsiEnginePlanCalculatePackage(
switch (pPackage->requested)
{
case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough;
case BOOTSTRAPPER_REQUEST_STATE_MEND: __fallthrough;
case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
execute = BOOTSTRAPPER_ACTION_STATE_INSTALL;
break;
Expand Down Expand Up @@ -1222,11 +1228,13 @@ extern "C" HRESULT MsiEngineExecutePackage(
break;

case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough;
case BOOTSTRAPPER_ACTION_STATE_MEND: __fallthrough;
case BOOTSTRAPPER_ACTION_STATE_REPAIR:
{
LPCWSTR wzReinstallAll = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action ||
pExecuteAction->msiPackage.pPackage->Msi.cFeatures) ? L"" : L" REINSTALL=ALL";
LPCWSTR wzReinstallMode = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action) ? L"o" : L"e";
LPCWSTR wzReinstallMode = (BOOTSTRAPPER_ACTION_STATE_MODIFY == pExecuteAction->msiPackage.action
|| BOOTSTRAPPER_ACTION_STATE_MEND == pExecuteAction->msiPackage.action) ? L"o" : L"e";

hr = StrAllocFormattedSecure(&sczProperties, L"%ls%ls REINSTALLMODE=\"cmus%ls\" REBOOT=ReallySuppress", sczProperties ? sczProperties : L"", wzReinstallAll, wzReinstallMode);
ExitOnFailure(hr, "Failed to add reinstall mode and reboot suppression properties on repair.");
Expand Down
8 changes: 8 additions & 0 deletions src/burn/engine/package.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,13 @@ extern "C" HRESULT PackagesParseFromXml(
ExitOnFailure(hr, "Failed to get @InstallCondition.");
}

// @RepairCondition
hr = XmlGetAttributeEx(pixnNode, L"RepairCondition", &pPackage->sczRepairCondition);
if (E_NOTFOUND != hr)
{
ExitOnFailure(hr, "Failed to get @RepairCondition.");
}

// @RollbackBoundaryForward
hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryForward", &scz);
if (E_NOTFOUND != hr)
Expand Down Expand Up @@ -313,6 +320,7 @@ extern "C" void PackageUninitialize(
ReleaseStr(pPackage->sczRollbackLogPathVariable);
ReleaseStr(pPackage->sczInstallCondition);
ReleaseStr(pPackage->sczRollbackInstallCondition);
ReleaseStr(pPackage->sczRepairCondition);
ReleaseStr(pPackage->sczCacheId);

if (pPackage->rgDependencyProviders)
Expand Down
1 change: 1 addition & 0 deletions src/burn/engine/package.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ typedef struct _BURN_PACKAGE

LPWSTR sczInstallCondition;
LPWSTR sczRollbackInstallCondition;
LPWSTR sczRepairCondition;
BOOL fPerMachine;
BOOL fUninstallable;
BOOL fVital;
Expand Down
41 changes: 32 additions & 9 deletions src/burn/engine/plan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ extern "C" HRESULT PlanDefaultPackageRequestState(
__in BOOTSTRAPPER_ACTION action,
__in BURN_VARIABLES* pVariables,
__in_z_opt LPCWSTR wzInstallCondition,
__in_z_opt LPCWSTR wzRepairCondition,
__in BOOTSTRAPPER_RELATION_TYPE relationType,
__out BOOTSTRAPPER_REQUEST_STATE* pRequestState
)
Expand All @@ -322,10 +323,10 @@ extern "C" HRESULT PlanDefaultPackageRequestState(
*pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE;
}
}
else if (BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED == currentState && BOOTSTRAPPER_ACTION_UNINSTALL != action)
else if (BOOTSTRAPPER_PACKAGE_STATE_SUPERSEDED == currentState && BOOTSTRAPPER_ACTION_UNINSTALL != action && !(BURN_PACKAGE_TYPE_MSP == packageType && BOOTSTRAPPER_ACTION_REPAIR == action))
{
// Superseded means the package is on the machine but not active, so only uninstall operations are allowed.
// All other operations do nothing.
// All other operations do nothing except for patches, which can be repaired.
*pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE;
}
else if (BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE == currentState && !(BOOTSTRAPPER_ACTION_UNINSTALL == action && BURN_PACKAGE_TYPE_MSP == packageType))
Expand All @@ -339,14 +340,36 @@ extern "C" HRESULT PlanDefaultPackageRequestState(
hr = GetActionDefaultRequestState(action, fPermanent, currentState, &defaultRequestState);
ExitOnFailure(hr, "Failed to get default request state for action.");

// If there is an install condition (and we're doing an install) evaluate the condition
// to determine whether to use the default request state or make the package absent.
if (BOOTSTRAPPER_ACTION_UNINSTALL != action && wzInstallCondition && *wzInstallCondition)
// If we're not doing an uninstall, evaluate action conditions to override the default
// request state.
if (BOOTSTRAPPER_ACTION_UNINSTALL != action)
{
hr = ConditionEvaluate(pVariables, wzInstallCondition, &fCondition);
ExitOnFailure(hr, "Failed to evaluate install condition.");
BOOTSTRAPPER_REQUEST_STATE requestState = defaultRequestState;

*pRequestState = fCondition ? defaultRequestState : BOOTSTRAPPER_REQUEST_STATE_ABSENT;
if (wzInstallCondition && *wzInstallCondition)
{
hr = ConditionEvaluate(pVariables, wzInstallCondition, &fCondition);
ExitOnFailure(hr, "Failed to evaluate install condition.");

if (!fCondition)
{
requestState = BOOTSTRAPPER_REQUEST_STATE_ABSENT;
}
}

// If the install condition was false, stick with that.
if (BOOTSTRAPPER_REQUEST_STATE_ABSENT != requestState && wzRepairCondition && *wzRepairCondition)
{
hr = ConditionEvaluate(pVariables, wzRepairCondition, &fCondition);
ExitOnFailure(hr, "Failed to evaluate repair condition.");

if (fCondition)
{
requestState = BOOTSTRAPPER_REQUEST_STATE_REPAIR;
}
}

*pRequestState = requestState;
}
else // just set the package to the default request state.
{
Expand Down Expand Up @@ -839,7 +862,7 @@ static HRESULT ProcessPackage(
BURN_ROLLBACK_BOUNDARY* pEffectiveRollbackBoundary = NULL;

// Remember the default requested state so the engine doesn't get blamed for planning the wrong thing if the UX changes it.
hr = PlanDefaultPackageRequestState(pPackage->type, pPackage->currentState, !pPackage->fUninstallable, pPlan->action, pVariables, pPackage->sczInstallCondition, relationType, &pPackage->defaultRequested);
hr = PlanDefaultPackageRequestState(pPackage->type, pPackage->currentState, !pPackage->fUninstallable, pPlan->action, pVariables, pPackage->sczInstallCondition, pPackage->sczRepairCondition, relationType, &pPackage->defaultRequested);
ExitOnFailure(hr, "Failed to set default package state.");

pPackage->requested = pPackage->defaultRequested;
Expand Down
3 changes: 2 additions & 1 deletion src/burn/engine/plan.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,9 +357,10 @@ HRESULT PlanDefaultPackageRequestState(
__in BOOTSTRAPPER_ACTION action,
__in BURN_VARIABLES* pVariables,
__in_z_opt LPCWSTR wzInstallCondition,
__in_z_opt LPCWSTR wzRepairCondition,
__in BOOTSTRAPPER_RELATION_TYPE relationType,
__out BOOTSTRAPPER_REQUEST_STATE* pRequestState
);
);
HRESULT PlanLayoutBundle(
__in BURN_PLAN* pPlan,
__in_z LPCWSTR wzExecutableName,
Expand Down
Loading