本文整理汇总了C++中ExitOnFailure函数的典型用法代码示例。如果您正苦于以下问题:C++ ExitOnFailure函数的具体用法?C++ ExitOnFailure怎么用?C++ ExitOnFailure使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ExitOnFailure函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CpiSubscriptionsRead
HRESULT CpiSubscriptionsRead(
CPI_ASSEMBLY_LIST* pAsmList,
CPI_SUBSCRIPTION_LIST* pSubList
)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
PMSIHANDLE hView, hRec;
CPI_SUBSCRIPTION* pItm = NULL;
LPWSTR pwzData = NULL;
BOOL fMatchingArchitecture = FALSE;
// loop through all applications
hr = WcaOpenExecuteView(vcsSubscriptionQuery, &hView);
ExitOnFailure(hr, "Failed to execute view on ComPlusSubscription table");
while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
{
// get component
hr = WcaGetRecordString(hRec, sqComponent, &pwzData);
ExitOnFailure(hr, "Failed to get component");
// check if the component is our processor architecture
hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
ExitOnFailure(hr, "Failed to get component architecture.");
if (!fMatchingArchitecture)
{
continue; // not the same architecture, ignore
}
// create entry
pItm = (CPI_SUBSCRIPTION*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_SUBSCRIPTION));
if (!pItm)
ExitFunction1(hr = E_OUTOFMEMORY);
// get component install state
er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
// get key
hr = WcaGetRecordString(hRec, sqSubscription, &pwzData);
ExitOnFailure(hr, "Failed to get key");
StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
// get com+ component
hr = WcaGetRecordString(hRec, sqComPlusComponent, &pwzData);
ExitOnFailure(hr, "Failed to get COM+ component");
hr = ComponentFindByKey(pAsmList, pwzData, &pItm->pAssembly, &pItm->pComponent);
if (S_FALSE == hr)
{
// component not found
ExitOnFailure1(hr = E_FAIL, "Failed to find component, key: %S", pwzData);
}
// get id
hr = WcaGetRecordFormattedString(hRec, sqID, &pwzData);
ExitOnFailure(hr, "Failed to get id");
if (pwzData && *pwzData)
{
hr = PcaGuidToRegFormat(pwzData, pItm->wzID, countof(pItm->wzID));
ExitOnFailure2(hr, "Failed to parse id guid value, key: %S, value: '%S'", pItm->wzKey, pwzData);
}
// get name
hr = WcaGetRecordFormattedString(hRec, sqName, &pwzData);
ExitOnFailure(hr, "Failed to get name");
StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
// get event clsid
hr = WcaGetRecordFormattedString(hRec, sqEventCLSID, &pwzData);
ExitOnFailure(hr, "Failed to get event clsid");
StringCchCopyW(pItm->wzEventCLSID, countof(pItm->wzEventCLSID), pwzData);
// get publisher id
hr = WcaGetRecordFormattedString(hRec, sqPublisherID, &pwzData);
ExitOnFailure(hr, "Failed to get publisher id");
StringCchCopyW(pItm->wzPublisherID, countof(pItm->wzPublisherID), pwzData);
// get properties
if (CpiTableExists(cptComPlusSubscriptionProperty))
{
hr = CpiPropertiesRead(vcsSubscriptionPropertyQuery, pItm->wzKey, pdlSubscriptionProperties, &pItm->pProperties, &pItm->iPropertyCount);
ExitOnFailure(hr, "Failed to get subscription properties");
}
// set references & increment counters
if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
{
CpiApplicationAddReferenceInstall(pItm->pAssembly->pApplication);
pItm->pAssembly->fReferencedForInstall = TRUE;
pSubList->iInstallCount++;
if (pItm->pAssembly->iAttributes & aaRunInCommit)
pSubList->iCommitCount++;
}
//.........这里部分代码省略.........
示例2: CpiRollbackConfigureUsersInPartitionRoles
HRESULT CpiRollbackConfigureUsersInPartitionRoles(
LPWSTR* ppwzData,
CPI_ROLLBACK_DATA* pRollbackDataList
)
{
HRESULT hr = S_OK;
int iRollbackStatus;
CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES attrs;
::ZeroMemory(&attrs, sizeof(attrs));
// read action text
hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
ExitOnFailure(hr, "Failed to send action start message");
// get count
int iCnt = 0;
hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
ExitOnFailure(hr, "Failed to read count");
for (int i = 0; i < iCnt; i++)
{
// read attributes from CustomActionData
hr = ReadUserInPartitionRoleAttributes(ppwzData, &attrs);
ExitOnFailure(hr, "Failed to read attributes");
// rollback status
hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
if (S_FALSE == hr)
continue; // not found, nothing to rollback
// progress message
hr = CpiActionDataMessage(1, attrs.pwzRoleName);
ExitOnFailure(hr, "Failed to send progress messages");
if (S_FALSE == hr)
ExitFunction();
// action
switch (attrs.iActionType)
{
case atCreate:
hr = CreateUserInPartitionRole(&attrs);
if (FAILED(hr))
WcaLog(LOGMSG_STANDARD, "Failed to add user to partition role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
break;
case atRemove:
hr = RemoveUserInPartitionRole(&attrs);
if (FAILED(hr))
WcaLog(LOGMSG_STANDARD, "Failed to remove user from partition role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
break;
}
// check rollback status
if (0 == iRollbackStatus)
continue; // operation did not complete, skip progress
// progress
hr = WcaProgressMessage(attrs.iActionCost, FALSE);
ExitOnFailure(hr, "Failed to update progress");
}
hr = S_OK;
LExit:
// clean up
FreeUserInPartitionRoleAttributes(&attrs);
return hr;
}
示例3: RemoveUserInPartitionRole
static HRESULT RemoveUserInPartitionRole(
CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
ICatalogCollection* piUsrInRoleColl = NULL;
PSID pSid = NULL;
long lChanges = 0;
// log
WcaLog(LOGMSG_VERBOSE, "Removing user from partition role, key: %S", pAttrs->pwzKey);
// get users in partition role collection
hr = CpiGetUsersInPartitionRoleCollection(pAttrs->pwzPartID, pAttrs->pwzRoleName, &piUsrInRoleColl);
ExitOnFailure(hr, "Failed to get users in partition role collection");
if (S_FALSE == hr)
{
// users in role collection not found
WcaLog(LOGMSG_VERBOSE, "Unable to retrieve users in partition role collection, nothing to delete, key: %S", pAttrs->pwzKey);
ExitFunction1(hr = S_OK);
}
// get SID for account
do {
er = ERROR_SUCCESS;
hr = CpiAccountNameToSid(pAttrs->pwzAccount, &pSid);
if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr && !::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
{
WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pAttrs->pwzAccount);
er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
switch (er)
{
case IDABORT:
ExitFunction(); // exit with error code from CpiAccountNameToSid()
case IDRETRY:
break;
case IDIGNORE:
ExitFunction1(hr = S_OK);
}
}
else
ExitOnFailure(hr, "Failed to get SID for account");
} while (IDRETRY == er);
// remove
hr = CpiRemoveUserCollectionObject(piUsrInRoleColl, pSid);
if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr || HRESULT_FROM_WIN32(ERROR_SOME_NOT_MAPPED) == hr)
{
WcaLog(LOGMSG_STANDARD, "Failed to lookup account names, hr: 0x%x", hr);
hr = S_FALSE;
}
else
ExitOnFailure(hr, "Failed to remove user");
if (S_FALSE == hr)
{
// role not found
WcaLog(LOGMSG_VERBOSE, "User not found for partition role, nothing to delete, key: %S", pAttrs->pwzKey);
ExitFunction1(hr = S_OK);
}
// save changes
hr = piUsrInRoleColl->SaveChanges(&lChanges);
if (COMADMIN_E_OBJECTERRORS == hr)
CpiLogCatalogErrorInfo();
ExitOnFailure(hr, "Failed to save changes");
// log
WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
hr = S_OK;
LExit:
// clean up
ReleaseObject(piUsrInRoleColl);
if (pSid)
::HeapFree(::GetProcessHeap(), 0, pSid);
return hr;
}
示例4: TrusteesInPartitionRolesRead
static HRESULT TrusteesInPartitionRolesRead(
LPCWSTR pwzQuery,
CPI_PARTITION_ROLE_LIST* pPartRoleList,
CPI_USER_IN_PARTITION_ROLE_LIST* pUsrInPartRoleList
)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
PMSIHANDLE hView, hRec;
CPI_USER_IN_PARTITION_ROLE* pItm = NULL;
LPWSTR pwzData = NULL;
LPWSTR pwzDomain = NULL;
LPWSTR pwzName = NULL;
BOOL fMatchingArchitecture = FALSE;
// loop through all application roles
hr = WcaOpenExecuteView(pwzQuery, &hView);
ExitOnFailure(hr, "Failed to execute view on table");
while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
{
// get component
hr = WcaGetRecordString(hRec, tiprqComponent, &pwzData);
ExitOnFailure(hr, "Failed to get component");
// check if the component is our processor architecture
hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
ExitOnFailure(hr, "Failed to get component architecture.");
if (!fMatchingArchitecture)
{
continue; // not the same architecture, ignore
}
// create entry
pItm = (CPI_USER_IN_PARTITION_ROLE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_USER_IN_PARTITION_ROLE));
if (!pItm)
ExitFunction1(hr = E_OUTOFMEMORY);
// get component install state
er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
// get key
hr = WcaGetRecordString(hRec, tiprqUserInPartitionRole, &pwzData);
ExitOnFailure(hr, "Failed to get key");
StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
// get partition role
hr = WcaGetRecordString(hRec, tiprqPartitionRole, &pwzData);
ExitOnFailure(hr, "Failed to get partition role");
hr = CpiPartitionRoleFindByKey(pPartRoleList, pwzData, &pItm->pPartitionRole);
ExitOnFailure1(hr, "Failed to find partition role, key: %S", pwzData);
// get user domain
hr = WcaGetRecordFormattedString(hRec, tiprqDomain, &pwzDomain);
ExitOnFailure(hr, "Failed to get domain");
// get user name
hr = WcaGetRecordFormattedString(hRec, tiprqName, &pwzName);
ExitOnFailure(hr, "Failed to get name");
// build account name
hr = CpiBuildAccountName(pwzDomain, pwzName, &pItm->pwzAccount);
ExitOnFailure(hr, "Failed to build account name");
// increment counters
if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
pUsrInPartRoleList->iInstallCount++;
if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
pUsrInPartRoleList->iUninstallCount++;
// add entry
if (pUsrInPartRoleList->pFirst)
pItm->pNext = pUsrInPartRoleList->pFirst;
pUsrInPartRoleList->pFirst = pItm;
pItm = NULL;
}
if (E_NOMOREITEMS == hr)
hr = S_OK;
LExit:
// clean up
if (pItm)
FreeUserInPartitionRole(pItm);
ReleaseStr(pwzData);
ReleaseStr(pwzDomain);
ReleaseStr(pwzName);
return hr;
}
示例5: LocProbeForFile
extern "C" HRESULT DAPI LocProbeForFile(
__in_z LPCWSTR wzBasePath,
__in_z LPCWSTR wzLocFileName,
__in_z_opt LPCWSTR wzLanguage,
__inout LPWSTR* psczPath
)
{
HRESULT hr = S_OK;
LPWSTR sczProbePath = NULL;
LANGID langid = 0;
LPWSTR sczLangIdFile = NULL;
// If a language was specified, look for a loc file in that as a directory.
if (wzLanguage && *wzLanguage)
{
hr = PathConcat(wzBasePath, wzLanguage, &sczProbePath);
ExitOnFailure(hr, "Failed to concat base path to language.");
hr = PathConcat(sczProbePath, wzLocFileName, &sczProbePath);
ExitOnFailure(hr, "Failed to concat loc file name to probe path.");
if (FileExistsEx(sczProbePath, NULL))
{
ExitFunction();
}
}
langid = ::GetUserDefaultLangID();
hr = StrAllocFormatted(&sczLangIdFile, L"%u\\%ls", langid, wzLocFileName);
ExitOnFailure(hr, "Failed to format user langid.");
hr = PathConcat(wzBasePath, sczLangIdFile, &sczProbePath);
ExitOnFailure(hr, "Failed to concat user langid file name to base path.");
if (FileExistsEx(sczProbePath, NULL))
{
ExitFunction();
}
if (MAKELANGID(langid & 0x3FF, SUBLANG_DEFAULT) != langid)
{
langid = MAKELANGID(langid & 0x3FF, SUBLANG_DEFAULT);
hr = StrAllocFormatted(&sczLangIdFile, L"%u\\%ls", langid, wzLocFileName);
ExitOnFailure(hr, "Failed to format user langid (default sublang).");
hr = PathConcat(wzBasePath, sczLangIdFile, &sczProbePath);
ExitOnFailure(hr, "Failed to concat user langid file name to base path (default sublang).");
if (FileExistsEx(sczProbePath, NULL))
{
ExitFunction();
}
}
langid = ::GetSystemDefaultUILanguage();
hr = StrAllocFormatted(&sczLangIdFile, L"%u\\%ls", langid, wzLocFileName);
ExitOnFailure(hr, "Failed to format system langid.");
hr = PathConcat(wzBasePath, sczLangIdFile, &sczProbePath);
ExitOnFailure(hr, "Failed to concat system langid file name to base path.");
if (FileExistsEx(sczProbePath, NULL))
{
ExitFunction();
}
if (MAKELANGID(langid & 0x3FF, SUBLANG_DEFAULT) != langid)
{
langid = MAKELANGID(langid & 0x3FF, SUBLANG_DEFAULT);
hr = StrAllocFormatted(&sczLangIdFile, L"%u\\%ls", langid, wzLocFileName);
ExitOnFailure(hr, "Failed to format user langid (default sublang).");
hr = PathConcat(wzBasePath, sczLangIdFile, &sczProbePath);
ExitOnFailure(hr, "Failed to concat user langid file name to base path (default sublang).");
if (FileExistsEx(sczProbePath, NULL))
{
ExitFunction();
}
}
// Finally, look for the loc file in the base path.
hr = PathConcat(wzBasePath, wzLocFileName, &sczProbePath);
ExitOnFailure(hr, "Failed to concat loc file name to base path.");
if (!FileExistsEx(sczProbePath, NULL))
{
hr = E_FILENOTFOUND;
}
LExit:
if (SUCCEEDED(hr))
{
hr = StrAllocString(psczPath, sczProbePath, 0);
}
//.........这里部分代码省略.........
示例6: ScaWebsRead
HRESULT ScaWebsRead(
__in IMSAdminBase* piMetabase,
__in SCA_MIMEMAP** ppsmmList,
__in SCA_WEB** ppswList,
__in SCA_HTTP_HEADER** ppshhList,
__in SCA_WEB_ERROR** ppsweList,
__in WCA_WRAPQUERY_HANDLE hUserQuery,
__in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
__in WCA_WRAPQUERY_HANDLE hSslCertQuery,
__in WCA_WRAPQUERY_HANDLE hWebLogQuery,
__in WCA_WRAPQUERY_HANDLE hWebAppQuery,
__in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
__inout LPWSTR *ppwzCustomActionData
)
{
Assert(piMetabase && ppswList);
HRESULT hr = S_OK;
MSIHANDLE hRec;
MSIHANDLE hRecAddresses;
SCA_WEB* psw = NULL;
LPWSTR pwzData = NULL;
int iSiteId;
DWORD dwLen = 0;
WCA_WRAPQUERY_HANDLE hQueryWebSite = NULL;
WCA_WRAPQUERY_HANDLE hQueryWebAddress = NULL;
hr = WcaBeginUnwrapQuery(&hQueryWebSite, ppwzCustomActionData);
ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead");
hr = WcaBeginUnwrapQuery(&hQueryWebAddress, ppwzCustomActionData);
ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead");
if (0 == WcaGetQueryRecords(hQueryWebSite))
{
WcaLog(LOGMSG_VERBOSE, "Required tables not present");
ExitFunction1(hr = S_FALSE);
}
// loop through all the webs
while (S_OK == (hr = WcaFetchWrappedRecord(hQueryWebSite, &hRec)))
{
psw = NewWeb();
ExitOnNull(psw, hr, E_OUTOFMEMORY, "Failed to allocate memory for web object in memory");
// get the darwin information
hr = WcaGetRecordString(hRec, wqWeb, &pwzData);
ExitOnFailure(hr, "Failed to get Web");
hr = ::StringCchCopyW(psw->wzKey, countof(psw->wzKey), pwzData);
ExitOnFailure(hr, "Failed to copy key string to web object");
if (*pwzData && *ppsmmList)
{
hr = ScaGetMimeMap(mmptWeb, pwzData, ppsmmList, &psw->psmm);
ExitOnFailure(hr, "Failed to get mimemap for VirtualDir");
}
// get component install state
hr = WcaGetRecordString(hRec, wqComponent, &pwzData);
ExitOnFailure(hr, "Failed to get Component for Web");
hr = ::StringCchCopyW(psw->wzComponent, countof(psw->wzComponent), pwzData);
ExitOnFailure(hr, "Failed to copy component string to web object");
if (*(psw->wzComponent))
{
psw->fHasComponent = TRUE;
hr = WcaGetRecordInteger(hRec, wqInstalled, (int *)&psw->isInstalled);
ExitOnFailure(hr, "Failed to get web Component's installed state");
WcaGetRecordInteger(hRec, wqAction, (int *)&psw->isAction);
ExitOnFailure(hr, "Failed to get web Component's action state");
if (!WcaIsInstalling(psw->isInstalled, psw->isAction) && !WcaIsUninstalling(psw->isInstalled, psw->isAction)
&& !WcaIsReInstalling(psw->isInstalled, psw->isAction))
{
FreeWeb(psw);
psw = NULL;
continue; // If we aren't acting on this component, skip it
}
}
hr = WcaGetRecordInteger(hRec, wqId, &iSiteId);
ExitOnFailure(hr, "Failed to get SiteId for Web");
// Get the web's key address.
hr = WcaGetRecordString(hRec, wqAddress, &pwzData);
ExitOnFailure(hr, "Failed to get Address for Web");
hr = ::StringCchCopyW(psw->swaKey.wzKey, countof(psw->swaKey.wzKey), pwzData);
ExitOnFailure(hr, "Failed to copy key string to web object");
hr = WcaGetRecordString(hRec, wqIP, &pwzData);
ExitOnFailure(hr, "Failed to get IP for Web");
hr = ::StringCchCopyW(psw->swaKey.wzIP, countof(psw->swaKey.wzIP), pwzData);
ExitOnFailure(hr, "Failed to copy IP string to web object");
hr = WcaGetRecordString(hRec, wqPort, &pwzData);
//.........这里部分代码省略.........
示例7: CheckDatabaseProperties
/*
Checks SERVICENAME, PORT and BUFFERSIZE parameters
*/
extern "C" UINT __stdcall CheckDatabaseProperties (MSIHANDLE hInstall)
{
wchar_t ServiceName[MAX_PATH]={0};
wchar_t SkipNetworking[MAX_PATH]={0};
wchar_t QuickConfig[MAX_PATH]={0};
wchar_t Password[MAX_PATH]={0};
wchar_t EscapedPassword[2*MAX_PATH+2];
wchar_t Port[6];
wchar_t BufferPoolSize[16];
DWORD PortLen=6;
bool haveInvalidPort=false;
const wchar_t *ErrorMsg=0;
HRESULT hr= S_OK;
UINT er= ERROR_SUCCESS;
hr = WcaInitialize(hInstall, __FUNCTION__);
ExitOnFailure(hr, "Failed to initialize");
WcaLog(LOGMSG_STANDARD, "Initialized.");
DWORD ServiceNameLen = MAX_PATH;
MsiGetPropertyW (hInstall, L"SERVICENAME", ServiceName, &ServiceNameLen);
if(ServiceName[0])
{
if(ServiceNameLen > 256)
{
ErrorMsg= L"Invalid service name. The maximum length is 256 characters.";
goto LExit;
}
for(DWORD i=0; i< ServiceNameLen;i++)
{
if(ServiceName[i] == L'\\' || ServiceName[i] == L'/'
|| ServiceName[i]=='\'' || ServiceName[i] ==L'"')
{
ErrorMsg =
L"Invalid service name. Forward slash and back slash are forbidden."
L"Single and double quotes are also not permitted.";
goto LExit;
}
}
if(CheckServiceExists(ServiceName))
{
ErrorMsg=
L"A service with the same name already exists. "
L"Please use a different name.";
goto LExit;
}
}
DWORD PasswordLen= MAX_PATH;
MsiGetPropertyW (hInstall, L"PASSWORD", Password, &PasswordLen);
EscapeCommandLine(Password, EscapedPassword,
sizeof(EscapedPassword)/sizeof(EscapedPassword[0]));
MsiSetPropertyW(hInstall,L"ESCAPEDPASSWORD",EscapedPassword);
DWORD SkipNetworkingLen= MAX_PATH;
MsiGetPropertyW(hInstall, L"SKIPNETWORKING", SkipNetworking,
&SkipNetworkingLen);
MsiGetPropertyW(hInstall, L"PORT", Port, &PortLen);
if(SkipNetworking[0]==0 && Port[0] != 0)
{
/* Strip spaces */
for(DWORD i=PortLen-1; i > 0; i--)
{
if(Port[i]== ' ')
Port[i] = 0;
}
if(PortLen > 5 || PortLen <= 3)
haveInvalidPort = true;
else
{
for (DWORD i=0; i< PortLen && Port[i] != 0;i++)
{
if(Port[i] < '0' || Port[i] >'9')
{
haveInvalidPort=true;
break;
}
}
}
if (haveInvalidPort)
{
ErrorMsg =
L"Invalid port number. Please use a number between 1025 and 65535.";
goto LExit;
}
short port = (short)_wtoi(Port);
if (!IsPortFree(port))
{
ErrorMsg =
L"The TCP Port you selected is already in use. "
L"Please choose a different port.";
goto LExit;
}
//.........这里部分代码省略.........
示例8: RunElevated
static HRESULT RunElevated(
__in HINSTANCE hInstance,
__in LPCWSTR wzCommandLine,
__in BURN_ENGINE_STATE* pEngineState
)
{
HRESULT hr = S_OK;
HANDLE hLock = NULL;
BOOL fDisabledAutomaticUpdates = FALSE;
// If we were launched elevated implicitly, launch an unelevated copy of ourselves.
if (BURN_ELEVATION_STATE_ELEVATED == pEngineState->elevationState)
{
Assert(!pEngineState->companionConnection.dwProcessId);
Assert(!pEngineState->companionConnection.sczName);
Assert(!pEngineState->companionConnection.sczSecret);
hr = PipeCreateNameAndSecret(&pEngineState->companionConnection.sczName, &pEngineState->companionConnection.sczSecret);
ExitOnFailure(hr, "Failed to create implicit elevated connection name and secret.");
hr = PipeLaunchParentProcess(wzCommandLine, pEngineState->command.nCmdShow, pEngineState->companionConnection.sczName, pEngineState->companionConnection.sczSecret, pEngineState->fDisableUnelevate);
ExitOnFailure(hr, "Failed to launch unelevated process.");
}
// connect to per-user process
hr = PipeChildConnect(&pEngineState->companionConnection, TRUE);
ExitOnFailure(hr, "Failed to connect to unelevated process.");
// Set up the thread local storage to store the correct pipe to communicate logging.
pEngineState->dwElevatedLoggingTlsId = ::TlsAlloc();
if (TLS_OUT_OF_INDEXES == pEngineState->dwElevatedLoggingTlsId)
{
ExitWithLastError(hr, "Failed to allocate thread local storage for logging.");
}
if (!::TlsSetValue(pEngineState->dwElevatedLoggingTlsId, pEngineState->companionConnection.hPipe))
{
ExitWithLastError(hr, "Failed to set elevated pipe into thread local storage for logging.");
}
// Create a top-level window to prevent shutting down the elevated process.
hr = UiCreateMessageWindow(hInstance, pEngineState);
ExitOnFailure(hr, "Failed to create the message window.");
SrpInitialize(TRUE);
// Override logging to write over the pipe.
LogRedirect(RedirectLoggingOverPipe, pEngineState);
// Pump messages from parent process.
hr = ElevationChildPumpMessages(pEngineState->dwElevatedLoggingTlsId, pEngineState->companionConnection.hPipe, pEngineState->companionConnection.hCachePipe, &pEngineState->containers, &pEngineState->packages, &pEngineState->payloads, &pEngineState->variables, &pEngineState->registration, &pEngineState->userExperience, &hLock, &fDisabledAutomaticUpdates, &pEngineState->userExperience.dwExitCode, &pEngineState->fRestart);
LogRedirect(NULL, NULL); // reset logging so the next failure gets written to "log buffer" for the failure log.
ExitOnFailure(hr, "Failed to pump messages from parent process.");
LExit:
LogRedirect(NULL, NULL); // we're done talking to the child so always reset logging now.
// If the message window is still around, close it.
UiCloseMessageWindow(pEngineState);
if (fDisabledAutomaticUpdates)
{
ElevationChildResumeAutomaticUpdates();
}
if (hLock)
{
::ReleaseMutex(hLock);
::CloseHandle(hLock);
}
return hr;
}
示例9: RunApplication
static HRESULT RunApplication(
__in BURN_ENGINE_STATE* pEngineState,
__out BOOL* pfReloadApp
)
{
HRESULT hr = S_OK;
DWORD dwThreadId = 0;
IBootstrapperEngine* pEngineForApplication = NULL;
BOOL fStartupCalled = FALSE;
BOOL fRet = FALSE;
MSG msg = { };
::PeekMessageW(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
dwThreadId = ::GetCurrentThreadId();
// Load the bootstrapper application.
hr = EngineForApplicationCreate(pEngineState, dwThreadId, &pEngineForApplication);
ExitOnFailure(hr, "Failed to create engine for UX.");
hr = UserExperienceLoad(&pEngineState->userExperience, pEngineForApplication, &pEngineState->command);
ExitOnFailure(hr, "Failed to load UX.");
fStartupCalled = TRUE;
hr = pEngineState->userExperience.pUserExperience->OnStartup();
ExitOnFailure(hr, "Failed to start bootstrapper application.");
// Enter the message pump.
while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0)))
{
if (-1 == fRet)
{
hr = E_UNEXPECTED;
ExitOnRootFailure(hr, "Unexpected return value from message pump.");
}
else
{
ProcessMessage(pEngineState, &msg);
}
}
// get exit code
pEngineState->userExperience.dwExitCode = (DWORD)msg.wParam;
LExit:
if (fStartupCalled)
{
int nResult = pEngineState->userExperience.pUserExperience->OnShutdown();
if (IDRESTART == nResult)
{
LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RESTART, LoggingBoolToString(pEngineState->fRestart));
pEngineState->fRestart = TRUE;
}
else if (IDRELOAD_BOOTSTRAPPER == nResult)
{
LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RELOAD);
*pfReloadApp = TRUE;
}
}
// unload UX
UserExperienceUnload(&pEngineState->userExperience);
ReleaseObject(pEngineForApplication);
return hr;
}
示例10: RegDefaultReadValue
extern "C" HRESULT RegDefaultReadValue(
__in CFGDB_STRUCT *pcdb,
__in LEGACY_SYNC_PRODUCT_SESSION *pSyncProductSession,
__in_z LPCWSTR wzNamespace,
__in HKEY hkKey,
__in_z LPCWSTR wzRegKey,
__in_z LPCWSTR wzValueName,
__in DWORD dwRegType
)
{
HRESULT hr = S_OK;
BOOL fIgnore = FALSE;
LPWSTR sczCfgValueName = NULL;
hr = MapRegValueToCfgName(wzNamespace, wzRegKey, wzValueName, &sczCfgValueName);
ExitOnFailure(hr, "Failed to format default legacy value name from namespace: %ls, key: %ls, valuename: %ls", wzNamespace, wzRegKey, wzValueName);
hr = FilterCheckValue(&pSyncProductSession->product, sczCfgValueName, &fIgnore, NULL);
ExitOnFailure(hr, "Failed to check if cfg value should be ignored: %ls", sczCfgValueName);
if (fIgnore)
{
ExitFunction1(hr = S_OK);
}
hr = DictAddKey(pSyncProductSession->shDictValuesSeen, sczCfgValueName);
ExitOnFailure(hr, "Failed to add to dictionary value: %ls", sczCfgValueName);
switch (dwRegType)
{
case REG_BINARY:
hr = RegDefaultReadValueBinary(pcdb, hkKey, wzValueName, sczCfgValueName);
ExitOnFailure(hr, "Failed to handle binary value by default handler while reading from registry: %ls", wzValueName);
break;
case REG_SZ:
hr = RegDefaultReadValueString(pcdb, hkKey, wzValueName, sczCfgValueName);
ExitOnFailure(hr, "Failed to handle string value by default handler while reading from registry: %ls", wzValueName);
break;
case REG_DWORD:
hr = RegDefaultReadValueDword(pcdb, hkKey, wzValueName, sczCfgValueName);
ExitOnFailure(hr, "Failed to handle dword value by default handler while reading from registry: %ls", wzValueName);
break;
case REG_QWORD:
hr = RegDefaultReadValueQword(pcdb, hkKey, wzValueName, sczCfgValueName);
ExitOnFailure(hr, "Failed to handle qword value by default handler while reading from registry: %ls", wzValueName);
break;
default:
// Ignore this value, it's unsupported
ExitFunction1(hr = S_OK);
break;
}
LExit:
ReleaseStr(sczCfgValueName);
return hr;
}
示例11: RunNormal
static HRESULT RunNormal(
__in HINSTANCE hInstance,
__in BURN_ENGINE_STATE* pEngineState
)
{
HRESULT hr = S_OK;
HANDLE hPipesCreatedEvent = NULL;
BOOL fContinueExecution = TRUE;
BOOL fReloadApp = FALSE;
// Initialize logging.
hr = LoggingOpen(&pEngineState->log, &pEngineState->variables, pEngineState->command.display, pEngineState->registration.sczDisplayName);
ExitOnFailure(hr, "Failed to open log.");
// Ensure the cache functions are initialized since we might use them soon.
hr = CacheInitialize(&pEngineState->registration, &pEngineState->variables);
ExitOnFailure(hr, "Failed to initialize internal cache functionality.");
// When launched explicitly unelevated, create the pipes so the elevated process can connect.
if (BURN_ELEVATION_STATE_UNELEVATED_EXPLICITLY == pEngineState->elevationState)
{
Assert(pEngineState->companionConnection.dwProcessId);
Assert(pEngineState->companionConnection.sczName);
Assert(pEngineState->companionConnection.sczSecret);
Assert(!pEngineState->companionConnection.hProcess);
Assert(INVALID_HANDLE_VALUE == pEngineState->companionConnection.hPipe);
Assert(INVALID_HANDLE_VALUE == pEngineState->companionConnection.hCachePipe);
hr = PipeCreatePipes(&pEngineState->companionConnection, TRUE, &hPipesCreatedEvent);
ExitOnFailure(hr, "Failed to create pipes to connect to elevated parent process.");
hr = PipeWaitForChildConnect(&pEngineState->companionConnection);
ExitOnFailure(hr, "Failed to connect to elevated parent process.");
ReleaseHandle(hPipesCreatedEvent);
}
// Ensure we're on a supported operating system.
hr = ConditionGlobalCheck(&pEngineState->variables, &pEngineState->condition, pEngineState->command.display, pEngineState->registration.sczDisplayName, &pEngineState->userExperience.dwExitCode, &fContinueExecution);
ExitOnFailure(hr, "Failed to check global conditions");
if (!fContinueExecution)
{
LogId(REPORT_STANDARD, MSG_FAILED_CONDITION_CHECK);
// If the block told us to abort, abort!
ExitFunction1(hr = S_OK);
}
if (pEngineState->userExperience.fSplashScreen && BOOTSTRAPPER_DISPLAY_NONE < pEngineState->command.display)
{
SplashScreenCreate(hInstance, NULL, &pEngineState->command.hwndSplashScreen);
}
// Create a top-level window to handle system messages.
hr = UiCreateMessageWindow(hInstance, pEngineState);
ExitOnFailure(hr, "Failed to create the message window.");
// Query registration state.
hr = CoreQueryRegistration(pEngineState);
ExitOnFailure(hr, "Failed to query registration.");
// Set some built-in variables before loading the BA.
hr = PlanSetVariables(pEngineState->command.action, &pEngineState->variables);
ExitOnFailure(hr, "Failed to set action variables.");
hr = RegistrationSetVariables(&pEngineState->registration, &pEngineState->variables);
ExitOnFailure(hr, "Failed to set registration variables.");
// If a layout directory was specified on the command-line, set it as a well-known variable.
if (pEngineState->command.wzLayoutDirectory && *pEngineState->command.wzLayoutDirectory)
{
hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_LAYOUT_DIRECTORY, pEngineState->command.wzLayoutDirectory, FALSE);
ExitOnFailure(hr, "Failed to set layout directory variable to value provided from command-line.");
}
do
{
fReloadApp = FALSE;
hr = RunApplication(pEngineState, &fReloadApp);
ExitOnFailure(hr, "Failed while running ");
} while (fReloadApp);
LExit:
// If the message window is still around, close it.
UiCloseMessageWindow(pEngineState);
VariablesDump(&pEngineState->variables);
// end per-machine process if running
if (INVALID_HANDLE_VALUE != pEngineState->companionConnection.hPipe)
{
PipeTerminateChildProcess(&pEngineState->companionConnection, pEngineState->userExperience.dwExitCode, (BURN_ELEVATION_STATE_UNELEVATED_EXPLICITLY == pEngineState->elevationState) ? pEngineState->fRestart : FALSE);
}
// If the splash screen is still around, close it.
if (::IsWindow(pEngineState->command.hwndSplashScreen))
{
::PostMessageW(pEngineState->command.hwndSplashScreen, WM_CLOSE, 0, 0);
//.........这里部分代码省略.........
示例12: RegDefaultWriteValue
extern "C" HRESULT RegDefaultWriteValue(
__in LEGACY_PRODUCT *pProduct,
__in_z LPCWSTR wzName,
__in const CONFIG_VALUE *pcvValue,
__out BOOL *pfHandled
)
{
HRESULT hr = S_OK;
LPWSTR sczValue = NULL;
LPWSTR sczRegKey = NULL;
LPWSTR sczRegValueName = NULL;
BYTE *pbBuffer = NULL;
SIZE_T cbBuffer = 0;
BOOL fReleaseBuffer = FALSE;
DWORD dwRoot = DWORD_MAX;
HKEY hk = NULL;
hr = MapCfgNameToRegValue(pProduct, wzName, &dwRoot, &sczRegKey, &sczRegValueName);
if (E_INVALIDARG == hr)
{
*pfHandled = FALSE;
// Not a regkey, so just ignore
ExitFunction1(hr = S_OK);
}
ExitOnFailure(hr, "Failed to convert value name to registry information");
*pfHandled = TRUE;
hr = RegOpen(ManifestConvertToRootKey(dwRoot), sczRegKey, KEY_SET_VALUE, &hk);
if (E_FILENOTFOUND == hr)
{
hr = S_OK;
// The key doesn't exist, so no need to proceed with deleting the value
if (VALUE_DELETED == pcvValue->cvType)
{
ExitFunction1(hr = S_OK);
}
hr = RegCreate(ManifestConvertToRootKey(dwRoot), sczRegKey, KEY_SET_VALUE, &hk);
ExitOnFailure(hr, "Failed to create regkey: %ls", sczRegKey);
}
ExitOnFailure(hr, "Failed to open regkey: %ls", sczRegKey);
switch (pcvValue->cvType)
{
case VALUE_DELETED:
hr = RegWriteString(hk, sczRegValueName, NULL);
ExitOnFailure(hr, "Failed to delete existing value");
break;
case VALUE_BLOB:
switch (pcvValue->blob.cbType)
{
case CFG_BLOB_POINTER:
pbBuffer = const_cast<BYTE *>(pcvValue->blob.pointer.pbValue);
cbBuffer = pcvValue->blob.cbValue;
break;
case CFG_BLOB_DB_STREAM:
fReleaseBuffer = TRUE;
hr = StreamRead(pcvValue->blob.dbstream.pcdb, pcvValue->blob.dbstream.dwContentID, NULL, &pbBuffer, &cbBuffer);
ExitOnFailure(hr, "Failed to read stream from database while writing binary to the registry");
break;
default:
hr = E_INVALIDARG;
ExitOnFailure(hr, "Invalid blob type encountered");
break;
}
hr = RegWriteBinary(hk, sczRegValueName, pbBuffer, cbBuffer);
ExitOnFailure(hr, "Failed to write binary value to registry");
break;
case VALUE_STRING:
hr = RegWriteString(hk, sczRegValueName, pcvValue->string.sczValue);
ExitOnFailure(hr, "Failed to write string to registry");
break;
case VALUE_DWORD:
hr = RegWriteNumber(hk, sczRegValueName, pcvValue->dword.dwValue);
ExitOnFailure(hr, "Failed to write dword to registry");
break;
case VALUE_QWORD:
hr = RegWriteQword(hk, sczRegValueName, pcvValue->qword.qwValue);
ExitOnFailure(hr, "Failed to write qword to registry");
break;
default:
ExitFunction1(hr = E_INVALIDARG);
}
LExit:
ReleaseRegKey(hk);
ReleaseStr(sczValue);
ReleaseStr(sczRegKey);
ReleaseStr(sczRegValueName);
if (fReleaseBuffer)
{
ReleaseMem(pbBuffer);
}
return hr;
//.........这里部分代码省略.........
示例13: wWinMain
int WINAPI wWinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE /* hPrevInstance */,
__in_z_opt LPWSTR lpCmdLine,
__in int /*nCmdShow*/
)
{
::HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
HRESULT hr = S_OK;
BOOL fComInitialized = FALSE;
LPWSTR sczThemeFile = NULL;
ATOM atom = 0;
HWND hWnd = NULL;
HANDLE hDisplayThread = NULL;
HANDLE hLoadThread = NULL;
BOOL fRet = FALSE;
MSG msg = { };
hr = ::CoInitialize(NULL);
ExitOnFailure(hr, "Failed to initialize COM.");
fComInitialized = TRUE;
hr = ProcessCommandLine(lpCmdLine, &sczThemeFile);
ExitOnFailure(hr, "Failed to process command line.");
hr = CreateTheme(hInstance, &vpTheme);
ExitOnFailure(hr, "Failed to create theme.");
hr = CreateMainWindowClass(hInstance, vpTheme, &atom);
ExitOnFailure(hr, "Failed to create main window.");
hWnd = ::CreateWindowExW(0, reinterpret_cast<LPCWSTR>(atom), vpTheme->sczCaption, vpTheme->dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, vpTheme->nWidth, vpTheme->nHeight, HWND_DESKTOP, NULL, hInstance, NULL);
ExitOnNullWithLastError(hWnd, hr, "Failed to create window.");
if (!sczThemeFile)
{
// Prompt for a path to the theme file.
OPENFILENAMEW ofn = { };
WCHAR wzFile[MAX_PATH] = { };
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = wzFile;
ofn.nMaxFile = countof(wzFile);
ofn.lpstrFilter = L"Theme Files\0*.thm\0XML Files\0*.xml\0All Files\0*.*\0";
ofn.nFilterIndex = 1;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
ofn.lpstrTitle = vpTheme->sczCaption;
if (::GetOpenFileNameW(&ofn))
{
hr = StrAllocString(&sczThemeFile, wzFile, 0);
ExitOnFailure(hr, "Failed to copy opened file to theme file.");
}
else
{
::MessageBoxW(hWnd, L"Must specify a path to theme file.", vpTheme->sczCaption, MB_OK | MB_ICONERROR);
ExitFunction1(hr = E_INVALIDARG);
}
}
hr = DisplayStart(hInstance, hWnd, &hDisplayThread, &vdwDisplayThreadId);
ExitOnFailure(hr, "Failed to start display.");
hr = LoadStart(sczThemeFile, hWnd, &hLoadThread);
ExitOnFailure(hr, "Failed to start load.");
// message pump
while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0)))
{
if (-1 == fRet)
{
hr = E_UNEXPECTED;
ExitOnFailure(hr, "Unexpected return value from message pump.");
}
else if (!ThemeHandleKeyboardMessage(vpTheme, msg.hwnd, &msg))
{
::TranslateMessage(&msg);
::DispatchMessageW(&msg);
}
}
LExit:
if (::IsWindow(hWnd))
{
::DestroyWindow(hWnd);
}
if (hDisplayThread)
{
::PostThreadMessageW(vdwDisplayThreadId, WM_QUIT, 0, 0);
::WaitForSingleObject(hDisplayThread, 10000);
::CloseHandle(hDisplayThread);
}
// TODO: come up with a good way to kill the load thread, probably need to switch
// the ReadDirectoryW() to overlapped mode.
//.........这里部分代码省略.........
示例14: MsuEngineExecutePackage
extern "C" HRESULT MsuEngineExecutePackage(
__in BURN_EXECUTE_ACTION* pExecuteAction,
__in BOOL fRollback,
__in PFN_GENERICMESSAGEHANDLER pfnGenericMessageHandler,
__in LPVOID pvContext,
__out BOOTSTRAPPER_APPLY_RESTART* pRestart
)
{
HRESULT hr = S_OK;
int nResult = IDNOACTION;
LPWSTR sczCachedDirectory = NULL;
LPWSTR sczMsuPath = NULL;
LPWSTR sczSystemPath = NULL;
LPWSTR sczWusaPath = NULL;
LPWSTR sczCommand = NULL;
SC_HANDLE schWu = NULL;
BOOL fWuWasDisabled = FALSE;
STARTUPINFOW si = { };
PROCESS_INFORMATION pi = { };
GENERIC_EXECUTE_MESSAGE message = { };
DWORD dwExitCode = 0;
BOOL fDoDependency = FALSE;
// get wusa.exe path
hr = PathGetKnownFolder(CSIDL_SYSTEM, &sczSystemPath);
ExitOnFailure(hr, "Failed to find System32 directory.");
hr = PathConcat(sczSystemPath, L"wusa.exe", &sczWusaPath);
ExitOnFailure(hr, "Failed to allocate WUSA.exe path.");
// build command
switch (pExecuteAction->msuPackage.action)
{
case BOOTSTRAPPER_ACTION_STATE_INSTALL:
// get cached executable path
hr = CacheGetCompletedPath(TRUE, pExecuteAction->msuPackage.pPackage->sczCacheId, &sczCachedDirectory);
ExitOnFailure1(hr, "Failed to get cached path for package: %ls", pExecuteAction->msuPackage.pPackage->sczId);
hr = PathConcat(sczCachedDirectory, pExecuteAction->msuPackage.pPackage->rgPayloads[0].pPayload->sczFilePath, &sczMsuPath);
ExitOnFailure(hr, "Failed to build executable path.");
// format command
hr = StrAllocFormatted(&sczCommand, L"\"%ls\" \"%ls\" /quiet /norestart", sczWusaPath, sczMsuPath);
ExitOnFailure(hr, "Failed to format MSU install command.");
break;
case BOOTSTRAPPER_ACTION_STATE_UNINSTALL:
// format command
hr = StrAllocFormatted(&sczCommand, L"\"%ls\" /uninstall /kb:%ls /quiet /norestart", sczWusaPath, pExecuteAction->msuPackage.pPackage->Msu.sczKB);
ExitOnFailure(hr, "Failed to format MSU uninstall command.");
break;
default:
hr = E_UNEXPECTED;
ExitOnFailure(hr, "Failed to get action arguments for MSU package.");
}
if (pExecuteAction->msuPackage.sczLogPath && *pExecuteAction->msuPackage.sczLogPath)
{
hr = StrAllocConcat(&sczCommand, L" /log:", 0);
ExitOnFailure(hr, "Failed to append log switch to MSU command-line.");
hr = StrAllocConcat(&sczCommand, pExecuteAction->msuPackage.sczLogPath, 0);
ExitOnFailure(hr, "Failed to append log path to MSU command-line.");
}
LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pExecuteAction->msuPackage.pPackage->sczId, LoggingActionStateToString(pExecuteAction->msuPackage.action), sczMsuPath ? sczMsuPath : pExecuteAction->msuPackage.pPackage->Msu.sczKB, sczCommand);
hr = EnsureWUServiceEnabled(&schWu, &fWuWasDisabled);
ExitOnFailure(hr, "Failed to ensure WU service was enabled to install MSU package.");
// create process
si.cb = sizeof(si);
if (!::CreateProcessW(sczWusaPath, sczCommand, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
ExitWithLastError1(hr, "Failed to CreateProcess on path: %ls", sczWusaPath);
}
do
{
message.type = GENERIC_EXECUTE_MESSAGE_PROGRESS;
message.dwAllowedResults = MB_OKCANCEL;
message.progress.dwPercentage = 50;
nResult = pfnGenericMessageHandler(&message, pvContext);
hr = (IDOK == nResult || IDNOACTION == nResult) ? S_OK : IDCANCEL == nResult ? HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT) : HRESULT_FROM_WIN32(ERROR_INSTALL_FAILURE);
ExitOnRootFailure(hr, "Bootstrapper application aborted during MSU progress.");
// wait for process to terminate
hr = ProcWaitForCompletion(pi.hProcess, 500, &dwExitCode);
if (HRESULT_FROM_WIN32(WAIT_TIMEOUT) != hr)
{
ExitOnFailure1(hr, "Failed to wait for executable to complete: %ls", sczWusaPath);
}
} while (HRESULT_FROM_WIN32(WAIT_TIMEOUT) == hr);
// get process exit code
if (!::GetExitCodeProcess(pi.hProcess, &dwExitCode))
{
ExitWithLastError(hr, "Failed to get process exit code.");
}
//.........这里部分代码省略.........
示例15: ExeEnginePlanAddPackage
//
// PlanAdd - adds the calculated execute and rollback actions for the package.
//
extern "C" HRESULT ExeEnginePlanAddPackage(
__in_opt DWORD *pdwInsertSequence,
__in BURN_PACKAGE* pPackage,
__in BURN_PLAN* pPlan,
__in BURN_LOGGING* pLog,
__in BURN_VARIABLES* pVariables,
__in_opt HANDLE hCacheEvent,
__in BOOL fPlanPackageCacheRollback
)
{
HRESULT hr = S_OK;
BURN_EXECUTE_ACTION* pAction = NULL;
// add wait for cache
if (hCacheEvent)
{
hr = PlanExecuteCacheSyncAndRollback(pPlan, pPackage, hCacheEvent, fPlanPackageCacheRollback);
ExitOnFailure(hr, "Failed to plan package cache syncpoint");
}
hr = DependencyPlanPackage(pdwInsertSequence, pPackage, pPlan);
ExitOnFailure(hr, "Failed to plan package dependency actions.");
// add execute action
if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->execute)
{
if (NULL != pdwInsertSequence)
{
hr = PlanInsertExecuteAction(*pdwInsertSequence, pPlan, &pAction);
ExitOnFailure(hr, "Failed to insert execute action.");
}
else
{
hr = PlanAppendExecuteAction(pPlan, &pAction);
ExitOnFailure(hr, "Failed to append execute action.");
}
pAction->type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE;
pAction->exePackage.pPackage = pPackage;
pAction->exePackage.fFireAndForget = (BOOTSTRAPPER_ACTION_UPDATE_REPLACE == pPlan->action);
pAction->exePackage.action = pPackage->execute;
if (pPackage->Exe.sczIgnoreDependencies)
{
hr = StrAllocString(&pAction->exePackage.sczIgnoreDependencies, pPackage->Exe.sczIgnoreDependencies, 0);
ExitOnFailure(hr, "Failed to allocate the list of dependencies to ignore.");
}
LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, NULL); // ignore errors.
}
// add rollback action
if (BOOTSTRAPPER_ACTION_STATE_NONE != pPackage->rollback)
{
hr = PlanAppendRollbackAction(pPlan, &pAction);
ExitOnFailure(hr, "Failed to append rollback action.");
pAction->type = BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE;
pAction->exePackage.pPackage = pPackage;
pAction->exePackage.action = pPackage->rollback;
if (pPackage->Exe.sczIgnoreDependencies)
{
hr = StrAllocString(&pAction->exePackage.sczIgnoreDependencies, pPackage->Exe.sczIgnoreDependencies, 0);
ExitOnFailure(hr, "Failed to allocate the list of dependencies to ignore.");
}
LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, NULL); // ignore errors.
}
LExit:
return hr;
}