编程实现重起网卡等设备

Windos下通过Wpcap抓包实现两个网卡桥接   1. 背景:           一台电脑允许接多个网口,当然大部分只有一个网口其余都是USB扩展而来,而每个网口之间需要配置不同的网段IP,这就造成了和同一台电脑不通网口相连的设备处于不通的网段,虽然电脑与两台设备沟通无压力,但是两台设备间通信由于处于不通网段而变得相对比较困难。对于开发人员,这并不是一个问题,直接接到交换机或者HUB上一样工作。。。而且扩展性也无与伦比。。。对一般win... 阅读详情

编程实现重起网卡等设备

    今天水木上有位朋友问我如何卸载WinPCap的驱动。因为此类驱动跟网卡绑定很紧密,
卸载的时候最好是要把网卡重起一下(SnifferPro就是如此)。而重起网卡的程序实现又很
少有资料介绍,前段时间好容易看到一篇文章,居然是用字符串查找到控制面板下面调用ap
plet,呵呵,够狠 -_-b。刚好前几个月有同事有类似需求,我写过一个命令行下重起网卡
的小工具,就把它翻出来大概介绍一下实现思路。

    首先是要找到需要操作的网卡的ID,这个功能实现的方法很多:最常见的是Winpcap的p
acket32.c里面提供的直接从注册表中枚举的方法;另外一种方法则是使用DDK中提供的Devi
ce Installation系列函数完成。
    枚举注册表的方法需要打开HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/
Class/{4D36E972-E325-11CE-BFC1-08002bE10318}注册表键,{4D36E972-E325-11CE-BFC1-0
8002bE10318}是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_NODISPLAYC
LASS, 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 Proper
ty) 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)
{
  // ...
}

 


    满足上述限制的设备,就是我们要处理的网卡。可以直接修改其状态:SetupDiSetClas
sInstallParams函数设置参数;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_CONFIGSPEC
IFIC : 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); // 禁用

深度解剖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的专栏 4605

注册表获取系统驱动版本信息

MSDN设备GUID定义:System-Defined Device Setup Classes Available to Vendors 一、设备GUID 位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class  Battery Devices Class = BatteryClassGuid = {72631

Greless的后花园 9047

双网卡服务器SOCKET编程指定客户端通信网卡

网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题: 在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从哪个网卡发数据包出去,即使你在此之前把该 SOCKET 绑定到了另一个网卡上。这样一来,如果你执行了绑定,则在 UDP 包中所代表的源 IP 字段可能不是你的数据包真正发出的地址。 比如:你有两个网卡分别为:A—192.168.1.100; B-192.168.2.100;mask-255.255.2...

phymat.nico的专栏 2272

硬件设备GUID

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class :是设备安装类GUID HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses:设备接口类GUID 计算机管理属性中的信息: 计算机中有各种个样的设备类型,这些设备类型被微软用固定的GUID来标识了,这些GUID对实际编程是有很大关系的,用错了会麻烦,我查了一下文档,把查到的设备类型的GUID列在下面供大家参考: 13

answer966480的博客 1455

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

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

DevProZ的博客 707

PowerBuilder实现网卡状态控制程序设计

应用编程接口(API)是现代操作系统与软件开发人员之间的桥梁。在网络管理的上下文中,API允许程序以标准化的方式与网络硬件交互,无论是启用还是禁用网卡。API的存在使得开发者能够专注于业务逻辑,而无需深入底层硬件的复杂性。API提供了定义良好的函数集,能够执行如获取网卡状态、修改配置、启用和禁用网卡等任务。一些常见的跨平台API和操作系统特定的API在网卡管理中扮演了重要角色。例如,Windows平台中的Win32 API提供了诸如和。

weixin_32324637的博客 1058

常见设备的GUID

用SetupDi*类函数可以进行设备管理,其中就要用到设备类的GUID。    全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装。在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID。    GUID 的格式为“xxxxxxx

eric422113的专栏 1万+

DELPHI编程实现网络连接管理与网卡驱动控制

本文还有配套的精品资源,点击获取 简介:在IT行业中,网络连接管理是常见任务,涉及到网卡驱动的控制。本文详细介绍了如何使用DELPHI编程语言来启用和禁用网卡驱动,实现网络的断开与连接。介绍了相关Windows API函数的使用,并提供了一个自定义组件的创建方法,用于封装网络适配器的管理功能。还讨论了如何通过用户界面组件来实现对网络适配器的控制,以及相关的权限问题。 ...

weixin_42168902的博客 938

网卡设备驱动之虚拟网卡

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

qq_42230338的博客 1823

网卡修改mac地址 reg格式的

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\0011 看到0011了,这个就是你的设备信息项,在这个里面找到你要修改的网卡,然后修改reg文件里面的数值!!

手把手教你用LTspice仿真扬声器阻抗曲线(附Dayton/Focal型号库)

本文详细介绍了如何使用LTspice仿真软件构建高精度扬声器模型,包括获取Dayton/Focal等厂商的SPICE模型库、模型导入方法、阻抗测试电路搭建及仿真设置。通过手把手教学,帮助读者快速掌握扬声器阻抗曲线的仿真技术,提升音响系统设计效率。

weixin_26897585的博客 391

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

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

Robert Zhang 2007

python实现ECMS算法

ECMS(Equivalent Consumption Minimization Strategy)算法是一种用于混合动力汽车能量管理系统的优化策略。它通过计算等效油耗来平衡电池电量消耗和燃油消耗,从而优化整体能耗。以下是一个简单的Python实现,用于演示ECMS算法的基本思想。这个实现假设了一个简单的混合动力汽车模型,其中电池电量和燃油消耗是主要的优化目标。

weixin_45570158的博客 924

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

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

weixin_33622555的博客 2381

3D点云处理:PointNet++与PointTransformer的对比

摘要: 3D点云处理中,PointNet++和PointTransformer是两种主流深度学习模型。PointNet++通过分层采样和分组策略提取局部特征,而PointTransformer利用自注意力机制捕捉全局上下文。实验表明,PointTransformer在分类(ModelNet40准确率92.1%)和分割(ShapeNet mIoU 85.7%)任务上性能更优,但计算开销较大(训练时间180秒/轮)。PointNet++在实时性场景更具优势(训练时间120秒/轮)。未来可结合两者优势,或优化Tr

shejizuopin的博客 1122

Power BI----各类切片器的使用

首先介绍切片器的最基础的创建和效果演示,紧跟着介绍切片器在多页中的同步和本身与报表的联动,再然后介绍关于切片器属性的设置,使得交互更加美观,最后介绍几种很好看的第三方的切片器样式和自己构建的可折叠的切片器.........

Itsme_MrJJ的博客 2万+

数据从网卡到应用的过程

欢迎访问陈同学博客原文 最近看的《网络是怎样连接的》非常有趣,真的是 “计算机网络概论” 图解趣味版。 本文写写数据从网卡到应用的过程,内容与图片很多整理自《网络是怎样连接的》、《Tomcat内核设计与剖析》,有的图片因清晰度不够我进行了重绘。 总览 本文围绕这张图从下至上展开。假设一个HTTP请求的数据到达网卡,那数据是如何被层层处理并到达应用呢? 网卡 网卡(Network Adapte...

码代码的陈同学 3523

从FER2013到AffectNet:表情识别数据集十年演进史与你的项目选型攻略

本文回顾了从FER2013到AffectNet等主流人脸表情识别数据集的十年演进历程,详细分析了各数据集的特点、适用场景及技术突破。针对不同项目需求,提供了从移动端应用到高精度研究的选型策略,特别强调AffectNet在现代FER项目中的核心价值,并给出混合数据集构建的实战方案。

weixin_26808439的博客 522

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

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

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

【SLAM】探索explore_lite在移动机器人自主建图中的高效边界检测策略

本文深入解析了explore_lite在移动机器人自主建图中的应用,重点探讨了其高效的贪婪边界检测策略。该工具包专为资源受限平台设计,通过直接利用SLAM生成的地图信息,以极低的计算开销实现快速、稳定的未知区域探索,并与move_base导航框架无缝协作,是轻量级机器人自主探索的优选方案。

purple的博客 1067

Cadence OrCAD Capture原理图中为功能模块分配ROOM的方法

本文详解介绍原理图设计阶段为原理图模块分配ROOM的方法。

fydar的博客 1349

如何编程实现启用禁用网卡

/*****************************************************************************演示如何编程实现启用禁用网卡Mady By ZwelL2004.7.29zwell@sohu.com************************************************************************...

javatoyou 617

Xilinx FPGA ICAP原语实现多重配置

众所周知,常见的FPGA通常为SRAM结构,固件程序一般存放在外置的串行Flash中,比如SPI Flash,M25P16或N25Q128等。 FPGA启动时,一般先从SPI起始地址开始加载数据到内部的SRAM,加载完成、校验通过则会直接运行。 那么有没有可能在SPI Flash中存放两个或多个FPGA固件呢?

whik1194的博客 4614

网卡

网卡又被称为网络适配器或网络接口卡NIC(Network Interface Card),被设计用来允许计算机在计算机网络上进行通讯的计算机硬件;是构成计算机网络系统中最基本、最重要、必不可少的连接设备,计算机依靠网卡接入网络。

笔落_惊风雨的博客 3127

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Infiniband网卡安装、使用总结

最近多次安装、使用infiniband网卡,每次都要到处寻找相关资料,所以决定做此总结,方便查找。 1. 基础知识 首先,得了解什么是RDMA,贴几个资料: 深入浅出全面解析RDMA RDMA技术详解(一):RDMA概述 RDMA技术详解(二):RDMA Send Receive操作 然后得了解如何实现,这两个可以有个初步了解: RDMA编程:事件通知机制 RDMA read and write with IB verbs 编程过程,真正有用的还是官方的手册: RDMA Aware Networks P.

分享观点和经验,欢迎交流。 6109

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 用WIN Server 2003架设小型邮件服务器
下一篇: 重新设置HP-UX 11.0核心
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值