www.pudn.com > snmp.rar > regconf.c


/*++ 
 
Copyright (c) 1992-1996  Microsoft Corporation 
 
Module Name: 
 
    regconf.c 
 
Abstract: 
 
    Registry configuration routines. 
 
Environment: 
 
    User Mode - Win32 
 
Revision History: 
 
    10-May-1996 DonRyan 
        Removed banner from Technology Dynamics, Inc. 
 
--*/ 
  
//--------------------------- WINDOWS DEPENDENCIES -------------------------- 
 
// microsoft has indicated that registry requires unicode strings 
#if 0 
#define UNICODE 
#endif 
 
#include  
#include  
#include  
 
//--------------------------- STANDARD DEPENDENCIES -- #include ---- 
 
#include  
#include  
 
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------ 
 
#include  
#include  
 
#include "regconf.h" 
#include "..\common\evtlog.h" 
#include "..\common\wellknow.h" 
 
 
//--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" ----- 
 
//--------------------------- PUBLIC VARIABLES --(same as in module.h file)-- 
 
CfgExtensionAgents *extAgents   = NULL; 
INT                extAgentsLen = 0; 
 
CfgPermittedManagers *permitMgrs   = NULL; 
INT                  permitMgrsLen = 0; 
 
//--------------------------- PRIVATE CONSTANTS ----------------------------- 
 
// OPENISSUE - microsoft changed this, dont know what it should be? 
#define KEY_TRAVERSE 0 
 
 
//--------------------------- PRIVATE STRUCTS ------------------------------- 
 
//--------------------------- PRIVATE VARIABLES ----------------------------- 
 
static char *pszSnmpSrvEaKey = SNMP_REG_SRV_EAKEY; 
static char *pszSnmpSrvPmKey = SNMP_REG_SRV_PMKEY; 
 
//--------------------------- PRIVATE PROTOTYPES ---------------------------- 
 
//--------------------------- PRIVATE PROCEDURES ---------------------------- 
 
 
BOOL eaConfig( 
    OUT CfgExtensionAgents   **extAgents, 
    OUT INT *extAgentsLen) 
    { 
    LONG  status; 
    HKEY  hkResult; 
    HKEY  hkResult2; 
    DWORD iValue; 
    DWORD iValue2; 
//    DWORD dwTitle; 
    DWORD dwType; 
    TCHAR dummy[MAX_PATH+1]; 
    DWORD dummySize; 
    TCHAR value[MAX_PATH+1]; 
    DWORD valueSize; 
    LPSTR pTemp; 
    DWORD valueReqSize; 
    LPSTR pTempExp; 
 
    *extAgents = NULL; 
    *extAgentsLen = 0; 
 
    SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: loading extension agents.\n")); 
 
    if ((status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszSnmpSrvEaKey, 
                               0, (KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | 
                               KEY_TRAVERSE), &hkResult)) != ERROR_SUCCESS) 
        { 
        SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d opening ExtensionAgents subkey.\n", status)); 
        SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvEaKey, status); 
        return FALSE; 
        } 
 
    iValue = 0; 
 
    dummySize = MAX_PATH; 
    valueSize = MAX_PATH; 
 
 
    while((status = RegEnumValue(hkResult, iValue, dummy, &dummySize, 
                                 NULL, &dwType, (LPBYTE)value, &valueSize)) 
          != ERROR_NO_MORE_ITEMS) 
        { 
        if (status != ERROR_SUCCESS) 
            { 
            SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d enumerating ExtensionAgents subkey.\n", status)); 
            SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvEaKey, status); 
            RegCloseKey(hkResult); 
            return FALSE; 
            } 
 
        SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: processing %s.\n", value)); 
        if ((status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, value, 0, 
                                   (KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS 
                              | KEY_TRAVERSE), &hkResult2)) != ERROR_SUCCESS) 
            { 
            SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d opening registy key %s.\n", status, value)); 
            pTemp = value; // make pointer for event api 
            SnmpSvcReportEvent(SNMP_EVENT_INVALID_EXTENSION_AGENT_KEY, 1, &pTemp, status); 
            goto process_next; // ignore bogus registry key and process next one... 
            } 
 
        iValue2 = 0; 
 
        dummySize = MAX_PATH; 
        valueSize = MAX_PATH; 
 
        while((status = RegEnumValue(hkResult2, iValue2, dummy, &dummySize, 
                                     NULL, &dwType, (LPBYTE)value, &valueSize)) 
              != ERROR_NO_MORE_ITEMS) 
            { 
            if (status != ERROR_SUCCESS) 
                { 
                SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d enumerating registry key %s.\n", status, value)); 
                pTemp = value; // make pointer for event api 
                SnmpSvcReportEvent(SNMP_EVENT_INVALID_EXTENSION_AGENT_KEY, 1, &pTemp, status); 
                break; // ignore bogus registry key and process next one... 
                } 
 
            if (!lstrcmpi(dummy, TEXT("Pathname"))) 
                { 
                (*extAgentsLen)++; 
                *extAgents = (CfgExtensionAgents *) SnmpUtilMemReAlloc(*extAgents, 
                    (*extAgentsLen * sizeof(CfgExtensionAgents))); 
 
                pTemp = (LPSTR)SnmpUtilMemAlloc(valueSize+1); 
#ifdef UNICODE 
                SnmpUtilUnicodeToAnsi(&pTemp, value, FALSE); 
#else 
                memcpy(pTemp, value, valueSize+1); 
#endif 
 
                valueReqSize = valueSize + 10; 
                pTempExp = NULL; 
                do { 
                    pTempExp = (LPSTR)SnmpUtilMemReAlloc(pTempExp, valueReqSize); 
                    valueSize = valueReqSize; 
                    valueReqSize = ExpandEnvironmentStringsA( 
                                          pTemp, 
                                          pTempExp, 
                                          valueSize); 
 
                } while (valueReqSize > valueSize ); 
                if (valueReqSize == 0) { 
                    SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: error %d expanding %s.\n", GetLastError(), value)); 
                    (*extAgents)[(*extAgentsLen)-1].pathName = pTemp; 
                } else { 
                    SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: processing %s.\n", pTempExp)); 
                    (*extAgents)[(*extAgentsLen)-1].pathName = pTempExp; 
                    SnmpUtilMemFree(pTemp); 
                } 
 
                break; 
                } 
 
            dummySize = MAX_PATH; 
            valueSize = MAX_PATH; 
 
            iValue2++; 
            } // end while() 
 
        RegCloseKey(hkResult2); 
 
process_next: 
 
        dummySize = MAX_PATH; 
        valueSize = MAX_PATH; 
 
        iValue++; 
        } // end while() 
 
    RegCloseKey(hkResult); 
 
    return TRUE; 
 
    } // end eaConfig() 
 
 
BOOL pmConfig( 
    OUT CfgPermittedManagers **permitMgrs, 
    OUT INT *permitMgrsLen) 
    { 
    LONG  status; 
    HKEY  hkResult; 
    DWORD iValue; 
//    DWORD dwTitle; 
    DWORD dwType; 
    TCHAR dummy[MAX_PATH+1]; 
    DWORD dummySize; 
    TCHAR value[MAX_PATH+1]; 
    DWORD valueSize; 
    LPSTR pTemp; 
 
    *permitMgrs = NULL; 
    *permitMgrsLen = 0; 
 
    SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: loading permitted managers.\n")); 
 
    if ((status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszSnmpSrvPmKey, 
                               0, (KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | 
                               KEY_TRAVERSE), &hkResult)) != ERROR_SUCCESS) 
        { 
        SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d opening PermittedManagers subkey.\n", status)); 
        SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvPmKey, status); 
        return FALSE; 
        } 
 
    iValue = 0; 
 
    dummySize = MAX_PATH; 
    valueSize = MAX_PATH; 
 
    while((status = RegEnumValue(hkResult, iValue, dummy, &dummySize, 
                                 NULL, &dwType, (LPBYTE)value, &valueSize)) 
          != ERROR_NO_MORE_ITEMS) 
        { 
        if (status != ERROR_SUCCESS) 
            { 
            SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d enumerating PermittedManagers subkey.\n", status)); 
            SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvPmKey, status); 
            RegCloseKey(hkResult); 
            return FALSE; 
            } 
 
        SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: processing permitted manager %s\n", value)); 
        (*permitMgrsLen)++; 
        *permitMgrs = (CfgPermittedManagers *)SnmpUtilMemReAlloc(*permitMgrs, 
            (*permitMgrsLen * sizeof(CfgPermittedManagers))); 
 
        pTemp = (LPSTR)SnmpUtilMemAlloc(valueSize+1); 
        value[valueSize] = TEXT('\0'); 
#ifdef UNICODE 
        SnmpUtilUnicodeToAnsi(&pTemp, value, FALSE); 
#else 
        memcpy(pTemp, value, valueSize+1); 
#endif 
 
        (*permitMgrs)[iValue].addrText = pTemp; 
        SnmpSvcAddrToSocket((*permitMgrs)[iValue].addrText, 
                     &((*permitMgrs)[iValue].addrEncoding)); 
 
        dummySize = MAX_PATH; 
        valueSize = MAX_PATH; 
 
        iValue++; 
        } 
 
    RegCloseKey(hkResult); 
 
    return TRUE; 
 
    } // end pmConfig() 
 
 
//--------------------------- PUBLIC PROCEDURES ----------------------------- 
 
 
BOOL regconf(VOID) 
    { 
    SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: reading registry parameters.\n")); 
    if (pmConfig(&permitMgrs, &permitMgrsLen) && 
        eaConfig(&extAgents,  &extAgentsLen)) { 
 
        SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: registry parameters successfully read.\n")); 
        return TRUE; 
    } 
    else 
    { 
        SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: unable to successfully read registry parameters.\n")); 
        return FALSE; 
    } 
 
    } // end regconf() 
 
 
//-------------------------------- END --------------------------------------