www.pudn.com > SuperSnmp.rar > SuperSnmp.cpp
// SuperSnmp.cpp : Defines the initialization routines for the DLL. // #include "stdafx.h" #include#include #include "SuperSnmp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////// // // // Note! // // If this DLL is dynamically linked against the MFC // DLLs, any functions exported from this DLL which // call into MFC must have the AFX_MANAGE_STATE macro // added at the very beginning of the function. // // For example: // // extern "C" BOOL PASCAL EXPORT ExportedFunction() // { // AFX_MANAGE_STATE(AfxGetStaticModuleState()); // // normal function body here // } // // It is very important that this macro appear in each // function, prior to any calls into MFC. This means that // it must appear as the first statement within the // function, even before any object variable declarations // as their constructors may generate calls into the MFC // DLL. // // Please see MFC Technical Notes 33 and 58 for additional // details. // ///////////////////////////////////////////////////////////////////////////// // CSuperSnmpApp BEGIN_MESSAGE_MAP(CSuperSnmpApp, CWinApp) //{{AFX_MSG_MAP(CSuperSnmpApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSuperSnmpApp construction CSuperSnmpApp::CSuperSnmpApp() { } CSuperSnmpApp::~CSuperSnmpApp() { // TODO: Add your specialized code here and/or call the base class } ///////////////////////////////////////////////////////////////////////////// // The one and only CSuperSnmpApp object CSuperSnmpApp theApp; __declspec(dllexport) void __stdcall JustSoSo() { MessageBox(NULL,"It's so easy!","Test",MB_OK); } bool ValidParamCheck(char *sagent,char *soid,char *scommunity,int timeout,int retries, char *sobjcnt,char *sobjname,char *sobjdata,char *srtnmsg, int nmaxobjcnt,int nmaxbuflen,int &nobjcnt,int &nrtn) { if (sagent == NULL) { nrtn = -101; return false; } if (soid == NULL) { nrtn = -102; return false; } if (scommunity == NULL) { nrtn = -103; return false; } if (sobjcnt == NULL) { nrtn = -106; return false; } if (sobjname == NULL) { nrtn = -107; return false; } if (sobjdata == NULL) { nrtn = -108; return false; } if (srtnmsg == NULL) { nrtn = -109; return false; } if (strlen(sagent) == 0 || strlen(sagent) > 99) { nrtn = -201; return false; } if (strlen(soid) == 0 || strlen(soid) > 99) { nrtn = -202; return false; } if (strlen(scommunity) == 0 || strlen(scommunity) > 99) { nrtn = -203; return false; } if (timeout < 0) { nrtn = -204; return false; } if (retries < 0) { nrtn = -205; return false; } if (nmaxobjcnt <= 0) { nrtn = -210; return false; } if (nmaxbuflen <= 0) { nrtn = -211; return false; } nobjcnt = 0; nrtn = 0; return true; } bool CheckAsnValueValid(RFC1157VarBindList &VarBind) { bool bRtn = false; switch(VarBind.list[0].value.asnType) { case ASN_INTEGER32: bRtn = true; break; case ASN_UNSIGNED32: bRtn = true; break; case ASN_COUNTER64: bRtn = true; break; case ASN_OCTETSTRING: if (VarBind.list[0].value.asnValue.string.length > 0) bRtn = true; break; case ASN_BITS: if (VarBind.list[0].value.asnValue.bits.length > 0) bRtn = true; break; case ASN_OBJECTIDENTIFIER: if (VarBind.list[0].value.asnValue.object.idLength > 0) bRtn = true; break; case ASN_SEQUENCE: if (VarBind.list[0].value.asnValue.sequence.length > 0) bRtn = true; break; case ASN_IPADDRESS: if (VarBind.list[0].value.asnValue.address.length > 0) bRtn = true; break; case ASN_COUNTER32: bRtn = true; break; case ASN_GAUGE32: bRtn = true; break; case ASN_TIMETICKS: bRtn = true; break; case ASN_OPAQUE: if (VarBind.list[0].value.asnValue.arbitrary.length > 0) bRtn = true; break; } return bRtn; } void GetAsnValueValue(RFC1157VarBindList &VarBind,char *sTmpObjName,char *sTmpObjData, int &nTmpObjNameLen,int &nTmpObjDataLen) { char *namestring = NULL; SnmpMgrOidToStr(&VarBind.list[0].name, &namestring); if (namestring) { nTmpObjNameLen = strlen(namestring); memcpy(sTmpObjName,namestring,nTmpObjNameLen); SNMP_free(namestring); } switch(VarBind.list[0].value.asnType) { case ASN_INTEGER32: sprintf(sTmpObjData,"%d",VarBind.list[0].value.asnValue.number); nTmpObjDataLen = strlen(sTmpObjData); break; case ASN_UNSIGNED32: sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.unsigned32); nTmpObjDataLen = strlen(sTmpObjData); break; case ASN_COUNTER64: break; case ASN_COUNTER32: sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.counter); nTmpObjDataLen = strlen(sTmpObjData); break; case ASN_GAUGE32: sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.gauge); nTmpObjDataLen = strlen(sTmpObjData); break; case ASN_TIMETICKS: sprintf(sTmpObjData,"%u",VarBind.list[0].value.asnValue.ticks); nTmpObjDataLen = strlen(sTmpObjData); break; case ASN_OCTETSTRING: nTmpObjDataLen = VarBind.list[0].value.asnValue.string.length; memcpy(sTmpObjData,VarBind.list[0].value.asnValue.string.stream,nTmpObjDataLen); break; case ASN_BITS: nTmpObjDataLen = VarBind.list[0].value.asnValue.bits.length; memcpy(sTmpObjData,VarBind.list[0].value.asnValue.bits.stream,nTmpObjDataLen); break; case ASN_SEQUENCE: nTmpObjDataLen = VarBind.list[0].value.asnValue.sequence.length; memcpy(sTmpObjData,VarBind.list[0].value.asnValue.sequence.stream,nTmpObjDataLen); break; case ASN_IPADDRESS: nTmpObjDataLen = VarBind.list[0].value.asnValue.address.length; memcpy(sTmpObjData,VarBind.list[0].value.asnValue.address.stream,nTmpObjDataLen); break; case ASN_OPAQUE: nTmpObjDataLen = VarBind.list[0].value.asnValue.arbitrary.length; memcpy(sTmpObjData,VarBind.list[0].value.asnValue.arbitrary.stream,nTmpObjDataLen); break; case ASN_OBJECTIDENTIFIER: char *ObjIDString = NULL; SnmpMgrOidToStr(&VarBind.list[0].value.asnValue.object, &ObjIDString); if (ObjIDString) { nTmpObjDataLen = strlen(ObjIDString); memcpy(sTmpObjData,ObjIDString,nTmpObjDataLen); SNMP_free(ObjIDString); } break; } } __declspec(dllexport) void __stdcall GetParamSingle( char *sagent,char *soid,char *scommunity,int timeout,int retries, char *sobjcnt,char *sobjname,char *sobjdata,char *srtnmsg, int nmaxobjcnt,int nmaxbuflen,int &nobjcnt,int &nrtn) { nrtn = 1; if (!ValidParamCheck(sagent,soid,scommunity,timeout,retries, sobjcnt,sobjname,sobjdata,srtnmsg, nmaxobjcnt,nmaxbuflen,nobjcnt,nrtn)) return; char sMsg[1000]; char s_agent[100]; char s_oid[100]; char s_community[100]; RFC1157VarBindList variableBindings; LPSNMP_MGR_SESSION session; memset(s_agent,0,100); strcat(s_agent,sagent); memset(s_oid,0,100); strcat(s_oid,soid); memset(s_community,0,100); strcat(s_community,scommunity); char sTmpObjName[10000]; char sTmpObjData[10000]; char sTmpObjCnt[10]; int nTmpObjNameLen,nTmpObjDataLen,sTmpObjCntLen; int nCurObjCnt = 0; int nCurObjCntLen = 0; int nCurObjNameLen = 0; int nCurObjDataLen = 0; int nCurRtnMsgLen = 0; int nLen = 0; BYTE requestType; AsnInteger errorStatus; AsnInteger errorIndex; variableBindings.list = NULL; variableBindings.len = 0; AsnObjectIdentifier reqObject; if (!SnmpMgrStrToOid(s_oid, &reqObject)) { sprintf(sMsg,"Error: Invalid oid, %s, specified", s_oid); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; return; } else { variableBindings.len++; variableBindings.list = (RFC1157VarBind *)SNMP_realloc(variableBindings.list, sizeof(RFC1157VarBind) * variableBindings.len); if ((variableBindings.list) == NULL) { sprintf(sMsg,"Error: Error allocating oid, %s",s_oid); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; return; } variableBindings.list[variableBindings.len - 1].name = reqObject; variableBindings.list[variableBindings.len - 1].value.asnType = ASN_NULL; } session = SnmpMgrOpen(s_agent, s_community, timeout, retries); if ((session) == NULL) { sprintf(sMsg,"Error on SnmpMgrOpen errorno %d", GetLastError()); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; return; } AsnObjectIdentifier root; SnmpUtilOidCpy(&root, &variableBindings.list[0].name); requestType = ASN_RFC1157_GETREQUEST; if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex)) { sprintf(sMsg,"Error on SnmpMgrRequest %d", GetLastError()); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; } else { if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME || SnmpUtilOidNCmp(&variableBindings.list[0].name, &root, root.idLength)) { sprintf(sMsg,"End of MIB subtree"); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; } else { if (errorStatus > 0) { sprintf(sMsg,"Error: errorStatus=%d, errorIndex=%d",errorStatus, errorIndex); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; } else if (CheckAsnValueValid(variableBindings)) { memset(sTmpObjName,0,10000); memset(sTmpObjData,0,10000); nTmpObjNameLen = 0; nTmpObjDataLen = 0; GetAsnValueValue(variableBindings,sTmpObjName,sTmpObjData,nTmpObjNameLen,nTmpObjDataLen); memset(sTmpObjCnt,0,10); sprintf(sTmpObjCnt,"%d",nTmpObjDataLen); sTmpObjCntLen = strlen(sTmpObjCnt); if (nCurObjCnt >= nmaxobjcnt || nCurObjDataLen + nTmpObjDataLen >= nmaxbuflen || nCurObjNameLen + nTmpObjNameLen >= nmaxbuflen || nCurObjCntLen + sTmpObjCntLen >= nmaxbuflen) { } else { memcpy(sobjcnt + nCurObjCntLen,sTmpObjCnt,strlen(sTmpObjCnt)); memcpy(sobjname + nCurObjNameLen,sTmpObjName,nTmpObjNameLen); memcpy(sobjdata + nCurObjDataLen,sTmpObjData,nTmpObjDataLen); nCurObjCnt ++; nCurObjCntLen += strlen(sTmpObjCnt); nCurObjNameLen += nTmpObjNameLen; nCurObjDataLen += nTmpObjDataLen; nobjcnt = nCurObjCnt; nrtn = 0; } } } } SnmpUtilVarBindListFree(&variableBindings); SnmpUtilOidFree(&root); SnmpMgrClose(session); } __declspec(dllexport) void __stdcall GetParamMulti( char *sagent,char *soid,char *scommunity,int timeout,int retries, char *sobjcnt,char *sobjname,char *sobjdata,char *srtnmsg, int nmaxobjcnt,int nmaxbuflen,int &nobjcnt,int &nrtn) { nrtn = 1; if (!ValidParamCheck(sagent,soid,scommunity,timeout,retries, sobjcnt,sobjname,sobjdata,srtnmsg, nmaxobjcnt,nmaxbuflen,nobjcnt,nrtn)) return; char sMsg[1000]; char s_agent[100]; char s_oid[100]; char s_community[100]; RFC1157VarBindList variableBindings; LPSNMP_MGR_SESSION session; memset(s_agent,0,100); strcat(s_agent,sagent); memset(s_oid,0,100); strcat(s_oid,soid); memset(s_community,0,100); strcat(s_community,scommunity); char sTmpObjName[10000]; char sTmpObjData[10000]; char sTmpObjCnt[10]; int nTmpObjNameLen,nTmpObjDataLen,sTmpObjCntLen; int nCurObjCnt = 0; int nCurObjCntLen = 0; int nCurObjNameLen = 0; int nCurObjDataLen = 0; int nCurRtnMsgLen = 0; int nLen = 0; BYTE requestType; AsnInteger errorStatus; AsnInteger errorIndex; variableBindings.list = NULL; variableBindings.len = 0; AsnObjectIdentifier reqObject; if (!SnmpMgrStrToOid(s_oid, &reqObject)) { sprintf(sMsg,"Error: Invalid oid, %s, specified", s_oid); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; return; } else { variableBindings.len++; variableBindings.list = (RFC1157VarBind *)SNMP_realloc(variableBindings.list, sizeof(RFC1157VarBind) * variableBindings.len); if ((variableBindings.list) == NULL) { sprintf(sMsg,"Error: Error allocating oid, %s",s_oid); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; return; } variableBindings.list[variableBindings.len - 1].name = reqObject; variableBindings.list[variableBindings.len - 1].value.asnType = ASN_NULL; } session = SnmpMgrOpen(s_agent, s_community, timeout, retries); if ((session) == NULL) { sprintf(sMsg,"Error on SnmpMgrOpen errorno %d", GetLastError()); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; return; } AsnObjectIdentifier root; AsnObjectIdentifier tempOid; SnmpUtilOidCpy(&root, &variableBindings.list[0].name); requestType = ASN_RFC1157_GETNEXTREQUEST; bool bContinue = true; while(1) { if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex)) { if (nCurObjCnt > 0) sprintf(sMsg,"||Error on SnmpMgrRequest %d", GetLastError()); else sprintf(sMsg,"Error on SnmpMgrRequest %d", GetLastError()); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; if (nCurObjCnt > 0) nrtn = 0; break; } else { if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME || SnmpUtilOidNCmp(&variableBindings.list[0].name, &root, root.idLength)) { if (nCurObjCnt > 0) sprintf(sMsg,"||End of MIB subtree"); else sprintf(sMsg,"End of MIB subtree"); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; if (nCurObjCnt > 0) nrtn = 0; break; } else { if (errorStatus > 0) { if (nCurObjCnt > 0) sprintf(sMsg,"Error: errorStatus=%d, errorIndex=%d",errorStatus, errorIndex); else sprintf(sMsg,"||Error: errorStatus=%d, errorIndex=%d",errorStatus, errorIndex); nLen = strlen(sMsg); if (nLen + nCurRtnMsgLen < nmaxbuflen) { strcat(srtnmsg,sMsg); nCurRtnMsgLen += nLen; } nrtn = -1; if (nCurObjCnt > 0) nrtn = 0; break; } else if (CheckAsnValueValid(variableBindings)) { memset(sTmpObjName,0,10000); memset(sTmpObjData,0,10000); nTmpObjNameLen = 0; nTmpObjDataLen = 0; GetAsnValueValue(variableBindings,sTmpObjName,sTmpObjData,nTmpObjNameLen,nTmpObjDataLen); memset(sTmpObjCnt,0,10); sprintf(sTmpObjCnt,"%d",nTmpObjDataLen); sTmpObjCntLen = strlen(sTmpObjCnt); if (nCurObjCnt >= nmaxobjcnt || nCurObjDataLen + nTmpObjDataLen + 2 >= nmaxbuflen || nCurObjNameLen + nTmpObjNameLen + 2 >= nmaxbuflen || nCurObjCntLen + sTmpObjCntLen + 2 >= nmaxbuflen) { bContinue = false; } else { memcpy(sobjcnt + nCurObjCntLen,sTmpObjCnt,strlen(sTmpObjCnt)); memcpy(sobjname + nCurObjNameLen,sTmpObjName,nTmpObjNameLen); memcpy(sobjdata + nCurObjDataLen,sTmpObjData,nTmpObjDataLen); nCurObjCnt ++; nCurObjCntLen += strlen(sTmpObjCnt); nCurObjNameLen += nTmpObjNameLen; nCurObjDataLen += nTmpObjDataLen; sobjcnt[nCurObjCntLen] = '|'; sobjcnt[nCurObjCntLen + 1] = '|'; sobjname[nCurObjNameLen] = '|'; sobjname[nCurObjNameLen + 1] = '|'; sobjdata[nCurObjDataLen] = '|'; sobjdata[nCurObjDataLen + 1] = '|'; nCurObjCntLen += 2; nCurObjNameLen += 2; nCurObjDataLen += 2; nobjcnt = nCurObjCnt; nrtn = 0; } } } } // Prepare for the next iteration. Make sure returned oid is // preserved and the returned value is freed. SnmpUtilOidCpy(&tempOid, &variableBindings.list[0].name); SnmpUtilVarBindFree(&variableBindings.list[0]); SnmpUtilOidCpy(&variableBindings.list[0].name, &tempOid); variableBindings.list[0].value.asnType = ASN_NULL; SnmpUtilOidFree(&tempOid); if (!bContinue) break; } SnmpUtilVarBindListFree(&variableBindings); SnmpUtilOidFree(&root); SnmpMgrClose(session); } __declspec(dllexport) void __stdcall CompAsnObjId(char *sObjIdA,char *sObjIdB,int &nrtn) { nrtn = 1; AsnObjectIdentifier reqObjectA; AsnObjectIdentifier reqObjectB; if (!SnmpMgrStrToOid(sObjIdA, &reqObjectA)) { nrtn = -1; return; } if (!SnmpMgrStrToOid(sObjIdB, &reqObjectB)) { nrtn = -2; return; } char *namestringA = NULL; SnmpMgrOidToStr(&reqObjectA, &namestringA); char *namestringB = NULL; SnmpMgrOidToStr(&reqObjectB, &namestringB); if (namestringA && namestringB) { if (strcmp(namestringA,namestringB) == 0) nrtn = 0; } if (namestringA) SNMP_free(namestringA); if (namestringB) SNMP_free(namestringB); }