From 955d4e00adc9f39ab93bf21f07506eb75b013c70 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Mon, 05 Jul 2004 01:53:09 +0000 Subject: initial commit into svn repository git-svn-id: http://svn.klever.net/kin/T42/trunk@1 fe716a7a-6dde-0310-88d9-d003556173a8 --- (limited to 'shared-code/SNMPExtDll.h') diff --git a/shared-code/SNMPExtDll.h b/shared-code/SNMPExtDll.h new file mode 100644 index 0000000..14c920d --- a/dev/null +++ b/shared-code/SNMPExtDll.h @@ -0,0 +1,252 @@ +#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 -- cgit v0.9.0.2