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 -------------------------- 
 
#include  
#include  
#include  
 
//--------------------------- STANDARD DEPENDENCIES -- #include ---- 
 
#include  
#include  
 
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------ 
 
#include  
#include  
 
#include "regconf.h" 
#include "evtlog.h" 
#include "wellknow.h" 
 
 
//--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" ----- 
 
//--------------------------- PUBLIC VARIABLES --(same as in module.h file)-- 
 
BOOL                enableAuthTraps = FALSE; 
 
CfgTrapDestinations *trapDests   = NULL; 
INT                 trapDestsLen = 0; 
 
CfgValidCommunities *validComms   = NULL; 
INT                 validCommsLen = 0; 
 
//--------------------------- PRIVATE CONSTANTS ----------------------------- 
 
#define KEY_TRAVERSE 0 
 
//--------------------------- PRIVATE STRUCTS ------------------------------- 
 
//--------------------------- PRIVATE VARIABLES ----------------------------- 
 
static char *pszSnmpSrvTeKey = SNMP_REG_SRV_TEKEY; 
static char *pszSnmpSrvTdKey = SNMP_REG_SRV_TDKEY; 
static char *pszSnmpSrvVcKey = SNMP_REG_SRV_VCKEY; 
 
//--------------------------- PRIVATE PROTOTYPES ---------------------------- 
 
//--------------------------- PRIVATE PROCEDURES ---------------------------- 
 
// configure trap destinations 
BOOL tdConfig( 
    OUT CfgTrapDestinations **trapDests, 
    OUT INT *trapDestsLen) 
    { 
    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 dwValue; 
 
    *trapDests = NULL; 
    *trapDestsLen = 0; 
 
    SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: loading trap destinations.\n")); 
    enableAuthTraps = FALSE; 
 
    if ((status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszSnmpSrvTeKey, 
                               0, (KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | 
                               KEY_TRAVERSE), &hkResult)) != ERROR_SUCCESS) 
        { 
        SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d opening EnableAuthenticationTraps subkey.\n",status)); 
        SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvTeKey, status); 
        return FALSE; 
        } 
 
    iValue = 0; 
 
    dummySize = MAX_PATH; 
    valueSize = MAX_PATH; 
 
    if ((status = RegEnumValue(hkResult, iValue, dummy, &dummySize, 
                               NULL, &dwType, (LPBYTE)&dwValue, &valueSize)) 
        != ERROR_SUCCESS) 
        { 
        SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d enumerating EnableAuthenticationTraps subkey.\n",status)); 
        SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvTeKey, status); 
        RegCloseKey(hkResult); 
        return FALSE; 
        } 
 
    enableAuthTraps = dwValue ? TRUE : FALSE; 
 
    RegCloseKey(hkResult); 
 
 
    if ((status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,  pszSnmpSrvTdKey, 
                               0, (KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | 
                               KEY_TRAVERSE), &hkResult)) != ERROR_SUCCESS) 
        { 
        SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d opening TrapConfiguration subkey.\n",status)); 
        SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvTdKey, status); 
        return FALSE; 
        } 
 
    // traverse over keys... 
 
    iValue = 0; 
 
    valueSize = MAX_PATH; 
 
    while((status = RegEnumKey(hkResult, iValue, value, MAX_PATH)) != 
          ERROR_NO_MORE_ITEMS) 
        { 
        if (status != ERROR_SUCCESS) 
            { 
            SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d enumerating TrapConfiguration subkey.\n",status)); 
            SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvTdKey, status); 
            return FALSE; 
            } 
 
        // save community name and init empty addr list here... 
 
        (*trapDestsLen)++; 
        if ((*trapDests = (CfgTrapDestinations *)SnmpUtilMemReAlloc(*trapDests, 
          (*trapDestsLen * sizeof(CfgTrapDestinations)))) == NULL) { 
            SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: out of memory.\n")); 
            SnmpSvcReportEvent(SNMP_EVENT_FATAL_ERROR, 0, NULL, ERROR_NOT_ENOUGH_MEMORY); 
            return(FALSE); 
        } 
 
        if ((pTemp = (LPSTR)SnmpUtilMemAlloc(valueSize+1)) == NULL) { 
            SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: out of memory.\n")); 
            SnmpSvcReportEvent(SNMP_EVENT_FATAL_ERROR, 0, NULL, ERROR_NOT_ENOUGH_MEMORY); 
            return(FALSE); 
        } 
        value[valueSize] = TEXT('\0'); 
#ifdef UNICODE 
        SnmpUtilUnicodeToAnsi(&pTemp, value, FALSE); 
#else 
        memcpy(pTemp, value, valueSize+1); 
#endif 
 
        SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: processing community %s\n", pTemp)); 
        (*trapDests)[iValue].communityName = pTemp; 
        (*trapDests)[iValue].addrLen       = 0; 
        (*trapDests)[iValue].addrList      = NULL; 
 
        if ((status = RegOpenKeyEx(hkResult, value, 0, (KEY_QUERY_VALUE | 
                                   KEY_ENUMERATE_SUB_KEYS | KEY_TRAVERSE), 
                                   &hkResult2)) != ERROR_SUCCESS) 
            { 
            SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d opening %s subkey.\n", status, value)); 
            pTemp = value; // make pointer for event api 
            SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pTemp, status); 
            return FALSE; 
            } 
 
        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 %s subkey.\n", status, value)); 
                pTemp = value; // make pointer for event api 
                SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pTemp, status); 
                return FALSE; 
                } 
 
            (*trapDests)[iValue].addrLen++; 
            if (((*trapDests)[iValue].addrList = 
              (AdrList *)SnmpUtilMemReAlloc((*trapDests)[iValue].addrList, 
              ((*trapDests)[iValue].addrLen * sizeof(AdrList)))) == NULL) { 
                SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: out of memory.\n")); 
                SnmpSvcReportEvent(SNMP_EVENT_FATAL_ERROR, 0, NULL, ERROR_NOT_ENOUGH_MEMORY); 
                return(FALSE); 
            } 
 
            if ((pTemp = (LPSTR)SnmpUtilMemAlloc(valueSize+1)) == NULL) { 
                SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: out of memory.\n")); 
                SnmpSvcReportEvent(SNMP_EVENT_FATAL_ERROR, 0, NULL, ERROR_NOT_ENOUGH_MEMORY); 
                return(FALSE); 
            } 
            value[valueSize] = TEXT('\0'); 
#ifdef UNICODE 
            SnmpUtilUnicodeToAnsi(&pTemp, value, FALSE); 
#else 
            memcpy(pTemp, value, valueSize+1); 
#endif 
 
            SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: processing trap destination %s\n", pTemp)); 
            (*trapDests)[iValue].addrList[(*trapDests)[iValue].addrLen-1].addrText = pTemp; 
 
            if (!SnmpSvcAddrToSocket((*trapDests)[iValue].addrList[(*trapDests)[iValue].addrLen-1].addrText, 
                &((*trapDests)[iValue].addrList[(*trapDests)[iValue].addrLen-1].addrEncoding))) { 
 
                (*trapDests)[iValue].addrLen--; 
                if (((*trapDests)[iValue].addrList = 
                  (AdrList *)SnmpUtilMemReAlloc((*trapDests)[iValue].addrList, 
                  ((*trapDests)[iValue].addrLen * sizeof(AdrList)))) == NULL) { 
                    SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: out of memory.\n")); 
                    SnmpSvcReportEvent(SNMP_EVENT_FATAL_ERROR, 0, NULL, ERROR_NOT_ENOUGH_MEMORY); 
                    return(FALSE); 
                } 
 
                SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: invalid trap destination %s.\n", pTemp)); 
                SnmpSvcReportEvent(SNMP_EVENT_INVALID_TRAP_DESTINATION, 1, &pTemp, NO_ERROR); 
                SnmpUtilMemFree(pTemp); 
            } 
 
            dummySize = MAX_PATH; 
            valueSize = MAX_PATH; 
 
            iValue2++; 
            } 
 
        valueSize = MAX_PATH; 
 
        iValue++; 
        } 
 
    return TRUE; 
 
    } // end tdConfig() 
 
 
BOOL vcConfig( 
    OUT CfgValidCommunities  **validComms, 
    OUT INT *validCommsLen) 
    { 
    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; 
 
    *validComms = NULL; 
    *validCommsLen = 0; 
 
    SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: loading valid communities.\n")); 
 
    if ((status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszSnmpSrvVcKey, 
                               0, (KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | 
                               KEY_TRAVERSE), &hkResult)) != ERROR_SUCCESS) 
        { 
        SNMPDBG((SNMP_LOG_ERROR, "SNMP: INIT: error %d opening ValidCommunities subkey.\n", status)); 
        SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvVcKey, 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 ValidCommunities subkey.\n", status)); 
            SnmpSvcReportEvent(SNMP_EVENT_INVALID_REGISTRY_KEY, 1, &pszSnmpSrvVcKey, status); 
            RegCloseKey(hkResult); 
            return FALSE; 
            } 
 
        SNMPDBG((SNMP_LOG_TRACE, "SNMP: INIT: processing community %s\n", value)); 
        (*validCommsLen)++; 
        *validComms = (CfgValidCommunities *)SnmpUtilMemReAlloc(*validComms, 
            (*validCommsLen * sizeof(CfgValidCommunities))); 
 
        pTemp = (LPSTR)SnmpUtilMemAlloc(valueSize+1); 
        value[valueSize] = TEXT('\0'); 
#ifdef UNICODE 
        SnmpUtilUnicodeToAnsi(&pTemp, value, FALSE); 
#else 
        memcpy(pTemp, value, valueSize+1); 
#endif 
 
        (*validComms)[iValue].communityName = pTemp; 
 
        dummySize = MAX_PATH; 
        valueSize = MAX_PATH; 
 
        iValue++; 
        } 
 
    RegCloseKey(hkResult); 
 
    return TRUE; 
 
    } // end vcConfig() 
 
//-------------------------------- END --------------------------------------