#include "stdafx.h" #include "common.h" #include "iisobj.h" #include "tracker.h" extern INT g_iDebugOutputLevel; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif void CPropertySheetTracker::Dump() { #if defined(_DEBUG) || DBG int iCount = 0; CString strGUIDName; GUID * pItemFromListGUID = NULL; CIISObject * pItemFromList = NULL; if (!(g_iDebugOutputLevel & DEBUG_FLAG_CIISOBJECT)) { return; } DebugTrace(_T("Dump OpenPropertySheetList -------------- start (count=%d)\r\n"),IISObjectOpenPropertySheets.GetCount()); POSITION pos = IISObjectOpenPropertySheets.GetHeadPosition(); while (pos) { pItemFromList = IISObjectOpenPropertySheets.GetNext(pos); if (pItemFromList) { iCount++; // Get GUID Name pItemFromListGUID = (GUID*) pItemFromList->GetNodeType(); if (pItemFromListGUID) { GetFriendlyGuidName(*pItemFromListGUID,strGUIDName); } // Get FriendlyName LPOLESTR pTempFriendly = pItemFromList->QueryDisplayName(); DebugTrace(_T("Dump:[%3d] %p (%s) '%s'\r\n"),iCount,pItemFromList,strGUIDName,pTempFriendly ? pTempFriendly : _T("")); } } DebugTrace(_T("Dump OpenPropertySheetList -------------- end\r\n")); #endif // _DEBUG return; } INT CPropertySheetTracker::OrphanPropertySheetsBelowMe(CComPtr pConsoleNameSpace,CIISObject * pItem,BOOL bOrphan) { BOOL bFound = FALSE; POSITION pos; INT iOrphanedCount = 0; // Loop thru all the open property sheets // and see if there is a property sheet that is below me. GUID * pItemFromListGUID = NULL; CIISObject * pItemFromList = NULL; CIISMBNode * pItemFromListAsNode = NULL; CIISMachine * pItemFromListOwner = NULL; GUID * pItemGUID = NULL; CIISMBNode * pItemAsNode = NULL; CIISMachine * pItemOwner = NULL; pItemGUID = (GUID*) pItem->GetNodeType(); // check if it's a leaf node... if (pItem->IsLeafNode()) { //cWebServiceExtensionContainer //cWebServiceExtension //cApplicationNode //cFileNode return FALSE; } pItemAsNode = (CIISMBNode *) pItem; pItemOwner = pItemAsNode->GetOwner(); pos = IISObjectOpenPropertySheets.GetHeadPosition(); while (pos) { pItemFromList = IISObjectOpenPropertySheets.GetNext(pos); if (pItemFromList) { // Get Owner, if the owner Pointer // matches our passed in CIISObject // then this must be open for this computer... pItemFromListAsNode = (CIISMBNode *) pItemFromList; if (!pItemFromListAsNode) { // got a bad pointer to an object. // skip it... continue; } if (pItemFromListAsNode == pItem) { // we found ourself... // skip it continue; } pItemFromListOwner = pItemFromListAsNode->GetOwner(); if (!pItemFromListOwner) { // object doesn't have an owner... // skip it continue; } if (pItemFromListOwner != pItemOwner) { // they have different owners // they must be from different machines.. // skip it continue; } pItemFromListGUID = (GUID*) pItemFromListAsNode->GetNodeType(); if (!pItemFromListGUID) { // object doesn't have a guid who knows what type it is!!! ASSERT("Error:Item Missing GUID!"); //continue; } // // Determine what type of object // we are checking, and cater to that object // bFound = FALSE; if (IsEqualGUID(*pItemGUID,cWebServiceExtensionContainer)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (IsEqualGUID(*pItemFromListGUID,cWebServiceExtension)) { if (pItemFromList->IsMyPropertySheetOpen()) { bFound = TRUE; break; } } continue; } else if (IsEqualGUID(*pItemGUID,cAppPoolNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (IsEqualGUID(*pItemFromListGUID,cApplicationNode)) { if (pItemFromList->IsMyPropertySheetOpen()) { bFound = TRUE; break; } } continue; } else if (IsEqualGUID(*pItemGUID,cAppPoolsNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (IsEqualGUID(*pItemFromListGUID,cAppPoolNode) || IsEqualGUID(*pItemFromListGUID,cApplicationNode) ) { if (pItemFromList->IsMyPropertySheetOpen()) { bFound = TRUE; break; } } continue; } else if (IsEqualGUID(*pItemGUID,cInstanceNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (!IsEqualGUID(*pItemFromListGUID,cChildNode) && !IsEqualGUID(*pItemFromListGUID,cFileNode) ) { continue; } } else if (IsEqualGUID(*pItemGUID,cInstanceCollectorNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (!IsEqualGUID(*pItemFromListGUID,cInstanceNode) && !IsEqualGUID(*pItemFromListGUID,cChildNode) && !IsEqualGUID(*pItemFromListGUID,cFileNode) ) { continue; } } else if (IsEqualGUID(*pItemGUID,cServiceCollectorNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } // could have these type below it if (!IsEqualGUID(*pItemFromListGUID,cInstanceCollectorNode) && !IsEqualGUID(*pItemFromListGUID,cInstanceNode) && !IsEqualGUID(*pItemFromListGUID,cChildNode) && !IsEqualGUID(*pItemFromListGUID,cFileNode) ) { continue; } } else if (IsEqualGUID(*pItemGUID,cCompMgmtService)) { // who knows... } // check if this item is below the parent item's chain // of command... // Get that items parent and check if it's cookie // points to our object. // Check if the parent node points to us! BOOL bMatchedParent = FALSE; SCOPEDATAITEM si; ::ZeroMemory(&si, sizeof(SCOPEDATAITEM)); si.mask = SDI_PARAM; si.ID = pItemFromListAsNode->QueryScopeItem();; if (SUCCEEDED(pConsoleNameSpace->GetItem(&si))) { // walk up the item's parentpath and see if our object is one of them... INT ICount = 0; HSCOPEITEM hSI = si.ID; LONG_PTR lCookie = 0; HRESULT hr = S_OK; while (hSI) { HSCOPEITEM hSITemp = 0; ICount++; if (ICount > 30) { // possible infinite loop break; } hr = pConsoleNameSpace->GetParentItem(hSI, &hSITemp, &lCookie); if (FAILED(hr)) { break; } if ( (LONG_PTR) pItem == lCookie) { bMatchedParent = TRUE; break; } hSI = hSITemp; } } if (bMatchedParent) { bFound = TRUE; iOrphanedCount++; // Mark it as orphaned by // Erasing it's ScopeItem or ResultItem if (bOrphan) { pItemFromList->ResetScopeItem(); pItemFromList->ResetResultItem(); } // continue on to the next one... } } } if (iOrphanedCount > 0) { DebugTrace(_T("Orphaned PropertySheets=%d\r\n"),iOrphanedCount); } return iOrphanedCount; } // // WARNING: this function will not really be helpfull // if the objects have already been removed... // BOOL CPropertySheetTracker::IsPropertySheetOpenBelowMe(CComPtr pConsoleNameSpace,CIISObject * pItem,CIISObject ** ppItemReturned) { BOOL bFound = FALSE; POSITION pos; // Loop thru all the open property sheets // and see if there is a property sheet that is below me. GUID * pItemFromListGUID = NULL; CIISObject * pItemFromList = NULL; CIISMBNode * pItemFromListAsNode = NULL; CIISMachine * pItemFromListOwner = NULL; GUID * pItemGUID = NULL; CIISMBNode * pItemAsNode = NULL; CIISMachine * pItemOwner = NULL; if (!ppItemReturned) { return FALSE; } pItemGUID = (GUID*) pItem->GetNodeType(); if (IsEqualGUID(*pItemGUID,cInternetRootNode) || IsEqualGUID(*pItemGUID,cMachineNode)) { // they should be using a different funciton... return IsPropertySheetOpenComputer(pItem,FALSE,ppItemReturned); } // check if it's a leaf node... if (pItem->IsLeafNode()) { //cWebServiceExtensionContainer //cWebServiceExtension //cApplicationNode //cFileNode return FALSE; } pItemAsNode = (CIISMBNode *) pItem; pItemOwner = pItemAsNode->GetOwner(); pos = IISObjectOpenPropertySheets.GetHeadPosition(); while (pos) { pItemFromList = IISObjectOpenPropertySheets.GetNext(pos); if (pItemFromList) { // Get Owner, if the owner Pointer // matches our passed in CIISObject // then this must be open for this computer... pItemFromListAsNode = (CIISMBNode *) pItemFromList; if (!pItemFromListAsNode) { // got a bad pointer to an object. // skip it... continue; } if (pItemFromListAsNode == pItem) { // we found ourself... // skip it continue; } pItemFromListOwner = pItemFromListAsNode->GetOwner(); if (!pItemFromListOwner) { // object doesn't have an owner... // skip it continue; } if (pItemFromListOwner != pItemOwner) { // they have different owners // they must be from different machines.. // skip it continue; } pItemFromListGUID = (GUID*) pItemFromListAsNode->GetNodeType(); if (!pItemFromListGUID) { // object doesn't have a guid who knows what type it is!!! ASSERT("Error:Item Missing GUID!"); //continue; } // // Determine what type of object // we are checking, and cater to that object // if (IsEqualGUID(*pItemGUID,cWebServiceExtensionContainer)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (IsEqualGUID(*pItemFromListGUID,cWebServiceExtension)) { if (pItemFromList->IsMyPropertySheetOpen()) { bFound = TRUE; *ppItemReturned = pItemFromList; break; } } continue; } else if (IsEqualGUID(*pItemGUID,cAppPoolNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (IsEqualGUID(*pItemFromListGUID,cApplicationNode)) { if (pItemFromList->IsMyPropertySheetOpen()) { bFound = TRUE; *ppItemReturned = pItemFromList; break; } } continue; } else if (IsEqualGUID(*pItemGUID,cAppPoolsNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (IsEqualGUID(*pItemFromListGUID,cAppPoolNode) || IsEqualGUID(*pItemFromListGUID,cApplicationNode) ) { if (pItemFromList->IsMyPropertySheetOpen()) { bFound = TRUE; *ppItemReturned = pItemFromList; break; } } continue; } else if (IsEqualGUID(*pItemGUID,cInstanceNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (!IsEqualGUID(*pItemFromListGUID,cChildNode) && !IsEqualGUID(*pItemFromListGUID,cFileNode) ) { continue; } } else if (IsEqualGUID(*pItemGUID,cInstanceCollectorNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } if (!IsEqualGUID(*pItemFromListGUID,cInstanceNode) && !IsEqualGUID(*pItemFromListGUID,cChildNode) && !IsEqualGUID(*pItemFromListGUID,cFileNode) ) { continue; } } else if (IsEqualGUID(*pItemGUID,cServiceCollectorNode)) { if (IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... continue; } // could have these type below it if (!IsEqualGUID(*pItemFromListGUID,cInstanceCollectorNode) && !IsEqualGUID(*pItemFromListGUID,cInstanceNode) && !IsEqualGUID(*pItemFromListGUID,cChildNode) && !IsEqualGUID(*pItemFromListGUID,cFileNode) ) { continue; } } else if (IsEqualGUID(*pItemGUID,cCompMgmtService)) { // who knows... } // check if this item is below the parent item's chain // of command... // Get that items parent and check if it's cookie // points to our object. // Check if the parent node points to us! BOOL bMatchedParent = FALSE; SCOPEDATAITEM si; ::ZeroMemory(&si, sizeof(SCOPEDATAITEM)); si.mask = SDI_PARAM; si.ID = pItemFromListAsNode->QueryScopeItem();; if (SUCCEEDED(pConsoleNameSpace->GetItem(&si))) { // walk up the item's parentpath and see if our object is one of them... INT ICount = 0; HSCOPEITEM hSI = si.ID; LONG_PTR lCookie = 0; HRESULT hr = S_OK; while (hSI) { HSCOPEITEM hSITemp = 0; ICount++; if (ICount > 30) { // possible infinite loop ASSERT("ERROR:possible infinite loop"); break; } hr = pConsoleNameSpace->GetParentItem(hSI, &hSITemp, &lCookie); if (FAILED(hr)) { break; } if ( (LONG_PTR) pItem == lCookie) { bMatchedParent = TRUE; break; } hSI = hSITemp; } } if (bMatchedParent) { if (pItemFromList->IsMyPropertySheetOpen()) { if (ppItemReturned) { bFound = TRUE; *ppItemReturned = pItemFromList; break; } } } } } if (bFound) { DebugTrace(_T("Found item (%p) with propertypage below parent(%p)\r\n"),*ppItemReturned,pItem); } return bFound; } BOOL CPropertySheetTracker::IsPropertySheetOpenComputer(CIISObject * pItem,BOOL bIncludeComputerNode,CIISObject ** ppItemReturned) { BOOL bFound = FALSE; BOOL bGuidIsMachine = FALSE; // Loop thru all the open property sheets // and see if there is a property sheet that is under the computer node. GUID * pItemFromListGUID = NULL; CIISObject * pItemFromList = NULL; CIISMBNode * pItemFromListAsNode = NULL; CIISMachine * pOwner = NULL; POSITION pos = IISObjectOpenPropertySheets.GetHeadPosition(); while (pos) { pItemFromList = IISObjectOpenPropertySheets.GetNext(pos); if (pItemFromList) { // Get Owner, if the owner Pointer // matches our passed in CIISObject // then this must be open for this computer... pItemFromListAsNode = (CIISMBNode *) pItemFromList; if (pItemFromListAsNode) { pOwner = pItemFromListAsNode->GetOwner(); if (pOwner) { if (pOwner == pItem) { // Get GUID Name and make sure it's not // a CIISRoot or CIISMachine node. bGuidIsMachine = FALSE; pItemFromListGUID = (GUID*) pItemFromListAsNode->GetNodeType(); if (pItemFromListGUID) { if (IsEqualGUID(*pItemFromListGUID,cInternetRootNode) || IsEqualGUID(*pItemFromListGUID,cMachineNode)) { // oh well, we don't want these... bGuidIsMachine = TRUE; } } // But if we want to check if the // computer node is also open // then they would have set this parameter if (bIncludeComputerNode) { bGuidIsMachine = FALSE; } if (!bGuidIsMachine) { if (pItemFromList->IsMyPropertySheetOpen()) { if (ppItemReturned) { bFound = TRUE; *ppItemReturned = pItemFromList; break; } } } } } } } } return bFound; } BOOL CPropertySheetTracker::FindAlreadyOpenPropertySheet(CIISObject * pItem,CIISObject ** ppItemReturned) { BOOL bFound = FALSE; POSITION pos; // Loop thru all the open property sheets // and see if there is a property sheet that is US GUID * pItemFromListGUID = NULL; CIISObject * pItemFromList = NULL; CIISMBNode * pItemFromListAsNode = NULL; CIISMachine * pItemFromListOwner = NULL; CComBSTR bstrItemFromListPath; GUID * pItemGUID = NULL; CIISMBNode * pItemAsNode = NULL; CIISMachine * pItemOwner = NULL; CComBSTR bstrItemPath; if (!ppItemReturned) { ASSERT("Error:FindAlreadyOpenPropertySheet:Bad Param"); return FALSE; } if (!pItem->IsConfigurable()) { return FALSE; } // make sure the item we are checking has a tag set pItem->CreateTag(); pItemGUID = (GUID*) pItem->GetNodeType(); pItemAsNode = (CIISMBNode *) pItem; pItemOwner = pItemAsNode->GetOwner(); pos = IISObjectOpenPropertySheets.GetHeadPosition(); while (pos) { pItemFromList = IISObjectOpenPropertySheets.GetNext(pos); if (pItemFromList) { // Get Owner, if the owner Pointer // matches our passed in CIISObject // then this must be open for this computer... pItemFromListAsNode = (CIISMBNode *) pItemFromList; if (!pItemFromListAsNode) { // got a bad pointer to an object. // skip it... continue; } if (pItemFromListAsNode == pItem) { // we found ourself!!!! // that's what we're looking for! bFound = TRUE; *ppItemReturned = pItem; break; } pItemFromListOwner = pItemFromListAsNode->GetOwner(); if (!pItemFromListOwner) { // object doesn't have an owner... // skip it continue; } if (pItemFromListOwner != pItemOwner) { // they have different owners // they must be from different machines.. // skip it continue; } pItemFromListGUID = (GUID*) pItemFromListAsNode->GetNodeType(); if (!pItemFromListGUID) { // object doesn't have a guid who knows what type it is!!! ASSERT("Error:Item Missing GUID"); //continue; } if (!IsEqualGUID(*pItemGUID,*pItemFromListGUID)) { // if we found our own type... // that's what we're sort of looking for continue; } if (!pItemFromList->IsConfigurable()) { // can't bring up property sheets on these anyways... continue; } // Check if the tag matches // THIS SHOULD TAKE CARE OF EVERYTHING if (0 == _tcsicmp(pItem->m_strTag,pItemFromList->m_strTag)) { DebugTrace(_T("Found matching tag:%s\r\n"),pItem->m_strTag); if (pItemFromList->IsMyPropertySheetOpen()) { // that's what we're looking for! bFound = TRUE; *ppItemReturned = pItemFromList; break; } } } } if (TRUE == bFound) { DebugTrace(_T("FindAlreadyOpenPropertySheet:Found, object=%p, existing obj=%p\r\n"),pItem,pItemFromList); } return bFound; }