电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

深度剖析WinPcap之(八)——打开与关闭适配器(8)VIP免费

深度剖析WinPcap之(八)——打开与关闭适配器(8)_第1页
1/5
深度剖析WinPcap之(八)——打开与关闭适配器(8)_第2页
2/5
深度剖析WinPcap之(八)——打开与关闭适配器(8)_第3页
3/5
深度剖析WinPcap之(八)——打开与关闭适配器(8)2009-09-2621:38:25标签:关闭打开适配器[推送到技术圈]版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://eslxf.blog.51cto.com/918801/2064201.5.2.1.1PacketOpenAdapterNPF函数函数PacketOpenAdapterNPF()的作用是打开一个使用NPF设备驱动的适配器。该函数被PacketOpenAdapter()与AddAdapter()作为内部函数调用。函数原型如下:LPADAPTERPacketOpenAdapterNPF(PCHARAdapterNameA);参数AdapterNameA字符串包含待打开设备的名称。函数如果成功,返回一个已经正确初始化的ADAPTER对象的指针。否则返回NULL。函数的主要代码如下:LPADAPTERPacketOpenAdapterNPF(PCHARAdapterNameA){LPADAPTERlpAdapter;…CHARSymbolicLinkA[MAX_PATH];//NPF_DRIVER_NAME定义为"NPF"CHARNpfDriverName[MAX_WINPCAP_KEY_CHARS]=NPF_DRIVER_NAME;CHARNpfServiceLocation[MAX_WINPCAP_KEY_CHARS];/*连接到服务控制管理器*/scmHandle=OpenSCManager(NULL,NULL,GENERIC_READ);if(scmHandle==NULL){//连接到服务控制管理器失败error=GetLastError();}else{/**检查NPF服务是否已经存在,*如果存在则接下来可以分配并初始化ADAPTER对象*///设置NPF服务的注册表位置StringCchPrintfA(NpfServiceLocation,sizeof(NpfServiceLocation),"SYSTEM\\CurrentControlSet\\Services\\%s",NpfDriverName);//检查NPF注册表的键值是已否存在,如果已经存在,//这意味着驱动已经安装,//我们不再需要调用PacketInstallDriver()函数安装驱动程序KeyRes=RegOpenKeyExA(HKEY_LOCAL_MACHINE,NpfServiceLocation,0,KEY_READ,&PathKey);if(KeyRes!=ERROR_SUCCESS){//NPF注册表的键值不存在,调用PacketInstallDriver()函数Result=PacketInstallDriver();}else{//NPF注册表的键值已经存在,驱动已经安装Result=TRUE;RegCloseKey(PathKey);}if(Result){//驱动已经存在,检查NPF服务是否正在运行//打开NPF服务svcHandle=OpenServiceA(scmHandle,NpfDriverName,SERVICE_START|SERVICE_QUERY_STATUS);if(svcHandle!=NULL){//获得服务状态QuerySStat=QueryServiceStatus(svcHandle,&SStat);if(!QuerySStat||SStat.dwCurrentState!=SERVICE_RUNNING){//获得服务状态失败或驱动NPF没有运行,启动NPF服务if(StartService(svcHandle,0,NULL)==0){//如果不是服务正在运行或服务已经存在的状态,//就处理错误,函数返回NULLerror=GetLastError();if(error!=ERROR_SERVICE_ALREADY_RUNNING&&error!=ERROR_ALREADY_EXISTS){//处理错误,函数返回NULL…returnNULL;}}}//驱动NPF已正常运行,关闭服务控制管理器的句柄CloseServiceHandle(svcHandle);svcHandle=NULL;}else{//打开NPF服务失败error=GetLastError();SetLastError(error);}}else{if(KeyRes!=ERROR_SUCCESS){//第一次安装驱动程序失败,并且NPF注册表的键值不存在//再次安装驱动Result=PacketInstallDriver();}elseResult=TRUE;if(Result){//NPF的驱动程序已存在//打开NPF服务svcHandle=OpenServiceA(scmHandle,NpfDriverName,SERVICE_START);if(svcHandle!=NULL){//打开NPF服务成功,获取NPF服务的状态QuerySStat=QueryServiceStatus(svcHandle,&SStat);if(!QuerySStat||SStat.dwCurrentState!=SERVICE_RUNNING){//获得服务状态失败或驱动NPF没有运行,启动NPF服务if(StartService(svcHandle,0,NULL)==0){//如果不是服务正在运行或服务已经存在的状态,//就处理错误,函数返回NULLif(error!=ERROR_SERVICE_ALREADY_RUNNING&&error!=ERROR_ALREADY_EXISTS){…returnNULL;}}}//驱动NPF已正常运行,关闭服务控制管理器的句柄CloseServiceHandle(svcHandle);svcHandle=NULL;}else{//打开NPF服务失败,设置错误状态error=GetLastError();SetLastError(error);}}}}if(scmHandle!=NULL)//关闭服务控制管理器的句柄CloseServiceHandle(scmHandle);/*分配ADAPTER结构体的的内存空间*/lpAdapter=(LPADAPTER)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(ADAPTER));if(lpAdapter==NULL){//分配失败,函数返回NULL;…returnNULL;}//设置单个数据包发送的次数为一次lpAdapter->NumWrites=1;//从原始的设备名创建NPF设备的名称#defineDEVICE_PREFIX"\\Device\\"if(LOWORD(GetVersion())==4){//操作系统为WindowsNT4.0、Windows95、Windows98、或WindowsMe的处理…}else{if(strlen(AdapterNameA)>strlen(DEVICE_PREFIX)){StringCchPrintfA(SymbolicLinkA,MAX_PATH,"\\\\.\\Global\\%s",AdapterNameA+strlen(DEVICE_PREFIX));}else{ZeroMemory(SymbolicLinkA,sizeof(SymbolicLinkA));}}---------------待续---------------------------------本文出自“千江月”博客,请务必保留此出处http://eslxf.blog.51cto.com/918801/206420

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

深度剖析WinPcap之(八)——打开与关闭适配器(8)

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部