#ifndef __SNMPEXTDLL_H #define __SNMPEXTDLL_H #include "snmpeer.h" #include namespace Klever { class CSNMPExtDLL : public CSNMPeer { public: HINSTANCE m_hInstance; HANDLE m_hEvent; AsnObjectIdentifier m_OID; BOOL (SNMP_FUNC_TYPE *m_extInit)(DWORD dw,HANDLE h,AsnObjectIdentifier* aoid); BOOL (SNMP_FUNC_TYPE *m_extQuery)(BYTE b,RFC1157VarBindList* rvbl,AsnInteger* ai1,AsnInteger* ai2); BOOL (SNMP_FUNC_TYPE *m_extTrap)(AsnObjectIdentifier*,AsnNetworkAddress*,AsnInteger*,AsnInteger*,AsnTimeticks*,RFC1157VarBindList*); HINSTANCE m_hSNMPAPI; void (SNMP_FUNC_TYPE *m_snmpOIDFree)(AsnObjectIdentifier*); LPVOID (SNMP_FUNC_TYPE *m_snmpAlloc)(UINT); void (SNMP_FUNC_TYPE *m_snmpFree)(LPVOID); void (SNMP_FUNC_TYPE *m_snmpVBLFree)(RFC1157VarBindList* vbl); void InitSNMP() { m_hSNMPAPI = ::LoadLibraryEx("SNMPAPI",NULL,0); if(!m_hSNMPAPI) return; *(FARPROC*)&m_snmpOIDFree = ::GetProcAddress(m_hSNMPAPI,"SnmpUtilOidFree"); *(FARPROC*)&m_snmpAlloc = ::GetProcAddress(m_hSNMPAPI,"SnmpUtilMemAlloc"); *(FARPROC*)&m_snmpFree = ::GetProcAddress(m_hSNMPAPI,"SnmpUtilMemFree"); *(FARPROC*)&m_snmpVBLFree = ::GetProcAddress(m_hSNMPAPI,"SnmpUtilVarBindListFree"); if( (m_snmpFree && !m_snmpAlloc) || (m_snmpAlloc && !m_snmpFree) ) DeinitSNMP(); } void DeinitSNMP() { if(!m_hSNMPAPI) return; ::FreeLibrary(m_hSNMPAPI); m_hSNMPAPI=NULL; } void SNMPFreeOID(AsnObjectIdentifier* oid) { if(m_hSNMPAPI && m_snmpOIDFree) (*m_snmpOIDFree)(oid); else ::GlobalFree((HGLOBAL)oid->ids); } LPVOID SNMPAlloc(UINT size) { if(m_hSNMPAPI && m_snmpAlloc) return (*m_snmpAlloc)(size); else return ::GlobalAlloc(GMEM_FIXED,size); } void SNMPFree(LPVOID addr) { if(m_hSNMPAPI && m_snmpFree) (*m_snmpFree)(addr); else :: GlobalFree((HGLOBAL)addr); } void SNMPFreeVBL(RFC1157VarBindList& vbl) { if(m_hSNMPAPI && m_snmpVBLFree) (*m_snmpVBLFree)(&vbl); else{ for(UINT tmp=0;tmpsizeof(i)) return FALSE; i.s_addr=0; memmove(&i,ip.stream,ip.length); ou.Set(i); return TRUE; } CSNMPExtDLL(LPCTSTR dllName) : m_hInstance(NULL) { InitSNMP(); Init(dllName); } ~CSNMPExtDLL() { Deinit(); DeinitSNMP(); } BOOL Init(LPCTSTR dllName) { Deinit(); m_hInstance = ::LoadLibraryEx(dllName,NULL,0); if(!m_hInstance) return FALSE; *(FARPROC*)&m_extInit = ::GetProcAddress(m_hInstance,"SnmpExtensionInit"); *(FARPROC*)&m_extQuery = ::GetProcAddress(m_hInstance,"SnmpExtensionQuery"); *(FARPROC*)&m_extTrap = ::GetProcAddress(m_hInstance,"SnmpExtensionTrap"); if(!(m_extInit && m_extQuery && m_extTrap)){ Deinit(); return FALSE; } if(!((*m_extInit)(GetCurrentTime(),&m_hEvent,&m_OID))){ Deinit(); return FALSE; } return TRUE; } void Deinit() { if(!m_hInstance) return; ::FreeLibrary(m_hInstance); } virtual BOOL Request(BYTE type,CSNMPVarBindList& in,CSNMPVarBindList& ou) { RFC1157VarBindList vbl; SNMPBuildVBL(vbl,in); AsnInteger errorStatus, errorIndex; (*m_extQuery)(type,&vbl,&errorStatus,&errorIndex); ou.RemoveAll(); SNMPParseVBL(vbl,ou); SNMPFreeVBL(vbl); return TRUE; } }; }; #endif // __SNMPEXTDLL_H