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; }
/******************************************************************** 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); }