电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> ASP
编程实现重起网卡等设备-ASP教程,脚本编码
作者:网友供稿 点击:23
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
今天水木上有位朋友问我如何卸载winpcap的驱动。因为此类驱动跟网卡绑定很紧密,卸载的时候最好是要把网卡重起一下(snifferpro就是如此)。而重起网卡的程序实现又很少有资料介绍,前段时间好容易看到一篇文章,居然是用字符串查找到控制面板下面调用applet,呵呵,够狠 -_-b。刚好前几个月有同事有类似需求,我写过一个命令行下重起网卡的小工具,就把它翻出来大概介绍一下实现思路。
     
     首先是要找到需要操作的网卡的id,这个功能实现的方法很多:最常见的是winpcap的packet32.c里面提供的直接从注册表中枚举的方法;另外一种方法则是使用ddk中提供的device installation系列函数完成。
     枚举注册表的方法需要打开hkey_local_machine\system\currentcontrolset\control\class\{4d36e972-e325-11ce-bfc1-08002be10318}注册表键,{4d36e972-e325-11ce-bfc1-08002be10318}是net类型设备的id,下面每个子键定义一个网络设备,但只有一部分设备是网卡。具体处理方法请参见winpcap的packetgetadapternames函数。
     使用device installation api则首先用setupdigetclassdevs函数获取所有类型的设备,或者在此指定只获取特定类型设备。因为我那个程序原意是控制所有类型设备,就没有指定类型。
 
以下为引用:

 hdevinfo m_hdevinfo = ::setupdigetclassdevs(null, null, null, digcf_allclasses | digcf_present);
 

    
     然后使用setupdienumdeviceinfo枚举类型中所有的设备
 
以下为引用:

 sp_devinfo_data did = { sizeof(sp_devinfo_data) };  

 

 for(int i=0; ::setupdienumdeviceinfo(m_hdevinfo, i, &did); i++)
 {
    //... 
 }
 


   

 

     在找到要处理的设备后,应该用cm_get_devnode_status函数和注册表获取其状态,忽略被隐藏的设备。
 

以下为引用:

 bool cdevicemanager::isclasshidden(const guid *clsguid) const
 {
   hkey hkeyclass = ::setupdiopenclassregkey(clsguid, key_read);
   
   bool hidden = false;
   
   if(invalid_handle_value != hkeyclass)
   {
     hidden = error_success == ::regqueryvalueex(hkeyclass, regstr_val_nodisplayclass, null, null, null, null);
     
     ::regclosekey(hkeyclass);
   }
   
   return hidden;
 }

 

 dword dwstatus = 0, dwproblem = 0;

 if(cr_success != ::cm_get_devnode_status(&dwstatus, &dwproblem, did.devinst,0))
 {
   displayerror("cm_get_devnode_status");
   continue;
 }

 if(dwstatus & dn_no_show_in_dm || isclasshidden(&did.classguid))
 {
   continue;
 }    
 


    
     对剩下的设备则根据其class进行过滤,只处理net类型设备,如果前面指定只获取net设备则此步骤可以忽略。
 
以下为引用:

 

 const std::string cdevicemanager::getproperty(sp_devinfo_data& did, dword property) const
 {   
   std::string buf;
   dword dwlength = 0;

   while(!::setupdigetdeviceregistryproperty(m_hdevinfo, &did, property, null, 
     (pbyte)buf.c_str(), buf.size(), &dwlength))
   {
     if(::getlasterror() == error_insufficient_buffer)
     {
       buf.resize(dwlength * sizeof(wchar_t));
       std::fill(buf.begin(), buf.end(), \0);
     }
     else
     {
       break;
     }
   }
   buf.resize(strlen(buf.c_str()));

   return buf;
 }

 if(stricmp(getproperty(did, spdrp_classguid).c_str(), "{4d36e972-e325-11ce-bfc1-08002be10318}") == 0)
 {
   // ...
 }
 


    
     满足上述限制的设备,就是我们要处理的网卡。可以直接修改其状态:setupdisetclassinstallparams函数设置参数;setupdicallclassinstaller完成参数修改。
 
以下为引用:

 bool cdevicemanager::changedevicestate(sp_devinfo_data& did, dword state) const
 {
   sp_propchange_params pcp = {sizeof(sp_classinstall_header)};
   
   pcp.classinstallheader.installfunction = dif_propertychange;
   pcp.scope = (state == dics_start || state == dics_stop )? dics_flag_configspecific : dics_flag_global;
   pcp.statechange = state; 

 

   if(!::setupdisetclassinstallparams(m_hdevinfo, &did, 
     (sp_classinstall_header *)&pcp, sizeof(pcp)))
   {
     displayerror("setupdisetclassinstallparams");    
     return false;
   }
   
   //
   // call the classinstaller and perform the change.
   //
   if(!::setupdicallclassinstaller(dif_propertychange, m_hdevinfo, &did))
   {
     displayerror("setupdicallclassinstaller");
   }
   return true;
 }

 changedevicestate(did, dics_stop);    // 停止
 changedevicestate(did, dics_start);   // 启动
 changedevicestate(did, dics_enable);  // 启用
 changedevicestate(did, dics_disable); // 禁用


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·如何使XP的目录属性出现"安全"选项-ASP教程,系统相关
·创建有个性的对话框之MFC篇(二)-ASP教程,系统相关
·用InstallShield打包ASP程序-ASP教程,ASP应用
·windows server 2003 中 SQL Server 2000 分布式事务 错误解决方法-ASP教程,系统相关
·创建有个性的对话框之MFC篇(一)-ASP教程,系统相关
·DevExpress打印相关代码-ASP教程,打印相关
·File文件控件,选中文件(图片,flash,视频)即立即预览显示-ASP教程,组件开发
·用Windows的文件映射机制,实现大批量数据的快速存储-ASP教程,系统相关
·ADO如何取得数据库中表的字段信息之一
·使用DEVEXPRESS部件打印时标题的处理-ASP教程,打印相关

最新文章
· SQL注入天书 - ASP注入漏洞全接触
·用.net 处理xmlHttp发送异步请求
·asp.net创建文件夹的IO类的问题
·如何实现ASP.NET网站个性化
·关于ASP.NET调用JavaScript的实现
·ASP利用Google实现在线翻译功能
·Asp无组件生成缩略图
·由HTTP 500 Internal server error想到的...
·实例讲解asp抓取网上房产信息
·改mdb为asp所带来的灾难


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号