编程实现重起网卡等设备

Windos下通过Wpcap抓包实现两个网卡桥接   1. 背景:           一台电脑允许接多个网口,当然大部分只有一个网口其余都是USB扩展而来,而每个网口之间需要配置不同的网段IP,这就造成了和同一台电脑不通网口相连的设备处于不通的网段,虽然电脑与两台设备沟通无压力,但是两台设备间通信由于处于不通网段而变得相对比较困难。对于开发人员,这并不是一个问题,直接接到交换机或者HUB上一样工作。。。而且扩展性也无与伦比。。。对一般win... 阅读详情
今天 水木上有位朋友问我如何卸载 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.blogcn.com/user8/flier_lu/blog/1243576.html
深度解剖Linux内核【网卡设备驱动】 Linux设备驱动分三种,包括字符设备驱动、块设备驱动和网络设备驱动。字符设备只能按字节流先后顺序访问设备内存,不能随机访问。鼠标、触摸屏、LCD等是字符设备的代表。块设备可以随机访问设备内存的任意地址,硬盘、SD卡、NAND FLASH是块设备的代表。网络设备指的是网卡一类使用socket套接字进行通信的设备。本文以字符设备为例讲述相关知识。Linux字符设备驱动剖析Linux 设备文件的创建和mdev从可以看出,应用层访问设备驱动非常简单,即是通过open接口来最终获得设备驱动的操作接口集struct 阅读详情

相关推荐

关于USB无线网卡实现

本文主要介绍了USB无线网卡实现方案,涉及基于微软NDIS框架下的网卡驱动开发,802.11无线协议开发,USB协议开发部分。NDIS框架式微软专门针对网络设备设计的接口。由于是USB接口,所以需要一个WDM的底层作为NDIS miniport驱动的物理访问接口。作为无线网卡,对802.11协议的实现是本文很要的一个内容。关键词:NDIS WDM USB 802.111,  项目介绍

iwub的专栏 4600

获取网速 GetIfTable SetupDixxx 区分物理网卡

自己实现的区分物理网卡获取其网速的程序 没有实现hook其他进程 获得网速的功能

USB无线网卡的用途及编程实现

然后,我们断开当前的WiFi连接,并创建一个新的WiFi配置文件,设置无线网络的名称、身份验证算法、加密算法和密码。通过编程实现,我们可以控制USB无线网卡,连接到无线网络并实现相关功能。为了通过编程实现USB无线网卡的功能,我们可以使用一些常见的编程语言和库来控制无线网卡。在下面的示例中,我们将使用Python编程语言和pywifi库来演示如何使用USB无线网卡连接到无线网络。移动设备的无线连接:USB无线网卡还可以用于连接移动设备,如笔记本电脑、平板电脑或智能手机,以便它们可以通过无线网络访问互联网。

DevProZ的博客 702

C++ 实现Windows系统设备枚举

1.枚举系统设备 HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD dwDevID; // 得到所有设备 HDEVINFO  hDevInfo = SetupDiGetClassDevs(NULL, 0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES);//根据此处参数不同可分类枚举设备,这

叶阳的博客 6498

win c++ 枚举设备驱动状态

#include   #include #pragma comment(lib,"Setupapi.lib") bool IsDeviceDisabled(DWORD dwDevID, HDEVINFO hDevInfo, DWORD &dwStatus) { SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)};

d2262272d的博客 2136

一个可以禁用USB存储设备的程序(SetupAPI的使用方法)

一个可以禁用USB存储设备的程序(SetupAPI的使用方法)                                                                                 作者:WY.lslrt                                                                             

8871

在程序中移除U盘

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  欢迎大家拍砖   代码下载(VS2008编译器):http://www.rayfile.com/zh-cn/files/4e98c7cf-25c4-11e2-aeea-0015c55db73d/ 一、实现方法 说明: cr = CM_Request_Device_Eject( DeviceIn

chenyujing1234的专栏 6944

禁用启用网卡

//   Hardware.cpp   :   Implementation   of   CHardware#include   "stdafx.h"#include   "NetCA_HARDWARE.h"#include   "Hardware.h"#define   UnknownDevice   TEXT("")//////////////////////////////////////

萤火虫之光 1962

2.8-局域网查找设备时有虚拟网卡干扰的编程处理方法(网络UDP广播包发不出去)

一、遇到问题的描述 在开发“局域网查找设备”这个功能时候,一般都会使用局域网广播技术。常见的问题时在编写程序的时候在自己电脑上使用没有问题,但是在用户或测试机器上,出现“无法查找到设备的问题”。使用WireShark软件监听局域网,可以发现是在自己软件查找设备的时候,没有正常发送出去局域网广播。 二、找到问题的真正原因 初步找到原因 既然是广播没有发送出去,那就开始调试与测试,经过在多台电脑上对...

Robert Zhang 1993

网卡设备驱动之虚拟网卡

网卡驱动程序框架 网卡驱动程序“收发功能”: 只要把上层的数据发给网卡,从网卡来的数据构造成包给上层即可。网卡只需要 “socket”编程,不需要打开某设备。 驱动程序都是以面向对象的思想写的,都有相关的结构体。 编程步骤 1,分配某结构体:net_device 2,设置结构体。 ①,提供一个发包函数:hard_start_xmit() ②,提供收包的功能 : net_interrupt(int ...

qq_42230338的博客 1817

linux下多网卡加组播,linux 在多网卡下的设备的UDP 组播问题总结

参考博文:解决接收不到组播包的问题 - Justlinux2010的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/justlinux2010/article/details/111403831、问题描述实现在多网卡设备上发送组播消息,实现设备搜索,并接收通过组播返回的搜索信息。设备为多网卡nvr,有一个常规网卡和一个PPPOE口;在进行发送组播搜索ipc时,只可...

weixin_33622555的博客 2370

科普篇 |什么是网卡?相比传统网卡,智能网卡(SmartNIC)有何特点?

什么是网卡网卡,全称为网络接口卡(Network Interface Card,简称NIC),是计算机硬件中的一种设备,用于将计算机接入局域网(LAN)。它通过插在计算机主板的总线插槽中,负责将用户要传递的数据转换为网络设备能够识别的格式,并通过网络介质进行传输。网卡的基本功能包括数据的封装和解封、地址解析、数据校验等。什么是智能网卡?智能网卡(SmartNIC),也称为智能网络适配器,是在传统...

ICT系统集成实战派博主|深耕数通/云计算/网络安全/系统集成领域,聚焦华为/思科/华三/锐捷设备配置、项目排障与落地实战。 3179

设备驱动安装程序设计(一)

设计驱动安装程序(一)Written by 张佩mail: changpei1982@gmail.com目录硬件主导安装... 2软件主导安装... 2安装驱动包... 2安装设备... 4设备正连接... 4设备未连接... 5枚举系统设备... 8分析INF文件... 11DrvInst介绍... 14制作软件安装包... 16视图介绍... 17我们的工程... 19编译执行... 20上一章讲完了安装文件,在这一章中,笔者要和大家一起设计一个软件,用来安装驱动程序。软件安装,本质

张佩的技术库 1万+

Windows环境下设备枚举工具的实现与应用

本文还有配套的精品资源,点击获取 简介:在Windows操作系统中,枚举设备获取系统硬件信息的关键任务。使用"EnumDevices"程序或库,开发者能遍历并列出所有可用设备。该项目通常包含多个源代码文件,涉及设备枚举逻辑、用户界面设计以及资源定义等。开发者通常使用Windows API函数进行设备信息的获取和枚举。最终,程序将设备信息展示在对话框中,并允许用户进行交互操...

weixin_36123300的博客 1796

用代码实现"停用/启用"网络连接

代码如下:BOOL NetConnect(BOOL bConnect){CoInitialize(NULL) ;BOOL bReturn = FALSE ;HRESULT hr ;CComPtr spShell ;// search "Shell Object" in MSDNhr = spShell.CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INP

lbird 3678

USB设备的驱动状态

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\cfg.h // // Device Instance status flags, returned by call to CM_Get_DevInst_Status // #define DN_ROOT_ENUMERATED (0x00000001) // Was enumerat

山不在高,有金则名 6424

禁用和启用网卡.使用windows DDK

 #include SetupAPI.h>   #include cfgmgr32.h>     #include list>using namespace std;//     cfgmgr32.h 在Microsoft Windows 2000 DDK 中.   //     要用 CM_Get_DevNode_Status(...) 来查询状态.   //--------------

windows 驱动 反汇编 逆向 2984
上一篇: 对抗packer-AntiMida 1.0
下一篇: A tool to generate an NT KMD framework in C- QUICKSYS
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值