示例#1
0
HRESULT CpiReadRollbackDataList(
	HANDLE hFile,
	CPI_ROLLBACK_DATA** pprdList
	)
{
	HRESULT hr = S_OK;

	int iCount;

	CPI_ROLLBACK_DATA* pItm = NULL;

	// read count
	hr = ReadFileAll(hFile, (PBYTE)&iCount, sizeof(int));
	if (HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) == hr)
		ExitFunction1(hr = S_OK); // EOF reached, nothing left to read
	ExitOnFailure(hr, "Failed to read count");

	for (int i = 0; i < iCount; i++)
	{
		// allocate new element
		pItm = (CPI_ROLLBACK_DATA*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_ROLLBACK_DATA));
		if (!pItm)
			ExitFunction1(hr = E_OUTOFMEMORY);

		// read from file
		hr = ReadFileAll(hFile, (PBYTE)pItm->wzKey, MAX_DARWIN_KEY * sizeof(WCHAR));
		if (HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) == hr)
			break; // EOF reached, nothing left to read
		ExitOnFailure(hr, "Failed to read key");

		hr = ReadFileAll(hFile, (PBYTE)&pItm->iStatus, sizeof(int));
		if (HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) == hr)
			pItm->iStatus = 0; // EOF reached, the operation was interupted; set status to zero
		else
			ExitOnFailure(hr, "Failed to read status");

		// add to list
		if (*pprdList)
			pItm->pNext = *pprdList;
		*pprdList = pItm;
		pItm = NULL;
	}

	hr = S_OK;

LExit:
	// clean up
	if (pItm)
		CpiFreeRollbackDataList(pItm);

	return hr;
}
示例#2
0
/********************************************************************
 ComPlusRollbackUninstallExecute - CUSTOM ACTION ENTRY POINT

  Input:  deferred CustomActionData - ComPlusRollbackUninstallExecute
********************************************************************/
extern "C" UINT __stdcall ComPlusRollbackUninstallExecute(MSIHANDLE hInstall)
{
	HRESULT hr = S_OK;
	UINT er = ERROR_SUCCESS;

	LPWSTR pwzData = NULL;
	LPWSTR pwzRollbackFileName = NULL;

	HANDLE hRollbackFile = INVALID_HANDLE_VALUE;

	CPI_ROLLBACK_DATA* prdPartitions = NULL;
	CPI_ROLLBACK_DATA* prdUsersInPartitionRoles = NULL;
	CPI_ROLLBACK_DATA* prdPartitionUsers = NULL;
	CPI_ROLLBACK_DATA* prdApplications = NULL;
	CPI_ROLLBACK_DATA* prdApplicationRoles = NULL;
	CPI_ROLLBACK_DATA* prdUsersApplicationRoles = NULL;
	CPI_ROLLBACK_DATA* prdAssemblies = NULL;
	CPI_ROLLBACK_DATA* prdRoleAssignments = NULL;
	CPI_ROLLBACK_DATA* prdSubscriptions = NULL;

	BOOL fInitializedCom = FALSE;

	// initialize
	hr = WcaInitialize(hInstall, "ComPlusRollbackUninstallExecute");
	ExitOnFailure(hr, "Failed to initialize ComPlusRollbackUninstallExecute");

	hr = ::CoInitialize(NULL);
	ExitOnFailure(hr, "Failed to initialize COM");
	fInitializedCom = TRUE;

	CpiInitialize();

	// get custom action data
	hr = WcaGetProperty(L"CustomActionData", &pwzData);
	ExitOnFailure(hr, "Failed to get CustomActionData");

	// open rollback file
	hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
	ExitOnFailure(hr, "Failed to read rollback file name");

	hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
	if (INVALID_HANDLE_VALUE == hRollbackFile)
		ExitOnFailure1(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);

	// read rollback data
	hr = CpiReadRollbackDataList(hRollbackFile, &prdSubscriptions);
	ExitOnFailure(hr, "Failed to read subscription rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdRoleAssignments);
	ExitOnFailure(hr, "Failed to read role assignments rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdAssemblies);
	ExitOnFailure(hr, "Failed to read assemblies rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersApplicationRoles);
	ExitOnFailure(hr, "Failed to read users in application roles rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdApplicationRoles);
	ExitOnFailure(hr, "Failed to read application roles rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdApplications);
	ExitOnFailure(hr, "Failed to read applications rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitionUsers);
	ExitOnFailure(hr, "Failed to read partition users rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersInPartitionRoles);
	ExitOnFailure(hr, "Failed to read users in partition roles rollback data");
	hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitions);
	ExitOnFailure(hr, "Failed to read partitions rollback data");

	::CloseHandle(hRollbackFile);
	hRollbackFile = INVALID_HANDLE_VALUE;

	// rollback remove partitions
	hr = CpiRollbackConfigurePartitions(&pwzData, prdPartitions);
	ExitOnFailure(hr, "Failed to rollback delete partitions");

	// rollback remove users in partition roles
	hr = CpiRollbackConfigureUsersInPartitionRoles(&pwzData, prdUsersInPartitionRoles);
	ExitOnFailure(hr, "Failed to rollback delete users in partition roles");

	// rollback remove partition users
	hr = CpiRollbackConfigurePartitionUsers(&pwzData, prdPartitionUsers);
	ExitOnFailure(hr, "Failed to rollback delete partition users");

	// rollback remove applications
	hr = CpiRollbackConfigureApplications(&pwzData, prdApplications);
	ExitOnFailure(hr, "Failed to rollback delete applications");

	// rollback remove application roles
	hr = CpiRollbackConfigureApplicationRoles(&pwzData, prdApplicationRoles);
	ExitOnFailure(hr, "Failed to rollback delete application roles");

	// rollback remove users in application roles
	hr = CpiRollbackConfigureUsersInApplicationRoles(&pwzData, prdUsersApplicationRoles);
	ExitOnFailure(hr, "Failed to rollback delete users in application roles");

	// rollback unregister assemblies
	hr = CpiRollbackConfigureAssemblies(&pwzData, prdAssemblies);
	ExitOnFailure(hr, "Failed to rollback unregister assemblies");

	// rollback delete role assignments
	hr = CpiRollbackConfigureRoleAssignments(&pwzData, prdAssemblies);
	ExitOnFailure(hr, "Failed to rollback delete role assignments");

	// rollback delete subscriptions
	hr = CpiRollbackConfigureSubscriptions(&pwzData, prdSubscriptions);
	ExitOnFailure(hr, "Failed to rollback delete subscriptions");

	hr = S_OK;

LExit:
	// clean up
	ReleaseStr(pwzData);
	ReleaseStr(pwzRollbackFileName);

	if (INVALID_HANDLE_VALUE != hRollbackFile)
		::CloseHandle(hRollbackFile);

	if (prdPartitions)
		CpiFreeRollbackDataList(prdPartitions);
	if (prdUsersInPartitionRoles)
		CpiFreeRollbackDataList(prdUsersInPartitionRoles);
	if (prdPartitionUsers)
		CpiFreeRollbackDataList(prdPartitionUsers);
	if (prdApplications)
		CpiFreeRollbackDataList(prdApplications);
	if (prdApplicationRoles)
		CpiFreeRollbackDataList(prdApplicationRoles);
	if (prdUsersApplicationRoles)
		CpiFreeRollbackDataList(prdUsersApplicationRoles);
	if (prdAssemblies)
		CpiFreeRollbackDataList(prdAssemblies);
	if (prdRoleAssignments)
		CpiFreeRollbackDataList(prdRoleAssignments);
	if (prdSubscriptions)
		CpiFreeRollbackDataList(prdSubscriptions);

	// unitialize
	CpiFinalize();

	if (fInitializedCom)
		::CoUninitialize();

	er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
	return WcaFinalize(er);
}