#include "stdafx.h" #include "elem.h" CElem::CElem() { m_hKey = NULL; m_index = 0; m_ip = _T(""); m_name = _T(""); m_value = _T(""); } CElem::~CElem() { if (m_hKey) RegCloseKey(m_hKey); } BOOL CElem::OpenReg(LPCTSTR szSubKey) { BOOL fReturn = FALSE; LONG err = ERROR_SUCCESS; err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_READ, &m_hKey); if (ERROR_SUCCESS == err) { fReturn = TRUE; } else { m_hKey = NULL; if ( err != ERROR_FILE_NOT_FOUND ) {iisDebugOut((LOG_TYPE_ERROR, _T("CElem::OpenReg(): %s. FAILED. code=0x%x\n"), szSubKey, err));} } return (fReturn); } void CElem::CloseReg() { if (m_hKey) { RegCloseKey(m_hKey); m_hKey = NULL; } } BOOL CElem::GetNext() { BOOL fReturn = FALSE; LONG err = ERROR_SUCCESS; TCHAR szBufferL[_MAX_PATH], szBufferR[_MAX_PATH]; DWORD dwBufferL = _MAX_PATH, dwBufferR = _MAX_PATH; err = RegEnumValue(m_hKey, m_index, szBufferL, &dwBufferL, NULL, NULL, (LPBYTE)szBufferR, &dwBufferR); if (err == ERROR_SUCCESS) { LPTSTR token; m_index++; m_value = szBufferR; token = _tcstok(szBufferL, _T(",")); if (token) { m_name = token; token = _tcstok(NULL, _T(",")); if (token) { m_ip = token; } else { m_ip = _T("null"); } fReturn = TRUE; } m_name.MakeLower(); m_value.MakeLower(); // // m_name looks like = /scripts // m_value looks like = c:\inetpub\scripts,,4 // // m_value could look like anything // c: // c:\stuff // c:\whatevers\ // who knows what they put in there. // we need to make sure it look like a fully qualified path though. // // Get the first Value before the comma int iWhere = 0; iWhere = m_value.Find(_T(',')); if (-1 != iWhere) { CString BeforeComma; CString AfterComma; // there is a ',' in the string BeforeComma = m_value.Left(iWhere); // Get the after comma vlues AfterComma = m_value.Right( m_value.GetLength() - iWhere); TCHAR thefilename[_MAX_PATH]; TCHAR thepath[_MAX_PATH]; TCHAR * pmypath; if ( BeforeComma.GetLength() >= ( sizeof(thefilename) / sizeof( TCHAR ) ) ) { fReturn = FALSE; } else { _tcscpy(thefilename, BeforeComma.GetBuffer(0) ); // make sure the left side is a valid directory name! if (0 != GetFullPathName(thefilename, _MAX_PATH, thepath, &pmypath)) { BeforeComma = thepath; } // reconcatenate them m_value = BeforeComma; m_value += AfterComma; } } } else { if ( err != ERROR_FILE_NOT_FOUND && err != ERROR_NO_MORE_ITEMS) { iisDebugOut((LOG_TYPE_WARN, _T("CElem::GetNext(): FAILED. code=0x%x\n"), err)); } } return (fReturn); } void CElem::ReadRegVRoots(LPCTSTR szSubKey, CMapStringToOb *pMap) { if ( OpenReg(szSubKey) ) { while (GetNext()) { Add(pMap); } CloseReg(); } } void CElem::Add(CMapStringToOb *pMap) { CObject *pObj; CMapStringToString *pNew; if (pMap->Lookup(m_ip, pObj) == TRUE) { pNew = (CMapStringToString*)pObj; pNew->SetAt(m_name, m_value); } else { pNew = new CMapStringToString; if ( pNew ) { pNew->SetAt(m_name, m_value); pMap->SetAt(m_ip, (CObject*)pNew); } } }