void MainDialog::OnButtonSearch() { HRESULT hr=S_OK; int nFilters = 0; IEnumMoniker *pEnum = NULL; IMoniker *pMoniker=0; // Clear any previous results m_ListFilters.ClearItems(); // Enumerate filters based on the current dialog box selections. hr = EnumerateFilters(&pEnum); if (FAILED(hr)) { return; } // Reset the enumerator. hr = pEnum->Reset(); // Not strictly necessary but can't hurt. // Go through each moniker in the collection. while((hr = pEnum->Next(1, &pMoniker, NULL)) == S_OK) { IPropertyBag *pPropBag = NULL; DWORD dwMerit; VARIANT varName; VARIANT varFilterClsid; VariantInit(&varName); VariantInit(&varFilterClsid); // Initialize variant types varName.vt = VT_BSTR; varFilterClsid.vt = VT_BSTR; // Get a property bag for this moniker. hr = pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void **)&pPropBag); // Read the filter name from the property bag if (SUCCEEDED(hr)) { hr = pPropBag->Read(L"FriendlyName", &varName, 0); } // Read the Merit value from the property bag if (SUCCEEDED(hr)) { hr = GetMerit(pPropBag, &dwMerit); } // Read filter's CLSID from property bag. The CLSID is // returned as a string (BSTR). if (SUCCEEDED(hr)) { hr = pPropBag->Read(L"CLSID", &varFilterClsid, 0); } // Add filter name and filename to listbox if(SUCCEEDED(hr)) { nFilters++; AddFilterToList(varName.bstrVal, varFilterClsid.bstrVal, dwMerit); } // Clean up. SysFreeString(varFilterClsid.bstrVal); SysFreeString(varName.bstrVal); SAFE_RELEASE(pPropBag); SAFE_RELEASE(pMoniker); } // Display number of filters matching query WCHAR szNumFilters[48]; hr = StringCchPrintf(szNumFilters, NUMELMS(szNumFilters), L"Filters Matching Query : %d\0", nFilters); SetDlgItemText(IDC_STATIC_NUMFILTERS, szNumFilters); if (nFilters == 0) { m_ListFilters.AddString(L"<No filters matched query>"); } // Clean up enumerator SAFE_RELEASE(pEnum); }
UINT __stdcall ScaFiltersRead(IMSAdminBase* piMetabase, SCA_WEB* pswList, SCA_FILTER** ppsfList) { HRESULT hr = S_OK; UINT er = ERROR_SUCCESS; PMSIHANDLE hView, hRec; PMSIHANDLE hViewWeb, hRecWeb; BOOL fIIsWebFilterTable = FALSE; LPWSTR pwzData = NULL; SCA_FILTER* psf = NULL; DWORD dwLen = 0; // check for required table if (S_OK != WcaTableExists(L"IIsFilter")) { WcaLog(LOGMSG_VERBOSE, "Skipping ScaInstallFilters() - no IIsFilter table"); ExitFunction1(hr = S_FALSE); } // loop through all the filters hr = WcaOpenExecuteView(vcsFilterQuery, &hView); ExitOnFailure(hr, "Failed to open view on IIsFilter table"); while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) { hr = AddFilterToList(ppsfList); ExitOnFailure(hr, "failed to add filter to list"); psf = *ppsfList; // get component install state hr = WcaGetRecordString(hRec, fqComponent, &pwzData); ExitOnFailure(hr, "Failed to get Filter.Component_"); er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &psf->isInstalled, &psf->isAction); hr = HRESULT_FROM_WIN32(er); ExitOnFailure(hr, "Failed to get Component state for filter"); ::ZeroMemory(psf->wzFilterRoot, sizeof(psf->wzFilterRoot)); hr = WcaGetRecordString(hRec, fqWeb, &pwzData); ExitOnFailure(hr, "Failed to get Web for VirtualDir"); if (*pwzData) { dwLen = countof(psf->wzWebBase); hr = ScaWebsGetBase(piMetabase, pswList, pwzData, psf->wzWebBase, &dwLen); ExitOnFailure(hr, "Failed to get base of web for Filter"); StringCchPrintfW(psf->wzFilterRoot, countof(psf->wzFilterRoot), L"%s/Filters", psf->wzWebBase); } else { StringCchCopyW(psf->wzFilterRoot, countof(psf->wzFilterRoot), L"/LM/W3SVC/Filters"); } // filter key hr = WcaGetRecordString(hRec, fqFilter, &pwzData); ExitOnFailure(hr, "Failed to get Filter.Filter"); StringCchCopyW(psf->wzKey, countof(psf->wzKey), pwzData); // filter path hr = WcaGetRecordFormattedString(hRec, fqPath, &pwzData); ExitOnFailure(hr, "Failed to get Filter.Path"); StringCchCopyW(psf->wzPath, countof(psf->wzPath), pwzData); // filter description hr = WcaGetRecordFormattedString(hRec, fqDescription, &pwzData); ExitOnFailure(hr, "Failed to get Filter.Description"); StringCchCopyW(psf->wzDescription, countof(psf->wzDescription), pwzData); // filter flags hr = WcaGetRecordInteger(hRec, fqFlags, &psf->iFlags); ExitOnFailure(hr, "Failed to get Filter.Flags"); // filter load order hr = WcaGetRecordInteger(hRec, fqLoadOrder, &psf->iLoadOrder); ExitOnFailure(hr, "Failed to get Filter.LoadOrder"); } if (E_NOMOREITEMS == hr) hr = S_OK; ExitOnFailure(hr, "Failure while processing filters"); LExit: ReleaseStr(pwzData); return hr; }
UINT __stdcall ScaFiltersRead7( __in SCA_WEB7* pswList, __in WCA_WRAPQUERY_HANDLE hWebBaseQuery, __inout SCA_FILTER** ppsfList, __inout LPWSTR *ppwzCustomActionData ) { HRESULT hr = S_OK; UINT er = ERROR_SUCCESS; MSIHANDLE hRec; INSTALLSTATE isInstalled = INSTALLSTATE_UNKNOWN; INSTALLSTATE isAction = INSTALLSTATE_UNKNOWN; SCA_FILTER* psf; LPWSTR pwzData = NULL; WCA_WRAPQUERY_HANDLE hWrapQuery = NULL; hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData); ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead"); if (0 == WcaGetQueryRecords(hWrapQuery)) { WcaLog(LOGMSG_VERBOSE, "Skipping ScaFiltersRead() - no IIsFilter table"); ExitFunction1(hr = S_FALSE); } // loop through all the filters while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec))) { // Get the Component first. If the component is not being modified during // this transaction, skip processing this whole record. // get the darwin information hr = WcaGetRecordString(hRec, fqComponent, &pwzData); ExitOnFailure(hr, "failed to get IIsFilter.Component"); hr = WcaGetRecordInteger(hRec, fqInstalled, (int *)&isInstalled); ExitOnFailure(hr, "Failed to get Component installed state for IIs filter"); hr = WcaGetRecordInteger(hRec, fqAction, (int *)&isAction); ExitOnFailure(hr, "Failed to get Component action state for IIs filter"); if (!WcaIsInstalling(isInstalled, isAction) && !WcaIsReInstalling(isInstalled, isAction) && !WcaIsUninstalling(isInstalled, isAction)) { continue; // skip this record. } hr = AddFilterToList(ppsfList); ExitOnFailure(hr, "failed to add filter to list"); psf = *ppsfList; hr = ::StringCchCopyW(psf->wzComponent, countof(psf->wzComponent), pwzData); ExitOnFailure1(hr, "failed to copy component name: %ls", pwzData); psf->isInstalled = isInstalled; psf->isAction = isAction; hr = WcaGetRecordString(hRec, fqWeb, &pwzData); ExitOnFailure(hr, "Failed to get Web for VirtualDir"); if (*pwzData) { hr = ScaWebsGetBase7(pswList, pwzData, psf->wzFilterRoot, countof(psf->wzFilterRoot)); if (FAILED(hr)) { WcaLog(LOGMSG_VERBOSE, "Could not find site for filter: %ls. Result 0x%x ", psf->wzFilterRoot, hr); hr = S_OK; } } else { hr = ::StringCchCopyW(psf->wzFilterRoot, countof(psf->wzFilterRoot), L"/"); ExitOnFailure(hr, "Failed to allocate global filter base string"); } // filter Name key hr = WcaGetRecordString(hRec, fqFilter, &pwzData); ExitOnFailure(hr, "Failed to get Filter.Filter"); hr = ::StringCchCopyW(psf->wzKey, countof(psf->wzKey), pwzData); ExitOnFailure(hr, "Failed to copy key string to filter object"); // filter path hr = WcaGetRecordString(hRec, fqPath, &pwzData); ExitOnFailure(hr, "Failed to get Filter.Path"); hr = ::StringCchCopyW(psf->wzPath, countof(psf->wzPath), pwzData); ExitOnFailure(hr, "Failed to copy path string to filter object"); // filter description -- not supported in iis 7 hr = WcaGetRecordString(hRec, fqDescription, &pwzData); ExitOnFailure(hr, "Failed to get Filter.Description"); hr = ::StringCchCopyW(psf->wzDescription, countof(psf->wzDescription), pwzData); ExitOnFailure(hr, "Failed to copy description string to filter object"); // filter flags //What are these hr = WcaGetRecordInteger(hRec, fqFlags, &psf->iFlags); ExitOnFailure(hr, "Failed to get Filter.Flags"); // filter load order hr = WcaGetRecordInteger(hRec, fqLoadOrder, &psf->iLoadOrder); ExitOnFailure(hr, "Failed to get Filter.LoadOrder"); } if (E_NOMOREITEMS == hr) { hr = S_OK; } ExitOnFailure(hr, "Failure while processing filters"); LExit: WcaFinishUnwrapQuery(hWrapQuery); ReleaseStr(pwzData); return hr; }