static void FreeSubscription( CPI_SUBSCRIPTION* pItm ) { if (pItm->pProperties) CpiPropertiesFreeList(pItm->pProperties); ::HeapFree(::GetProcessHeap(), 0, pItm); }
static void FreeApplicationRole( CPI_APPLICATION_ROLE* pItm ) { if (pItm->pProperties) CpiPropertiesFreeList(pItm->pProperties); ReleaseObject(pItm->piUsersColl); ::HeapFree(::GetProcessHeap(), 0, pItm); }
static void FreePartition( CPI_PARTITION* pItm ) { if (pItm->pProperties) CpiPropertiesFreeList(pItm->pProperties); ReleaseObject(pItm->piApplicationsColl); ReleaseObject(pItm->piRolesColl); ::HeapFree(::GetProcessHeap(), 0, pItm); }
HRESULT CpiPropertiesRead( LPCWSTR pwzQuery, LPCWSTR pwzKey, CPI_PROPERTY_DEFINITION* pPropDefList, CPI_PROPERTY** ppPropList, int* piCount ) { HRESULT hr = S_OK; PMSIHANDLE hView, hRecKey, hRec; CPI_PROPERTY* pItm = NULL; LPWSTR pwzData = NULL; int iVersionNT = 0; CPI_PROPERTY_DEFINITION* pPropDef; *piCount = 0; // get NT version hr = WcaGetIntProperty(L"VersionNT", &iVersionNT); ExitOnFailure(hr, "Failed to set record string"); // create parameter record hRecKey = ::MsiCreateRecord(1); ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record"); hr = WcaSetRecordString(hRecKey, 1, pwzKey); ExitOnFailure(hr, "Failed to set record string"); // open view hr = WcaOpenView(pwzQuery, &hView); ExitOnFailure(hr, "Failed to open view on property table"); hr = WcaExecuteView(hView, hRecKey); ExitOnFailure(hr, "Failed to execute view on property table"); while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) { // create entry pItm = (CPI_PROPERTY*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_PROPERTY)); if (!pItm) ExitFunction1(hr = E_OUTOFMEMORY); // get name hr = WcaGetRecordString(hRec, pqName, &pwzData); ExitOnFailure(hr, "Failed to get name"); StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData); // get value hr = WcaGetRecordFormattedString(hRec, pqValue, &pItm->pwzValue); ExitOnFailure(hr, "Failed to get value"); // find property definition hr = FindPropertyDefinition(pPropDefList, pItm->wzName, &pPropDef); ExitOnFailure(hr, "Failed to find property definition"); if (S_FALSE == hr) ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Unknown property, key: %S, property: %S", pwzKey, pItm->wzName); // check version, ignore if catalog version is too low if (iVersionNT < pPropDef->iMinVersionNT) { WcaLog(LOGMSG_VERBOSE, "Skipping property since NT version is too low, key: %S, property: %S", pwzKey, pItm->wzName); CpiPropertiesFreeList(pItm); pItm = NULL; continue; } // if the property is a user, replace the User table key with a user account name if (cpptUser == pPropDef->iType) { hr = GetUserAccountName(pItm->pwzValue, &pItm->pwzValue); ExitOnFailure(hr, "Failed to get user account name"); } // add entry ++*piCount; if (*ppPropList) pItm->pNext = *ppPropList; *ppPropList = pItm; pItm = NULL; } if (E_NOMOREITEMS == hr) hr = S_OK; LExit: // clean up if (pItm) CpiPropertiesFreeList(pItm); ReleaseStr(pwzData); return hr; }