资源描述:
《深度剖析winpcap之(八)——打开与关闭适配器(8)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、深度剖析WinPcap之(八)——打开与关闭适配器(8)2009-09-2621:38:25 标签:关闭打开适配器 [推送到技术圈]版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://eslxf.blog.51cto.com/918801/2064201.5.2.1.1 PacketOpenAdapterNPF函数函数PacketOpenAdapterNPF()的作用是打开一个使用NPF设备驱动的适配器。该函数被PacketOpenAdapt
2、er()与AddAdapter()作为内部函数调用。函数原型如下:LPADAPTERPacketOpenAdapterNPF(PCHARAdapterNameA);参数AdapterNameA字符串包含待打开设备的名称。函数如果成功,返回一个已经正确初始化的ADAPTER对象的指针。否则返回NULL。函数的主要代码如下:LPADAPTERPacketOpenAdapterNPF(PCHARAdapterNameA){LPADAPTERlpAdapter;…CHARSymbolicLinkA[MAX_PATH];//NPF_D
3、RIVER_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服务是否已经存在,*如果存
4、在则接下来可以分配并初始化ADAPTER对象*///设置NPF服务的注册表位置StringCchPrintfA(NpfServiceLocation,sizeof(NpfServiceLocation),"SYSTEM\CurrentControlSet\Services\%s",NpfDriverName);//检查NPF注册表的键值是已否存在,如果已经存在,//这意味着驱动已经安装,//我们不再需要调用PacketInstallDriver()函数安装驱动程序KeyRes=RegOpenKeyExA(HKEY_LO
5、CAL_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=Open
6、ServiceA(scmHandle,NpfDriverName,SERVICE_START
7、SERVICE_QUERY_STATUS);if(svcHandle!=NULL){//获得服务状态QuerySStat=QueryServiceStatus(svcHandle,&SStat);if(!QuerySStat
8、
9、SStat.dwCurrentState!=SERVICE_RUNNING){//获得服务状态失败或驱动NPF没有运行,启动NPF服务if(StartService(svcHandle,0,NULL)==0)
10、{//如果不是服务正在运行或服务已经存在的状态,//就处理错误,函数返回NULLerror=GetLastError();if(error!=ERROR_SERVICE_ALREADY_RUNNING&&error!=ERROR_ALREADY_EXISTS){//处理错误,函数返回NULL…returnNULL;}}}//驱动NPF已正常运行,关闭服务控制管理器的句柄CloseServiceHandle(svcHandle);svcHandle=NULL;}else{//打开NPF服务失败error=GetLastErro
11、r();SetLastError(error);}}else{if(KeyRes!=ERROR_SUCCESS){//第一次安装驱动程序失败,并且NPF注册表的键值不存在//再次安装驱动Result=PacketInstallDriver();}elseResult=TRUE;if(Res