|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
Abstract:
Revision history:
--*/
#include <snmp.h>
#include <snmpexts.h>
#include "mibfuncs.h"
extern PSNMP_MGMTVARS ge_pMgmtVars; extern CRITICAL_SECTION g_SnmpMibCriticalSection;
UINT snmpMibGetHandler( UINT actionId, AsnAny *objectArray, UINT *errorIndex) { int i, j, k; LONG nOurSnmpEnableAuthenTraps;
if (ge_pMgmtVars == NULL) return MIB_S_ENTRY_NOT_FOUND;
// get the number of AsnAny structures we have in the MIB's data buffer
// and be careful not too scan further (it might be that there are more
// management variables than objects supported by the MIB).
k = sizeof(SNMPMIB_MGMTVARS) / sizeof(AsnAny);
for (i = 0; k != 0 && i < NC_MAX_COUNT; i++, k--) { if (objectArray[i].asnType == ge_pMgmtVars->AsnCounterPool[i].asnType) { objectArray[i].asnValue = ge_pMgmtVars->AsnCounterPool[i].asnValue; } }
for (j = 0; k != 0 && j < NI_MAX_COUNT; j++, k--) { if (objectArray[i + j].asnType == ge_pMgmtVars->AsnIntegerPool[j].asnType) { if ((i+j) == (NC_MAX_COUNT + IsnmpEnableAuthenTraps)) { // for nOurSnmpEnableAuthenTraps: enabled(1), disabled(0)
// for the output value defined by RFC1213: enabled(1), disabled(2)
nOurSnmpEnableAuthenTraps = ge_pMgmtVars->AsnIntegerPool[j].asnValue.number; objectArray[i + j].asnValue.number = (nOurSnmpEnableAuthenTraps == 0) ? 2 : 1; } else { objectArray[i + j].asnValue = ge_pMgmtVars->AsnIntegerPool[j].asnValue; } } }
return MIB_S_SUCCESS; }
UINT snmpMibSetHandler( UINT actionId, AsnAny *objectArray, UINT *errorIndex) { // this function is called only for one object: snmpEnableAuthenTraps
DWORD dwResult, dwValue , dwValueLen, dwValueType; LONG nOurValue, nInputValue; static HKEY hKey = NULL; static DWORD dwBlocked = 0; // Has Critical Section entered
static BOOL fMatchedValue = FALSE; // Does input SET value match our current value
switch(actionId) { case MIB_ACTION_VALIDATE: { SNMPDBG(( SNMP_LOG_TRACE, "SNMP: SNMPMIB: snmpMibSetHandler: Entered MIB_ACTION_VALIDATE\n"));
// On XP or later, Enter/Leave CriticalSection won't raise
// exception in low memory
EnterCriticalSection(&g_SnmpMibCriticalSection); ++dwBlocked;
// check the type of input set value
if (ge_pMgmtVars->AsnIntegerPool[IsnmpEnableAuthenTraps].asnType != objectArray[NC_MAX_COUNT + IsnmpEnableAuthenTraps].asnType) { SNMPDBG(( SNMP_LOG_ERROR, "SNMP: SNMPMIB: snmpMibSetHandler: invalid type %x.\n", objectArray[NC_MAX_COUNT + IsnmpEnableAuthenTraps].asnType)); return MIB_S_INVALID_PARAMETER; }
nOurValue = ge_pMgmtVars->AsnIntegerPool[IsnmpEnableAuthenTraps].asnValue.number; nInputValue = objectArray[NC_MAX_COUNT + IsnmpEnableAuthenTraps].asnValue.number; // check the range of input set value. enabled(1), disabled(2)
if ( ( nInputValue< 1) || ( nInputValue > 2) ) { SNMPDBG(( SNMP_LOG_ERROR, "SNMP: SNMPMIB: snmpMibSetHandler: invalid value %d.\n", nInputValue));
return MIB_S_INVALID_PARAMETER; }
// ASSERT: nInputValue is either 1 or 2, nOurValue is either 0 or 1
// avoid to set the registry value if it matched the current one.
// for nOurValue: enabled(1), disabled(0)
// for nInputValue: enabled(1), disabled(2)
if ( (nInputValue==nOurValue) || ((nInputValue==2) && (nOurValue==0)) ) { SNMPDBG(( SNMP_LOG_TRACE, "SNMP: SNMPMIB: snmpMibSetHandler: has same value as the current one.\n")); fMatchedValue = TRUE; return MIB_S_SUCCESS; } dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_SNMP_PARAMETERS, 0, KEY_SET_VALUE, &hKey);
if(NO_ERROR != dwResult) { SNMPDBG(( SNMP_LOG_ERROR, "SNMP: SNMPMIB: snmpMibSetHandler: Couldnt open SNMP Parameters key. Error %d.\n", dwResult)); return dwResult; }
return MIB_S_SUCCESS; }
case MIB_ACTION_SET: { SNMPDBG(( SNMP_LOG_TRACE, "SNMP: SNMPMIB: snmpMibSetHandler: Entered MIB_ACTION_SET\n"));
if (fMatchedValue) { // avoid to set the registry value since it matched the current one
fMatchedValue = FALSE; return MIB_S_SUCCESS; }
if (!IsAsnTypeNull(&objectArray[NC_MAX_COUNT + IsnmpEnableAuthenTraps])) { dwValueType = REG_DWORD; dwValueLen = sizeof(DWORD); nInputValue = objectArray[NC_MAX_COUNT + IsnmpEnableAuthenTraps].asnValue.number; dwValue = (nInputValue == 2) ? 0 : 1; // note: the change of registry will cause snmp.exe to refresh
// its configuration from registry.
// Per SnmpExtensionMonitor MSDN doc., an SNMP extension agent
// should not update the memory pointed to by the
// pAgentMgmtData parameter.
dwResult = RegSetValueEx( hKey, REG_VALUE_AUTH_TRAPS, 0, dwValueType, (LPBYTE)&dwValue, dwValueLen); if (NO_ERROR != dwResult) { SNMPDBG(( SNMP_LOG_ERROR, "SNMP: SNMPMIB: snmpMibSetHandler: Couldnt write EnableAuthenticationTraps value. Error %d.\n", dwResult ));
return dwResult; } }
return MIB_S_SUCCESS; }
case MIB_ACTION_CLEANUP: { SNMPDBG(( SNMP_LOG_TRACE, "SNMP: SNMPMIB: snmpMibSetHandler: Entered CLEANUP\n"));
if (hKey) { RegCloseKey(hKey); hKey = NULL; }
if(dwBlocked) { --dwBlocked; // decrement block count before leaving CritSect
LeaveCriticalSection(&g_SnmpMibCriticalSection); }
return MIB_S_SUCCESS; }
default: { SNMPDBG(( SNMP_LOG_TRACE, "SNMP: SNMPMIB: snmpMibSetHandler: Entered WRONG ACTION\n"));
return MIB_S_INVALID_PARAMETER; } } }
|