您的位置:程序门 -> vc/mfc -> 网络编程



请教关于spi的一个函数wscinstallprovider


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教关于spi的一个函数wscinstallprovider
发表于:2007-02-01 16:42:36 楼主
我在用wscinstallprovider的时候,发现指定的dll好像从来不能载入      
    格式为      
    wscinstallprovider(&filterguid,filter_path,&iplayerinfo,1,&errorcode)      
    即使把dll路径改成莫须有的路径,也能执行成功,但是结果显然不对      
       
    另外      
    在安装完自己的服务提供者之后      
    好像dns不能解析了      
    比如上网只能用ip了      
    把自己的服务提供者卸掉,又行了      
       
    大家遇到过的话,请指点一下。      
    谢谢      
发表于: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;
}

发表于:2007-02-01 16:55:472楼 得分:0
exe里
#define     unicode          
#define     _unicode                  

#include   <stdio.h>
#include   <tchar.h>
#include   <string.h>
#include   <ws2spi.h>
#include   <sporder.h>
                                                     
guid     filterguid={0x4d1e91fd,0x116a,0x44aa,{0x8f,0xd4,0x1d,0x2c,0xf2,0x7b,0xd9,0xa9}};

guid     filterchainguid={0xd3c21121,0x85e1,0x48f3,{0x9a,0xb6,0x23,0xd9,0x0c,0x73,0x07,0xef}};

bool     getfilter();
void     freefilter();
void     installfilter();
void     removefilter();
void     start();
void     usage();

int                                       totalprotos=0;
dword                                   protoinfosize=0;
lpwsaprotocol_infow       protoinfo=null;
int   main(int   argc,char   *argv[])                      
{
start();

if(argc==2)
{
if(strcmp(argv[1], "-install ")==0)      
{
installfilter();
return   0;
}
else   if(strcmp(argv[1], "-remove ")==0)    
{
removefilter();
return   0;
}
}
usage();
return   0;
}

bool   getfilter()
{
int     errorcode;

protoinfo=null;
totalprotos=0;
protoinfosize=0;

if(wscenumprotocols(null,protoinfo,&protoinfosize,&errorcode)==socket_error)
{
if(errorcode!=wsaenobufs)
{
_tprintf(_t( "first   wscenumprotocols   error:   %d\n "),errorcode);
return   false;
}
}

if((protoinfo=(lpwsaprotocol_infow)globalalloc(gptr,protoinfosize))==null)
{
_tprintf(_t( "globalalloc   in   getfilter   error:   %d\n "),getlasterror());
return   false;
}

if((totalprotos=wscenumprotocols(null,protoinfo,&protoinfosize,&errorcode))==socket_error)
{
_tprintf(_t( "second   wscenumprotocols   error:   %d\n "),getlasterror());
return   false;
}

_tprintf(_t( "found   %d   protocols!\n "),totalprotos);  
return   true;
}

void   freefilter()
{
globalfree(protoinfo);
}

void   installfilter()
{
int                                 i;
int                                 provcnt;
int                                 cataindex;
int                                 errorcode;
bool                               rawip=false;
bool                               udpip=false;
dword                             iplayercataid=0,udporigcataid=0;
tchar                             filter_path[max_path];                        
tchar                             filter_name[max_path];
tchar                             chainname[wsaprotocol_len+1];            
lpdword                         cataentries;
wsaprotocol_infow     iplayerinfo,udpchaininfo,chainarray[1];

getfilter();
       
for(i=0;i <totalprotos;i++)
{
if(!rawip
&&   protoinfo[i].iaddressfamily==af_inet
&&   protoinfo[i].iprotocol==ipproto_ip)
{
rawip=true;
memcpy(&iplayerinfo,&protoinfo[i],sizeof(wsaprotocol_infow));
iplayerinfo.dwserviceflags1=protoinfo[i].dwserviceflags1   &   (~xp1_ifs_handles);
}

if(!udpip
&&   protoinfo[i].iaddressfamily==af_inet
&&   protoinfo[i].iprotocol==ipproto_udp)
{
udpip=true;
udporigcataid=protoinfo[i].dwcatalogentryid;
memcpy(&udpchaininfo,&protoinfo[i],sizeof(wsaprotocol_infow));
udpchaininfo.dwserviceflags1=protoinfo[i].dwserviceflags1   &   (~xp1_ifs_handles);
}
}

_tcscpy(iplayerinfo.szprotocol,_t( "t-ipfilter "));
iplayerinfo.protocolchain.chainlen=layered_protocol;

if(getcurrentdirectory(max_path,filter_path)==0)
{
_tprintf(_t( "getcurrentdirectory   error:   %d\n "),getlasterror());
return   ;
}
_tcscpy(filter_name,_t( "\\ce1.dll "));    
_tcscat(filter_path,filter_name);

if(wscinstallprovider(&filterguid,/*filter_path*/_t( "ce1.dll "),&iplayerinfo,1,&errorcode)==socket_error)
{
_tprintf(_t( "wscinstallprovider   error:   %d\n "),errorcode);
return   ;
}

freefilter();

getfilter();

for(i=0;i <totalprotos;i++)
{
if(memcmp(&protoinfo[i].providerid,&filterguid,sizeof(guid))==0)
{
iplayercataid=protoinfo[i].dwcatalogentryid;
break;
}
}

provcnt=0;
if(udpip)
{
_tcscpy(chainname,_t( "t-udpfilter "));
_tcscpy(udpchaininfo.szprotocol,chainname);

if(udpchaininfo.protocolchain.chainlen==base_protocol)
{
udpchaininfo.protocolchain.chainentries[1]=udporigcataid;
}
else
{
for(i=udpchaininfo.protocolchain.chainlen;i> 0;i--)
{
udpchaininfo.protocolchain.chainentries[i+1]=udpchaininfo.protocolchain.chainentries[i];
}
}

udpchaininfo.protocolchain.chainlen++;
udpchaininfo.protocolchain.chainentries[0]=iplayercataid;

memcpy(&chainarray[provcnt++],&udpchaininfo,sizeof(wsaprotocol_infow));
}

if(wscinstallprovider(&filterchainguid,/*filter_path*/_t( "ce1.dll "),chainarray,provcnt,&errorcode)==socket_error)
{
_tprintf(_t( "wscinstallprovider   for   chain   error:   %d\n "),errorcode);
return   ;
}

freefilter();

getfilter();

if((cataentries=(lpdword)globalalloc(gptr,totalprotos*sizeof(wsaprotocol_infow)))==null)
{
_tprintf(_t( "globalalloc   int   installfilter   error:   %d\n "),errorcode);
return   ;
}

cataindex=0;
for(i=0;i <totalprotos;i++)
{
if(memcmp(&protoinfo[i].providerid,&filterguid,sizeof(guid))==0  
¦ ¦   memcmp(&protoinfo[i].providerid,&filterchainguid,sizeof(guid))==0)
{
cataentries[cataindex++]=protoinfo[i].dwcatalogentryid;
}
}

for(i=0;i <totalprotos;i++)
{
if(memcmp(&protoinfo[i].providerid,&filterguid,sizeof(guid))!=0  
&&   memcmp(&protoinfo[i].providerid,&filterchainguid,sizeof(guid))!=0)
{
cataentries[cataindex++]=protoinfo[i].dwcatalogentryid;
}
}

if((errorcode==wscwriteproviderorder(cataentries,totalprotos))!=error_success)
{
_tprintf(_t( "wscwriteproviderorder   error:   %d\n "),getlasterror());
return   ;
}

freefilter();

_tprintf(_t( "\ninstall   ip   filter   successfully "));
return   ;
}

void   removefilter()
{
int     errorcode;
bool   signal=true;

if(wscdeinstallprovider(&filterguid,&errorcode)==socket_error)
{
_tprintf(_t( "wscdeinstall   filterguid   error:   %d\n "),errorcode);
signal=false;
}

if(wscdeinstallprovider(&filterchainguid,&errorcode)==socket_error)
{
_tprintf(_t( "wscdeinstall   filterchainguid   error:   %d\n "),errorcode);
signal=false;
}

if(signal)
{
_tprintf(_t( "deinstall   ip   filter   successfully "));
}
return   ;
}

void     start()
{
//_tprintf(_t( "install   ip   filter,   by   too2y\n "));
//_tprintf(_t( "e-mail:   too2y@safechina.net\n "));
//_tprintf(_t( "homepage:   www.safechina.net\n "));
//_tprintf(_t( "date:   10-29-2002\n\n "));
return   ;
}

void     usage()
{
_tprintf(_t( "usage:     instif     [   -install   │   -remove   ]\n "));
return   ;
}


发表于:2007-02-02 01:19:213楼 得分:0
发表于:2007-02-02 08:45:084楼 得分:0
关注
发表于:2007-02-17 20:08:175楼 得分:0
该回复于2007-12-28 17:20:06被管理员或版主删除
发表于:2007-03-08 15:05:486楼 得分:0
我也在关注,顶一下


快速检索

最新资讯
热门点击