| 发表于:2007-02-01 16:55:351楼 得分:0 |
我的代码是这样的, dll里 #define unicode #define _unicode #include <ws2spi.h> #include <tchar.h> #include <stdio.h> guid filterguid={0x4d1e91fd,0x116a,0x44aa,{0x8f,0xd4,0x1d,0x2c,0xf2,0x7b,0xd9,0xa9}}; lpwsaprotocol_infow protoinfo=null; wspproc_table nextproctable; dword protoinfosize=0; int totalprotos=0; bool getfilter() { int errorcode; protoinfo=null; protoinfosize=0; totalprotos=0; if(wscenumprotocols(null,protoinfo,&protoinfosize,&errorcode)==socket_error) { if(errorcode!=wsaenobufs) { outputdebugstring(_t( "first wscenumprotocols error! ")); return false; } } if((protoinfo=(lpwsaprotocol_infow)globalalloc(gptr,protoinfosize))==null) { outputdebugstring(_t( "globalalloc error! ")); return false; } if((totalprotos=wscenumprotocols(null,protoinfo,&protoinfosize,&errorcode))==socket_error) { outputdebugstring(_t( "second wscenumprotocols error! ")); return false; } return true; } void freefilter() { globalfree(protoinfo); } bool winapi dllmain(hinstance hmodule, dword reason, lpvoid lpreserved) { tchar processname[max_path]; tchar showmessage[max_path+25]; if(reason==dll_process_attach) { getmodulefilename(null,processname,max_path); _tcscpy(showmessage,processname); _tcscat(showmessage,_t( " loading ipfilter ... ")); outputdebugstring(showmessage); } return true; } /*int wspapi wspsendto(socket s, lpwsabuf lpbuffer, dword dwbuffercount, lpdword lpnumberofbytessent, dword dwflags, const struct sockaddr far *lpto, int itolen, lpwsaoverlapped lpoverlapped, lpwsaoverlapped_completion_routine lpcompletionroutine, lpwsathreadid lpthreadid, lpint lperrno) { struct sockaddr_in sin; sin=*(const struct sockaddr_in *)lpto; if(sin.sin_port==htons(8000)) { outputdebugstring(_t( "wspsendto tencent filtered ")); return 0; //return nextproctable.lpwspsendto(s,lpbuffer,dwbuffercount, // lpnumberofbytessent,dwflags,lpto,itolen, // lpoverlapped,lpcompletionroutine,lpthreadid,lperrno); } else { //return 0; return nextproctable.lpwspsendto(s,lpbuffer,dwbuffercount, lpnumberofbytessent,dwflags,lpto,itolen, lpoverlapped,lpcompletionroutine,lpthreadid,lperrno); } }*/ int wspapi wsprecvfrom ( socket s, lpwsabuf lpbuffers, dword dwbuffercount, lpdword lpnumberofbytesrecvd, lpdword lpflags, struct sockaddr far * lpfrom, lpint lpfromlen, lpwsaoverlapped lpoverlapped, lpwsaoverlapped_completion_routine lpcompletionroutine, lpwsathreadid lpthreadid, lpint lperrno ) { struct sockaddr_in sin; sin=*(const struct sockaddr_in *)lpfrom; if(sin.sin_port==htons(8888)) { outputdebugstring(_t( "wspsendto tencent filtered ")); // return 0; return nextproctable.lpwsprecvfrom(s,lpbuffers,dwbuffercount, lpnumberofbytesrecvd,lpflags,lpfrom,lpfromlen, lpoverlapped,lpcompletionroutine,lpthreadid,lperrno); //return nextproctable.lpwspsendto(s,lpbuffer,dwbuffercount, // lpnumberofbytessent,dwflags,lpto,itolen, // lpoverlapped,lpcompletionroutine,lpthreadid,lperrno); } else { //return 0; return nextproctable.lpwsprecvfrom(s,lpbuffers,dwbuffercount, lpnumberofbytesrecvd,lpflags,lpfrom,lpfromlen, lpoverlapped,lpcompletionroutine,lpthreadid,lperrno); } } int wspapi wspstartup( word wversionrequested, lpwspdata lpwspdata, lpwsaprotocol_infow lpprotoinfo, wspupcalltable upcalltable, lpwspproc_table lpproctable ) { outputdebugstring(_t( "ipfilter wspstartup ... ")); int i; int errorcode; int filterpathlen; dword layerid=0; dword nextlayerid=0; tchar *filterpath; hinstance hfilter; lpwspstartup wspstartupfunc=null; if(lpprotoinfo-> protocolchain.chainlen <=1) { outputdebugstring(_t( "chainlen <=1 ")); return false; } getfilter(); for(i=0;i <totalprotos;i++) { if(memcmp(&protoinfo[i].providerid,&filterguid,sizeof(guid))==0) { layerid=protoinfo[i].dwcatalogentryid; break; } } for(i=0;i <lpprotoinfo-> protocolchain.chainlen;i++) { if(lpprotoinfo-> protocolchain.chainentries[i]==layerid) { nextlayerid=lpprotoinfo-> protocolchain.chainentries[i+1]; break; } } filterpathlen=max_path; filterpath=(tchar*)globalalloc(gptr,filterpathlen); for(i=0;i <totalprotos;i++) { if(nextlayerid==protoinfo[i].dwcatalogentryid) { if(wscgetproviderpath(&protoinfo[i].providerid,filterpath,&filterpathlen,&errorcode)==socket_error) { outputdebugstring(_t( "wscgetproviderpath error! ")); return wsaeproviderfailedinit; } break; } } if(!expandenvironmentstrings(filterpath,filterpath,max_path)) { outputdebugstring(_t( "expandenvironmentstrings error! ")); return wsaeproviderfailedinit; } if((hfilter=loadlibrary(filterpath))==null) { outputdebugstring(_t( "loadlibrary error! ")); return wsaeproviderfailedinit; } if((wspstartupfunc=(lpwspstartup)getprocaddress(hfilter, "wspstartup "))==null) { outputdebugstring(_t( "getprocessaddress error! ")); return wsaeproviderfailedinit; } if((errorcode=wspstartupfunc(wversionrequested,lpwspdata,lpprotoinfo,upcalltable,lpproctable))!=error_success) { outputdebugstring(_t( "wspstartupfunc error! ")); return errorcode; } nextproctable=*lpproctable; //lpproctable-> lpwspsendto=wspsendto; lpproctable-> lpwsprecvfrom=wsprecvfrom; freefilter(); return 0; } | | |
|