MyAgent.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  1. // MyAgent.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include <string>
  5. #include "Mgmtapi.h"
  6. #include <snmp.h>
  7. #include <malloc.h>
  8. #include <io.h>
  9. //#include "Winsnmp.h"
  10. #define OID_SIZEOF( Oid ) ( sizeof Oid / sizeof(UINT) )
  11. #include "DllExcel.h"
  12. #include "BasicExcelVC6.h"
  13. using namespace YExcel;
  14. //using namespace std;
  15. //////////////////////////////////////////////////////////////////////////////////
  16. #define LEN_NUM_MAX 255
  17. #define OID_NUM_MAX 5000
  18. // template MIB entry
  19. struct MIB_ENTRY
  20. {
  21. AsnObjectIdentifier asnOid;
  22. void * pStorageValue;
  23. CHAR * szStorageName;
  24. BYTE chType;
  25. UINT unAccess;
  26. MIB_ENTRY* pMibNext;
  27. };
  28. // this is the our branch starting point (clled prefix)
  29. //UINT g_unMyOIDPrefix[] = {1,3,6,1,4,1,4320};//{1.3.6.1.4.1.4320};//
  30. CHAR g_sOIDPrefix[LEN_NUM_MAX] = ".1.3.6.1.4.1.4320";
  31. // this is the trap OID to send to client
  32. UINT g_TrapOid[] = {1,3,6,1,4,1,4320};//{1.3.6.1.4.1.4320.0};//
  33. //CHAR g_sTrapOid[255] = "1.3.6.1.4.1.16.0";
  34. //AsnObjectIdentifier MIB_OidPrefix;
  35. AsnObjectIdentifier MIB_OidPrefix;// = { OID_SIZEOF(g_unMyOIDPrefix), g_unMyOIDPrefix};
  36. DWORD g_dwStartTime = 0;
  37. HANDLE g_hSimulateTrap = NULL;
  38. HANDLE g_hTrapGenThread = NULL;
  39. unsigned long __stdcall TrapGenThread(void *lpVoid);
  40. int GetRequest(SnmpVarBind *pVarBind);
  41. int GetNextRequest(SnmpVarBind *pVarBind);
  42. int SetRequest(SnmpVarBind *pVarBind);
  43. UINT GetStoreVar(MIB_ENTRY* pMIB, AsnAny *pasnValue);
  44. UINT SetStoreVar(MIB_ENTRY* pMIB, AsnAny asnValue);
  45. void InitMibTable();
  46. void ReadExcel();
  47. /////////MIB Table ////////////////////////////////////////////////
  48. CHAR g_sOID[OID_NUM_MAX][LEN_NUM_MAX];
  49. //UINT g_unSubOid[] = {0,1};
  50. //UINT g_unNameOid[] = {0,4};
  51. //UINT g_unAgeOid[] = {1,3};
  52. char *g_szAbout = NULL;
  53. char *g_szName = NULL;
  54. AsnInteger g_asnIntAge = 0;
  55. char *g_sData[OID_NUM_MAX];
  56. AsnInteger g_nData[OID_NUM_MAX];
  57. int g_nIndex2Char=0;
  58. int g_nIndex2Int=0;
  59. /// This is the MIB table and its related variable store
  60. // here evry thing is hard-coded to demonstration perpose
  61. // Actualy it should be loaded from the registry or from some file
  62. MIB_ENTRY g_MyMibTable[OID_NUM_MAX] ;//= {
  63. // {
  64. // {OID_SIZEOF(g_unSubOid),g_unSubOid},
  65. // &g_szAbout,
  66. // "About",
  67. // ASN_OCTETSTRING,
  68. // SNMP_ACCESS_READ_ONLY,
  69. // &g_MyMibTable[1]
  70. // },
  71. // {
  72. // {OID_SIZEOF(g_unNameOid),g_unNameOid},
  73. // &g_szName,
  74. // "Name",
  75. // ASN_OCTETSTRING,
  76. // SNMP_ACCESS_READ_WRITE,
  77. // &g_MyMibTable[2]
  78. // },
  79. // {
  80. // {OID_SIZEOF(g_unAgeOid),g_unAgeOid},
  81. // &g_asnIntAge,
  82. // "Age",
  83. // ASN_INTEGER,
  84. // SNMP_ACCESS_READ_WRITE,
  85. // NULL
  86. // }
  87. //};
  88. UINT g_unMyMibCount = 0;//(sizeof(g_MyMibTable) / sizeof(MIB_ENTRY));
  89. ///////////////////////////////////////////////////////////////////
  90. void WriteLog(CHAR csMsg[], DWORD dwSize )
  91. {
  92. HANDLE hFile;
  93. DWORD dwNumberOfBytesWritten;
  94. // 必须指定 OPEN_ALWAYS 标志, 否则不会在原文件内容上添加
  95. hFile = CreateFile( "C:\\Snmplog.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL );//FILE_ATTRIBUTE_HIDDEN
  96. if (hFile == INVALID_HANDLE_VALUE )
  97. {
  98. return ;
  99. }
  100. // 设置文件指针到文件结尾, 在 当前位置 FILE_END, 向后移动 0 字节
  101. SetFilePointer( hFile , 0, NULL, FILE_END );
  102. // 这个 API 是设置当前的位置为文件的结尾
  103. // SetEndOfFile( hFile);
  104. BOOL BRet = WriteFile( hFile, csMsg, dwSize , &dwNumberOfBytesWritten, NULL);
  105. CloseHandle( hFile );
  106. }
  107. int FindChar(char ch,char str[],int n)
  108. {
  109. int i=n-1;
  110. while(str[i]!=ch&&i>0)
  111. i--;
  112. if(i==0) i=-1;
  113. return i;
  114. }
  115. /*从中部截取字符串 */
  116. char *STRmid(char *dst,char *src,int n,int m)
  117. {
  118. char *p=src;
  119. char *q=dst;
  120. //int len=strlen(src);
  121. //if(n>len) n=len-m;
  122. //if(m>0)
  123. // return NULL;
  124. p += n;
  125. while(m>n)
  126. {
  127. *(q++) = *(p++);
  128. n++;
  129. }
  130. *(q++)='\0';
  131. return dst;
  132. }
  133. BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
  134. {
  135. CHAR ss[] = "DllMain\r\n";
  136. //WriteLog( ss,strlen(ss) );
  137. switch (ul_reason_for_call)
  138. {
  139. case DLL_PROCESS_ATTACH:
  140. break;
  141. case DLL_THREAD_ATTACH:
  142. break;
  143. case DLL_THREAD_DETACH:
  144. break;
  145. case DLL_PROCESS_DETACH:
  146. TerminateThread(g_hTrapGenThread,0);
  147. CloseHandle(g_hTrapGenThread);
  148. CloseHandle(g_hSimulateTrap);
  149. break;
  150. }
  151. return TRUE;
  152. }
  153. // When exported funtion will be called during DLL loading and initialization
  154. BOOL SNMP_FUNC_TYPE SnmpExtensionInit(DWORD dwUptimeReference,HANDLE *phSubagentTrapEvent, AsnObjectIdentifier *pFirstSupportedRegion)
  155. {
  156. DeleteFile( "C:\\Snmplog.txt" );
  157. CHAR ss[] = "SnmpExtensionInit 3.0.4.0\r\n";
  158. WriteLog( ss,strlen(ss) );
  159. SnmpMgrStrToOid( g_sOIDPrefix, &MIB_OidPrefix );
  160. // hard coded initialization
  161. //g_szAbout = (char*)malloc(sizeof(char)*64);
  162. //strcpy(g_szAbout,"Author : Ramanan.T");
  163. //g_szName = (char*)malloc(sizeof(char)*64);
  164. //strcpy(g_szName,"Your Name");
  165. //g_asnIntAge = 125;
  166. //g_sData[0] = (char*)malloc(sizeof(char)*64);
  167. //strcpy( g_sData[0],"Author : Ramanan.T");
  168. //g_sData[1] = (char*)malloc(sizeof(char)*64);
  169. //strcpy( g_sData[1],"Your Name");
  170. //g_nData[0] = 145;
  171. //g_nIndex2Char = 2;
  172. ReadExcel();
  173. //InitMibTable();
  174. g_hSimulateTrap = CreateEvent(NULL, FALSE, FALSE, NULL); // creaet this event for the trap
  175. *pFirstSupportedRegion = MIB_OidPrefix;
  176. *phSubagentTrapEvent = g_hSimulateTrap; // by assigning it pass it to the SNMP service
  177. // So when ever you set this event service will call
  178. // SnmpExtensionTrap exported function
  179. // on loading the our SNMP DLL create the thread
  180. //g_hTrapGenThread = CreateThread(NULL,0,TrapGenThread,NULL,0,NULL);
  181. g_dwStartTime = GetTickCount();
  182. return SNMPAPI_NOERROR;
  183. }
  184. VOID SNMP_FUNC_TYPE SnmpExtensionClose()
  185. {
  186. CHAR ss[255];// = "SnmpExtensionQuery\r\n";
  187. sprintf( ss,"SnmpExtensionClose\r\n" );
  188. WriteLog( ss,strlen(ss) );
  189. for( int i=0;i<g_nIndex2Char;i++ )
  190. {
  191. free( g_sData[i] );
  192. }
  193. //trap 用
  194. free( g_sData[4999] );
  195. }
  196. // this export is to query the MIB table and fields
  197. BOOL SNMP_FUNC_TYPE SnmpExtensionQuery(BYTE bPduType, SnmpVarBindList *pVarBindList, AsnInteger32 *pErrorStatus, AsnInteger32 *pErrorIndex)
  198. {
  199. int nRet = 0;
  200. AsnObjectName;
  201. *pErrorStatus = SNMP_ERRORSTATUS_NOERROR;
  202. *pErrorIndex = 0;
  203. // CHAR ss[255];// = "SnmpExtensionQuery\r\n";
  204. //sprintf( ss,"SnmpExtensionQuery\r\n" );
  205. //WriteLog( ss,strlen(ss) );
  206. for(UINT i=0;i<pVarBindList->len;i++)
  207. {
  208. *pErrorStatus = SNMP_ERRORSTATUS_NOERROR;
  209. // what type of request we are getting?
  210. switch(bPduType)
  211. {
  212. case SNMP_PDU_GET:// // gets the variable value passed variable in pVarBindList
  213. *pErrorStatus = GetRequest(&pVarBindList->list[i]);
  214. if(*pErrorStatus != SNMP_ERRORSTATUS_NOERROR)
  215. *pErrorIndex++;
  216. //sprintf( ss,"SNMP_PDU_GET\r\n" );
  217. break;
  218. case SNMP_PDU_GETNEXT: // gets the next variable related to the passed variable in pVarBindList
  219. *pErrorStatus = GetNextRequest(&pVarBindList->list[i]);
  220. if(*pErrorStatus != SNMP_ERRORSTATUS_NOERROR)
  221. *pErrorIndex++;
  222. //sprintf( ss,"SNMP_PDU_GETNEXT\r\n" );
  223. break;
  224. case SNMP_PDU_SET: // sets a variable
  225. *pErrorStatus = SetRequest(&pVarBindList->list[i]);
  226. if(*pErrorStatus != SNMP_ERRORSTATUS_NOERROR)
  227. *pErrorIndex++;
  228. //sprintf( ss,"SNMP_PDU_SET\r\n" );
  229. break;
  230. default:
  231. *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
  232. *pErrorIndex++;
  233. //sprintf( ss,"default\r\n" );
  234. }
  235. //WriteLog( ss,strlen(ss) );
  236. }
  237. return SNMPAPI_NOERROR;
  238. }
  239. // this function just simulate traps
  240. // Traps just a 2 variables value from MIB
  241. // Trap is kind of event from server to client
  242. // When ever the event is set service will call this function and gets the parameters filled.
  243. // After filling the parameters service willsend the trap to all the client connected
  244. BOOL SNMP_FUNC_TYPE SnmpExtensionTrap(AsnObjectIdentifier *pEnterpriseOid, AsnInteger32 *pGenericTrapId, AsnInteger32 *pSpecificTrapId, AsnTimeticks *pTimeStamp, SnmpVarBindList *pVarBindList)
  245. {
  246. static int nNoOfTraps = 1; // just ignore this, I introduced this to send meny traps at once
  247. // any way below we are generating one trap with two values
  248. CHAR ss[255];// = "SnmpExtensionQuery\r\n";
  249. SYSTEMTIME st;
  250. ::GetLocalTime( &st );
  251. if(nNoOfTraps==1) // if it is zero don't send traps
  252. {
  253. //pEnterpriseOid->idLength = OID_SIZEOF(g_TrapOid);
  254. //pEnterpriseOid->ids = g_TrapOid;
  255. SnmpMgrStrToOid( g_sOIDPrefix, pEnterpriseOid );
  256. *pGenericTrapId = SNMP_GENERICTRAP_ENTERSPECIFIC;
  257. *pSpecificTrapId = 1; // ToasterControl Up trap.
  258. *pTimeStamp = GetTickCount() - g_dwStartTime;
  259. // Allocate space for the Variable Bindings.
  260. pVarBindList->list = (SnmpVarBind*)SnmpUtilMemAlloc(1*sizeof(SnmpVarBind));
  261. SnmpUtilOidCpy(&pVarBindList->list[0].name,&g_MyMibTable[4999].asnOid);//&MIB_OidPrefix);
  262. //sprintf( ss,"SnmpExtensionTrap %s\r\n",&(pVarBindList->list[0].name) );
  263. //WriteLog( ss,strlen(ss) );
  264. //SnmpUtilOidAppend(&pVarBindList->list[0].name,&g_MyMibTable[1].asnOid);
  265. pVarBindList->list[0].value.asnType = ASN_OCTETSTRING;
  266. pVarBindList->list[0].value.asnValue.string.dynamic = TRUE;
  267. pVarBindList->list[0].value.asnValue.string.length = strlen(*(LPSTR*)g_MyMibTable[4999].pStorageValue);
  268. pVarBindList->list[0].value.asnValue.string.stream =(unsigned char*)SnmpUtilMemAlloc(pVarBindList->list[0].value.asnValue.string.length * sizeof(char));
  269. memcpy(pVarBindList->list[0].value.asnValue.string.stream,*(LPSTR*)g_MyMibTable[4999].pStorageValue,pVarBindList->list[0].value.asnValue.string.length);
  270. //SnmpUtilOidCpy(&pVarBindList->list[0].name,&g_MyMibTable[2].asnOid);//&MIB_OidPrefix);
  271. ////SnmpUtilOidAppend(&pVarBindList->list[1].name,&g_MyMibTable[2].asnOid);
  272. //pVarBindList->list[0].value.asnType = ASN_INTEGER;
  273. //pVarBindList->list[0].value.asnValue.number = *((AsnInteger32*)g_MyMibTable[2].pStorageValue);
  274. sprintf( ss,"SnmpExtensionTrap %02d:%02d:%02d 长度%d \r\n",st.wHour,st.wMinute,st.wSecond,pVarBindList->list[0].value.asnValue.string.length );
  275. WriteLog( ss,strlen(ss) );
  276. pVarBindList->len = 1;
  277. nNoOfTraps--;
  278. // Indicate that valid trap data exists in the parameters.
  279. return TRUE;
  280. }
  281. nNoOfTraps = 1;
  282. //PulseEvent( g_hSimulateTrap );
  283. // Indicate that no more traps are available, and parameters do not refer to any valid data
  284. return FALSE;
  285. }
  286. // get the value of the variable pased
  287. // 客户通过OID读取时,该函数执行
  288. int GetRequest(SnmpVarBind *pVarBind)
  289. {
  290. int nRet = SNMP_ERRORSTATUS_NOSUCHNAME;
  291. AsnObjectIdentifier asnOidTemp;
  292. CHAR ss[255];sprintf( ss,"GetRequest\r\n" );
  293. //WriteLog( ss,strlen(ss) );
  294. for(UINT i=0;i<g_unMyMibCount;i++)
  295. {
  296. SnmpUtilOidCpy(&asnOidTemp, &g_MyMibTable[i].asnOid);//&MIB_OidPrefix);
  297. //SnmpUtilOidAppend(&asnOidTemp, &g_MyMibTable[i].asnOid);
  298. if(SnmpUtilOidCmp(&asnOidTemp,&pVarBind->name) ==0)
  299. {
  300. SnmpUtilOidFree(&asnOidTemp);
  301. nRet = GetStoreVar(&g_MyMibTable[i],&pVarBind->value);
  302. break;
  303. }
  304. SnmpUtilOidFree(&asnOidTemp);
  305. }
  306. return nRet;
  307. }
  308. // get the next variable & value related to the passed variable
  309. // 客户通过OID读取下个数据时,该函数执行
  310. int GetNextRequest(SnmpVarBind *pVarBind)
  311. {
  312. int nRet = SNMP_ERRORSTATUS_NOSUCHNAME;
  313. //int nResult = 0;(M2)163845=11(M3)274568=11()=00
  314. //AsnObjectIdentifier asnOidTemp;
  315. //for(UINT i=0;i<g_unMyMibCount;i++)
  316. //{
  317. // SnmpUtilOidCpy(&asnOidTemp, &g_MyMibTable[i].asnOid);//&MIB_OidPrefix);
  318. // //SnmpUtilOidAppend(&asnOidTemp, &g_MyMibTable[i].asnOid);
  319. // nResult = SnmpUtilOidCmp(&asnOidTemp,&pVarBind->name);
  320. // if(nResult>0)
  321. // {
  322. // SnmpUtilOidFree(&pVarBind->name);
  323. // // kind of memcpy
  324. // SnmpUtilOidCpy(&pVarBind->name, &asnOidTemp);
  325. // nRet = GetStoreVar(&g_MyMibTable[i],&pVarBind->value);
  326. // SnmpUtilOidFree(&asnOidTemp);
  327. // nRet = SNMP_ERRORSTATUS_NOERROR;
  328. // break;
  329. // }
  330. // else if(nResult == 0)
  331. // {
  332. // SnmpUtilOidFree(&asnOidTemp);
  333. // if(g_MyMibTable[i].pMibNext == NULL)
  334. // break;
  335. // // king of mem free
  336. // SnmpUtilOidFree(&pVarBind->name);
  337. // // kind of memcpy :)
  338. // SnmpUtilOidCpy(&pVarBind->name, &g_MyMibTable[i].pMibNext->asnOid);//&MIB_OidPrefix);
  339. // // kind of strcat
  340. // //SnmpUtilOidAppend(&pVarBind->name, &g_MyMibTable[i].pMibNext->asnOid);
  341. // nRet = GetStoreVar(g_MyMibTable[i].pMibNext,&pVarBind->value);
  342. // break;
  343. // }
  344. // SnmpUtilOidFree(&asnOidTemp);
  345. //}
  346. return nRet;
  347. }
  348. LPSTR Convert(LPCSTR str, int sourceCodepage, int targetCodepage)
  349. {
  350. //int len=_tcslen(str);
  351. int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);
  352. wchar_t* pUnicode;
  353. pUnicode=new wchar_t[unicodeLen+1];
  354. memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
  355. MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
  356. BYTE * pTargetData;
  357. int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
  358. pTargetData=new BYTE[targetLen+1];
  359. memset(pTargetData,0,targetLen+1);
  360. WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
  361. LPSTR szResult=new TCHAR[targetLen+1];
  362. wsprintf(szResult,"%s",pTargetData);
  363. delete[] pUnicode;
  364. delete[] pTargetData;
  365. return szResult;
  366. }
  367. // if it is a writable variable passed value will be copied to it
  368. // 客户通过OID设置时,该函数执行
  369. int SetRequest(SnmpVarBind *pVarBind)
  370. {
  371. int nRet = SNMP_ERRORSTATUS_NOSUCHNAME;
  372. AsnObjectIdentifier asnOidTemp;
  373. for(UINT i=0;i<g_unMyMibCount;i++)
  374. {
  375. // kind of memcpy ;), any way you can't use memcpy
  376. SnmpUtilOidCpy(&asnOidTemp, &g_MyMibTable[i].asnOid);//&MIB_OidPrefix);
  377. // kind of strcat ;)
  378. //SnmpUtilOidAppend(&asnOidTemp, &g_MyMibTable[i].asnOid);
  379. if(SnmpUtilOidCmp(&asnOidTemp,&pVarBind->name) ==0)
  380. {
  381. CHAR src[255],des[255],ss[255],sData[255],sContent[255];
  382. memset( src,0,255 );
  383. memset( des,0,255 );
  384. memset( ss,0,255 );
  385. int nType = 0;
  386. sprintf( src,"%s",pVarBind->value.asnValue.string );
  387. char *cPos = strstr( src,"*" );
  388. int nPos1 = -1;
  389. int nPos2 = -1;
  390. /*sprintf( ss,"SetRequest=%s %s\r\n",src,cPos );
  391. WriteLog( ss,strlen(ss) );*/
  392. if( cPos )
  393. {
  394. nPos1 = FindChar( '*',src,strlen(src) );
  395. nPos2 = FindChar( '#',src,strlen(src) );
  396. STRmid( ss,src,0,nPos1 );
  397. nType = atoi( ss );
  398. STRmid( sData,src,nPos1+1,nPos2 );
  399. STRmid( sContent,src,nPos2+1,strlen(src) );
  400. //sprintf( ss,"nType=%d sData=%s sContent=%s\r\n",nType,sData,sContent );
  401. //WriteLog( ss,strlen(ss) );
  402. }
  403. else
  404. {
  405. sprintf( sData,"%s",pVarBind->value.asnValue.string );
  406. }
  407. if( cPos==NULL )
  408. {
  409. SnmpUtilOidFree(&asnOidTemp);
  410. nRet = SetStoreVar(&g_MyMibTable[i],pVarBind->value);
  411. }
  412. else
  413. {
  414. SnmpUtilMemFree( pVarBind->value.asnValue.string.stream );
  415. pVarBind->value.asnType = ASN_OCTETSTRING;
  416. pVarBind->value.asnValue.string.dynamic = TRUE;
  417. pVarBind->value.asnValue.string.length = strlen(sData);
  418. pVarBind->value.asnValue.string.stream =(unsigned char*)SnmpUtilMemAlloc( strlen(sData) * sizeof(char));
  419. memcpy( pVarBind->value.asnValue.string.stream,sData,strlen(sData) );
  420. SnmpUtilOidFree(&asnOidTemp);
  421. nRet = SetStoreVar(&g_MyMibTable[i],pVarBind->value);
  422. if( nType!=0 )
  423. {
  424. g_MyMibTable[4999].asnOid = g_MyMibTable[i].asnOid;
  425. g_MyMibTable[4999].unAccess = g_MyMibTable[i].unAccess;
  426. g_MyMibTable[4999].chType = ASN_OCTETSTRING;//g_MyMibTable[i].chType;
  427. memcpy(*(LPSTR*)(g_MyMibTable[4999].pStorageValue),&sContent,strlen(sContent) );
  428. //g_MyMibTable[4999].pStorageValue = &sContent[0];
  429. //g_MyMibTable[4999].pStorageValue = &sContent;//g_MyMibTable[i].pStorageValue;
  430. //memcpy( g_MyMibTable[4999].pStorageValue,sContent,strlen(sContent) );
  431. //memcpy(*(LPSTR*)(g_MyMibTable[4999].pStorageValue),sContent,strlen(sContent) );
  432. g_MyMibTable[4999].szStorageName = "测试";//Convert( sContent,936,CP_UTF8);//g_MyMibTable[i].szStorageName;//"发生报警";//
  433. //SetStoreVar(&g_MyMibTable[4999],pVarBind->value);
  434. sprintf( ss,"类型=%d 值=%s 内容=%s 长度=%d \r\n",nType,sData,sContent,strlen(sContent) );
  435. WriteLog( ss,strlen(ss) );
  436. SetEvent(g_hSimulateTrap);
  437. }
  438. }
  439. break;
  440. }
  441. SnmpUtilOidFree(&asnOidTemp);
  442. }
  443. return nRet;
  444. }
  445. // retrieves the value from the MIB table
  446. // Imagine AsnAny is like VARIANT structure to populate that you need to go through the types
  447. UINT GetStoreVar(MIB_ENTRY* pMIB, AsnAny *pasnValue)
  448. {
  449. // check rights is there to access
  450. if((pMIB->unAccess != SNMP_ACCESS_READ_ONLY)&&(pMIB->unAccess != SNMP_ACCESS_READ_WRITE)&&(pMIB->unAccess != SNMP_ACCESS_READ_CREATE))
  451. return SNMP_ERRORSTATUS_GENERR;
  452. // set the type
  453. pasnValue->asnType = pMIB->chType;
  454. switch(pasnValue->asnType)
  455. {
  456. case ASN_INTEGER:
  457. pasnValue->asnValue.number = *(AsnInteger32*)pMIB->pStorageValue;
  458. break;
  459. case ASN_COUNTER32:
  460. case ASN_GAUGE32:
  461. case ASN_TIMETICKS:
  462. case ASN_UNSIGNED32:
  463. pasnValue->asnValue.unsigned32 = *(AsnUnsigned32*)pMIB->pStorageValue;
  464. break;
  465. case ASN_OCTETSTRING:
  466. pasnValue->asnValue.string.length = strlen(*(LPSTR*)pMIB->pStorageValue);
  467. pasnValue->asnValue.string.stream =(unsigned char*)SnmpUtilMemAlloc(pasnValue->asnValue.string.length * sizeof(char));
  468. memcpy(pasnValue->asnValue.string.stream,*(LPSTR*)pMIB->pStorageValue,pasnValue->asnValue.string.length);
  469. pasnValue->asnValue.string.dynamic = TRUE;
  470. break;
  471. case ASN_COUNTER64:
  472. pasnValue->asnValue.counter64 = *(AsnCounter64*)pMIB->pStorageValue;
  473. break;
  474. case ASN_OBJECTIDENTIFIER:
  475. SnmpUtilOidCpy(&pasnValue->asnValue.object,(AsnObjectIdentifier*)pMIB->pStorageValue);
  476. break;
  477. case ASN_IPADDRESS:
  478. pasnValue->asnValue.address.length = 4;
  479. pasnValue->asnValue.string.dynamic = TRUE;
  480. pasnValue->asnValue.address.stream[0] = ((char*)pMIB->pStorageValue)[0];
  481. pasnValue->asnValue.address.stream[1] = ((char*)pMIB->pStorageValue)[1];
  482. pasnValue->asnValue.address.stream[2] = ((char*)pMIB->pStorageValue)[2];
  483. pasnValue->asnValue.address.stream[3] = ((char*)pMIB->pStorageValue)[3];
  484. break;
  485. case ASN_OPAQUE:
  486. AsnSequence;
  487. break;
  488. case ASN_BITS:
  489. break;
  490. case ASN_SEQUENCE:
  491. break;
  492. case ASN_NULL:
  493. default:
  494. return SNMP_ERRORSTATUS_GENERR;
  495. }
  496. return SNMP_ERRORSTATUS_NOERROR;
  497. }
  498. // to store the value to the MIB table
  499. // Imagine AsnAny is like VARIANT structure to populate that you need to go through the types
  500. UINT SetStoreVar(MIB_ENTRY* pMIB, AsnAny asnValue)
  501. {
  502. // check whether rights is there to access
  503. if((pMIB->unAccess != SNMP_ACCESS_READ_WRITE)&&(pMIB->unAccess != SNMP_ACCESS_READ_CREATE))
  504. return SNMP_ERRORSTATUS_READONLY;
  505. // check type matches with the table type
  506. if(pMIB->chType != asnValue.asnType)
  507. return SNMP_ERRORSTATUS_BADVALUE;
  508. switch(asnValue.asnType)
  509. {
  510. case ASN_INTEGER:
  511. *(AsnInteger *)(pMIB->pStorageValue) = asnValue.asnValue.number;
  512. break;
  513. case ASN_COUNTER32:
  514. case ASN_GAUGE32:
  515. case ASN_TIMETICKS:
  516. case ASN_UNSIGNED32:
  517. *(AsnInteger *)(pMIB->pStorageValue) = asnValue.asnValue.unsigned32;
  518. break;
  519. case ASN_OCTETSTRING:
  520. free(*(LPSTR*)(pMIB->pStorageValue));
  521. *(LPSTR*)(pMIB->pStorageValue) = (LPSTR)malloc((asnValue.asnValue.string.length+1) * sizeof(char));
  522. memcpy(*(LPSTR*)(pMIB->pStorageValue), asnValue.asnValue.string.stream,asnValue.asnValue.string.length);
  523. (*(LPSTR*)pMIB->pStorageValue)[asnValue.asnValue.string.length] = '\0';
  524. break;
  525. case ASN_COUNTER64:
  526. *(AsnCounter64*)pMIB->pStorageValue = asnValue.asnValue.counter64;
  527. break;
  528. case ASN_OBJECTIDENTIFIER:
  529. SnmpUtilOidCpy((AsnObjectIdentifier*)pMIB->pStorageValue,&asnValue.asnValue.object);
  530. break;
  531. case ASN_IPADDRESS:
  532. ((char*)pMIB->pStorageValue)[0] = asnValue.asnValue.address.stream[0];
  533. ((char*)pMIB->pStorageValue)[1] = asnValue.asnValue.address.stream[1];
  534. ((char*)pMIB->pStorageValue)[2] = asnValue.asnValue.address.stream[2];
  535. ((char*)pMIB->pStorageValue)[3] = asnValue.asnValue.address.stream[3];
  536. break;
  537. case ASN_OPAQUE:
  538. AsnSequence;
  539. break;
  540. case ASN_BITS:
  541. break;
  542. case ASN_SEQUENCE:
  543. break;
  544. case ASN_NULL:
  545. break;
  546. default:
  547. return SNMP_ERRORSTATUS_GENERR;
  548. }
  549. return SNMP_ERRORSTATUS_NOERROR;
  550. }
  551. // simple trap generation thread
  552. // I'm sending traps in a loops in 15 second intervals
  553. unsigned long __stdcall TrapGenThread(void *lpVoid)
  554. {
  555. for(;;)
  556. {
  557. Sleep(5000);//Sleep(15000);
  558. SetEvent(g_hSimulateTrap);
  559. }
  560. return 0;
  561. }
  562. void ReadExcel()
  563. {
  564. CHAR ss[255];// = "SnmpExtensionQuery\r\n";
  565. if( -1==access("C:\\OID-斯特纽有限公司.xls",0) )
  566. {
  567. sprintf( ss,"OID-斯特纽有限公司.xls 不存在 \r\n" );
  568. WriteLog( ss,strlen(ss) );
  569. return;
  570. }
  571. sprintf( ss,"ReadExcel in \r\n" );
  572. WriteLog( ss,strlen(ss) );
  573. int i;
  574. const long DIM1 = OID_NUM_MAX;
  575. const long DIM2 = 255;
  576. char **array1,**array2,**array3,**array4,**array5,**array6;
  577. array1 = new char *[DIM1];
  578. array2 = new char *[DIM1];
  579. array3 = new char *[DIM1];
  580. array4 = new char *[DIM1];
  581. array5 = new char *[DIM1];
  582. array6 = new char *[DIM1];
  583. for(i=0;i<DIM1;++i)
  584. {
  585. array1[i] = new char[DIM2];
  586. array2[i] = new char[DIM2];
  587. array3[i] = new char[DIM2];
  588. array4[i] = new char[DIM2];
  589. array5[i] = new char[DIM2];
  590. array6[i] = new char[DIM2];
  591. }
  592. CDllExcel DllExcel;
  593. long nCount=0;
  594. DllExcel.Excel_Open( "C:\\OID-斯特纽有限公司.xls","StoneU",array1,array2,array3,array4,array5,array6,nCount );
  595. sprintf( ss,"ReadExcel nCount = %d \r\n",nCount );
  596. WriteLog( ss,strlen(ss) );
  597. for( int i=0;i<nCount;i++ )
  598. {
  599. SnmpMgrStrToOid( array1[i], &g_MyMibTable[g_unMyMibCount].asnOid );//oid
  600. g_MyMibTable[g_unMyMibCount].unAccess = SNMP_ACCESS_READ_WRITE;//读写权限
  601. sprintf( ss,"read-write\r\n" );
  602. g_MyMibTable[g_unMyMibCount].chType = ASN_OCTETSTRING;//数据类型
  603. //初始值
  604. g_sData[g_nIndex2Char] = (char*)malloc(sizeof(char)*64);
  605. strcpy( g_sData[g_nIndex2Char],array5[i] );
  606. g_MyMibTable[g_unMyMibCount].pStorageValue = &g_sData[g_nIndex2Char];
  607. g_nIndex2Char++;
  608. sprintf( ss,"ASN_OCTETSTRING g_nIndex2Char=%d\r\n",g_nIndex2Char );
  609. //WriteLog( ss,strlen(ss) );
  610. g_MyMibTable[g_unMyMibCount].szStorageName = array6[i];
  611. g_MyMibTable[g_unMyMibCount].pMibNext = &g_MyMibTable[g_unMyMibCount+1];
  612. g_unMyMibCount++;
  613. }
  614. g_MyMibTable[g_unMyMibCount].pMibNext = NULL;
  615. for(int i=0;i<DIM1;++i)
  616. {
  617. delete[] array1[i];
  618. delete[] array2[i];
  619. delete[] array3[i];
  620. delete[] array4[i];
  621. delete[] array5[i];
  622. delete[] array6[i];
  623. }
  624. delete[] array1;
  625. delete[] array2;
  626. delete[] array3;
  627. delete[] array4;
  628. delete[] array5;
  629. delete[] array6;
  630. //trap 用
  631. g_sData[4999] = (char*)malloc(sizeof(char)*64);
  632. g_MyMibTable[4999].pStorageValue = &g_sData[4999];
  633. sprintf( ss,"ReadExcel out \r\n" );
  634. WriteLog( ss,strlen(ss) );
  635. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  636. // CHAR sContent[255];
  637. // memset( sContent,0,255 );
  638. // sprintf( sContent,"值内容" );
  639. // //WriteLog( sContent,strlen(sContent) );
  640. // sprintf( ss," g_unMyMibCount=%d\r\n",g_unMyMibCount );
  641. // WriteLog( ss,strlen(ss) );
  642. //
  643. // g_MyMibTable[4999].asnOid = g_MyMibTable[0].asnOid;
  644. // g_MyMibTable[4999].unAccess = SNMP_ACCESS_READ_WRITE;
  645. // g_MyMibTable[4999].chType = ASN_OCTETSTRING;
  646. // //g_MyMibTable[4999].pStorageValue = &sContent[0];
  647. // //g_MyMibTable[4999].pStorageValue = &sContent;//g_MyMibTable[i].pStorageValue;
  648. // //memcpy( g_MyMibTable[4999].pStorageValue,sContent,strlen(sContent) );
  649. // memcpy(*(LPSTR*)(g_MyMibTable[4999].pStorageValue),&sContent,strlen(sContent)-0 );
  650. // //g_MyMibTable[4999].szStorageName = sContent;//"测试";//Convert( sContent,936,CP_UTF8);//g_MyMibTable[i].szStorageName;//"发生报警";//
  651. // //SetStoreVar(&g_MyMibTable[4999],pVarBind->value);
  652. //
  653. // int nLen = strlen(*(LPSTR*)g_MyMibTable[4999].pStorageValue);
  654. // sprintf( ss,"%s 长度1=%d \r\n",*(LPSTR*)(g_MyMibTable[4999].pStorageValue),nLen );
  655. // WriteLog( ss,strlen(ss) );
  656. //
  657. // SnmpVarBindList *pVarBindList = new SnmpVarBindList;
  658. //
  659. // pVarBindList->list[0].value.asnType = ASN_OCTETSTRING;
  660. // pVarBindList->list[0].value.asnValue.string.dynamic = TRUE;
  661. // pVarBindList->list[0].value.asnValue.string.length = strlen(*(LPSTR*)g_MyMibTable[4999].pStorageValue);
  662. // pVarBindList->list[0].value.asnValue.string.stream =(unsigned char*)SnmpUtilMemAlloc(pVarBindList->list[0].value.asnValue.string.length * sizeof(char));
  663. // memcpy(pVarBindList->list[0].value.asnValue.string.stream,*(LPSTR*)g_MyMibTable[4999].pStorageValue,pVarBindList->list[0].value.asnValue.string.length);
  664. //
  665. // nLen = pVarBindList->list[0].value.asnValue.string.length;
  666. // sprintf( ss,"%s 长度2=%d \r\n",(pVarBindList->list[0].value.asnValue.string.stream),nLen );
  667. // WriteLog( ss,strlen(ss) );
  668. }