// This is a part of the Microsoft Management Console. // Copyright (C) 1995-2001 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Management Console and related // electronic documentation provided with the interfaces. #include "stdafx.h" #include "snapmgr.h" #include "util.h" #include "regvldlg.h" //#include //#include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // // create registry value list under configuration node // void CSnapin::CreateProfileRegValueList(MMC_COOKIE cookie, PEDITTEMPLATE pSceInfo, LPDATAOBJECT pDataObj) { if ( !pSceInfo || !(pSceInfo->pTemplate) ) { return; } DWORD nCount = pSceInfo->pTemplate->RegValueCount; PSCE_REGISTRY_VALUE_INFO regArray = pSceInfo->pTemplate->aRegValues; CString strDisplayName; LPTSTR pDisplayName=NULL; DWORD displayType = 0; LPTSTR szUnits=NULL; PREGCHOICE pChoices=NULL; PREGFLAGS pFlags=NULL; CResult *pResult; for ( DWORD i=0; iSetRegChoices(pChoices); } if (pResult && pFlags) { pResult->SetRegFlags(pFlags); } if ( szUnits ) { LocalFree(szUnits); } szUnits = NULL; } return; } void CSnapin::CreateAnalysisRegValueList(MMC_COOKIE cookie, PEDITTEMPLATE pAnalTemp, PEDITTEMPLATE pEditTemp, LPDATAOBJECT pDataObj, RESULT_TYPES type) { if ( !pAnalTemp || !(pAnalTemp->pTemplate) || !pEditTemp || !(pEditTemp->pTemplate) ) { return; } DWORD nEditCount = pEditTemp->pTemplate->RegValueCount; // should be everything PSCE_REGISTRY_VALUE_INFO paEdit = pEditTemp->pTemplate->aRegValues; PSCE_REGISTRY_VALUE_INFO paAnal = pAnalTemp->pTemplate->aRegValues; CString strDisplayName; LPTSTR pDisplayName=NULL; DWORD displayType = 0; LPTSTR szUnits = NULL; PREGCHOICE pChoices = NULL; PREGFLAGS pFlags = NULL; CResult *pResult=NULL; for ( DWORD i=0; ipTemplate->RegValueCount; j++ ) { if ( pAnalTemp->pTemplate->aRegValues && pAnalTemp->pTemplate->aRegValues[j].FullValueName && _wcsicmp(pAnalTemp->pTemplate->aRegValues[j].FullValueName, paEdit[i].FullValueName) == 0 ) { if( reinterpret_cast(cookie)->GetModeBits() & MB_LOCAL_POLICY ){ break; } // // find a analysis result - this item may be a mismatch (when Value is not NULL) // SceEnumAllRegValues will set the status field to good if this item was not // added because it did not exist when it was originally loaded from the SAP table. // This tells us that this item is a MATCH and we should copy the value. // if ( !(paAnal[j].Value) && paEdit[i].Value && paAnal[j].Status != SCE_STATUS_ERROR_NOT_AVAILABLE && paAnal[j].Status != SCE_STATUS_NOT_ANALYZED ) { // // this is a good item, copy the config info as the analysis info // paAnal[j].Value = (PWSTR)LocalAlloc(0, (wcslen(paEdit[i].Value)+1)*sizeof(WCHAR)); if ( paAnal[j].Value ) { wcscpy(paAnal[j].Value, paEdit[i].Value); } else { // else out of memory if ( szUnits ) { LocalFree(szUnits); } szUnits = NULL; return; } } break; } } DWORD status = SCE_STATUS_GOOD; if ( j < pAnalTemp->pTemplate->RegValueCount ) { status = CEditTemplate::ComputeStatus( &paEdit[i], &pAnalTemp->pTemplate->aRegValues[j] ); } else { // // did not find the analysis array, shouldn't happen // status = SCE_STATUS_NOT_CONFIGURED; } // // add this item // if ( j < pAnalTemp->pTemplate->RegValueCount) { pResult = AddResultItem(strDisplayName, (LONG_PTR)&(pAnalTemp->pTemplate->aRegValues[j]), (LONG_PTR)&(paEdit[i]), type, status, cookie, false, szUnits, displayType, pEditTemp, pDataObj); if (pResult && pChoices) { pResult->SetRegChoices(pChoices); } if (pResult && pFlags) { pResult->SetRegFlags(pFlags); } } else { // // a good/not configured item // pResult = AddResultItem(strDisplayName, NULL, (LONG_PTR)&(paEdit[i]), type, status, cookie, false, szUnits, displayType, pEditTemp, pDataObj); if (pResult && pChoices) { pResult->SetRegChoices(pChoices); } } if ( szUnits ) { LocalFree(szUnits); } szUnits = NULL; } return; } BOOL LookupRegValueProperty( IN LPTSTR RegValueFullName, OUT LPTSTR *pDisplayName, OUT PDWORD displayType, OUT LPTSTR *pUnits OPTIONAL, OUT PREGCHOICE *pChoices OPTIONAL, OUT PREGFLAGS *pFlags OPTIONAL ) { if ( !RegValueFullName || !pDisplayName || !displayType ) { return FALSE; } CString strTmp = RegValueFullName; // // replace the \\ with / before search reg // int npos = strTmp.Find(L'\\'); while (npos > 0) { *(strTmp.GetBuffer(1)+npos) = L'/'; npos = strTmp.Find(L'\\'); } // // query the values from registry // *pDisplayName = NULL; HKEY hKey=NULL; HKEY hKey2=NULL; DWORD rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE, SCE_ROOT_REGVALUE_PATH, 0, KEY_READ, &hKey ); if (rc == ERROR_SUCCESS) { rc = RegOpenKeyEx( hKey, (PWSTR)(LPCTSTR)strTmp, 0, KEY_READ, &hKey2 ); } BOOL bRet; if ( ERROR_SUCCESS == rc) { DWORD RegType = 0; PWSTR Value=NULL; HRESULT hr = S_OK; Value = (PWSTR) LocalAlloc(LPTR,MAX_PATH*sizeof(WCHAR)); if (Value) { // // 126714 - shouldn't hard code display strings in the registry // store them indirectly so they can support MUI // hr = SHLoadRegUIString(hKey2, SCE_REG_DISPLAY_NAME, Value, MAX_PATH); if (FAILED(hr)) { rc = MyRegQueryValue( hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_NAME, (PVOID *)&Value, &RegType ); } else { rc = ERROR_SUCCESS; } } if ( rc == ERROR_SUCCESS ) { if ( Value ) { *pDisplayName = Value; Value = NULL; } else { // // did not find correct display name, use the reg name (outsize) // *pDisplayName = NULL; } } rc = MyRegQueryValue( hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_TYPE, (PVOID *)&displayType, &RegType ); if ( Value ) { LocalFree(Value); Value = NULL; } if ( pUnits ) { // // query the units // rc = MyRegQueryValue( hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_UNIT, (PVOID *)&Value, &RegType ); if ( rc == ERROR_SUCCESS ) { if ( RegType == REG_SZ && Value ) { *pUnits = Value; Value = NULL; } else { // // did not find units // *pUnits = NULL; } } if ( Value ) { LocalFree(Value); Value = NULL; } } // // find the registry key but may not find the display name // bRet = TRUE; if ( pChoices ) { // // query the choices // *pChoices = NULL; rc = MyRegQueryValue(hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_CHOICES, (PVOID *)&Value, &RegType ); if (ERROR_SUCCESS == rc) { if ((REG_MULTI_SZ == RegType) && Value) { LPTSTR szChoice = NULL; LPTSTR szLabel = NULL; // max field size for szChoice + dwVal DWORD dwVal = -1; PREGCHOICE pRegChoice = NULL; PREGCHOICE pLast = NULL; szChoice = Value; do { // // Divide szChoice into dwValue and szLabel sections // szLabel = _tcschr(szChoice,L'|'); *szLabel = L'\0'; szLabel++; dwVal = _ttoi(szChoice); pRegChoice = (PREGCHOICE) LocalAlloc(LPTR,sizeof(REGCHOICE)); if (pRegChoice) { // // Fill in fields of new reg choice // pRegChoice->dwValue = dwVal; pRegChoice->szName = (LPTSTR) LocalAlloc(LPTR,(lstrlen(szLabel)+1)*sizeof(TCHAR)); if (NULL == pRegChoice->szName) { // // Out of memory. Bummer. // LocalFree(pRegChoice); pRegChoice = NULL; break; } lstrcpy(pRegChoice->szName,szLabel); // // Attach new item to end of list // if (NULL == *pChoices) { *pChoices = pRegChoice; } else { pLast->pNext = pRegChoice; } pLast = pRegChoice; } szChoice = _tcschr(szLabel,L'\0'); szChoice++; } while (*szChoice); } else { // // Did not find choices // bRet = FALSE; } } if ( Value ) { LocalFree(Value); Value = NULL; } } if ( pFlags ) { // // query the Flags // *pFlags = NULL; rc = MyRegQueryValue(hKey, (PWSTR)(LPCTSTR)strTmp, SCE_REG_DISPLAY_FLAGLIST, (PVOID *)&Value, &RegType ); if (ERROR_SUCCESS == rc) { if ((REG_MULTI_SZ == RegType) && Value) { LPTSTR szFlag = NULL; LPTSTR szLabel = NULL; // max field size for szFlag + dwVal DWORD dwVal = -1; PREGFLAGS pRegFlag = NULL; PREGFLAGS pLast = NULL; szFlag = Value; do { // // Divide szFlag into dwValue and szLabel sections // szLabel = _tcschr(szFlag,L'|'); *szLabel = L'\0'; szLabel++; dwVal = _ttoi(szFlag); pRegFlag = (PREGFLAGS) LocalAlloc(LPTR,sizeof(REGFLAGS)); if (pRegFlag) { // // Fill in fields of new reg Flag // pRegFlag->dwValue = dwVal; pRegFlag->szName = (LPTSTR) LocalAlloc(LPTR,(lstrlen(szLabel)+1)*sizeof(TCHAR)); if (NULL == pRegFlag->szName) { // // Out of memory. Bummer. // LocalFree(pRegFlag); pRegFlag = NULL; break; } lstrcpy(pRegFlag->szName,szLabel); // // Attach new item to end of list // if (NULL == *pFlags) { *pFlags = pRegFlag; } else { pLast->pNext = pRegFlag; } pLast = pRegFlag; } szFlag = wcschr(szLabel,L'\0'); szFlag++; } while (*szFlag); } else { // // Did not find Flags // bRet = FALSE; } } if ( Value ) { LocalFree(Value); Value = NULL; } } } else { // // did not find the registry key // bRet = FALSE; } if ( hKey ) { RegCloseKey(hKey); } if ( hKey2 ) { RegCloseKey(hKey2); } return bRet; }