编程实现重起网卡等设备

本文介绍了一种通过编程方式重启Windows系统中网卡的方法。主要分为两个步骤:一是找到目标网卡的ID,可以通过枚举注册表或使用DeviceInstallation API实现;二是修改网卡状态,利用SetupDiSetClassInstallParams和SetupDiCallClassInstaller函数来实现。

编程实现重起网卡等设备

    今天水木上有位朋友问我如何卸载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); // 禁用

要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
内容概要:本文详细介绍了一种基于动态时间规整(DTW)距离与Kmeans聚类算法相结合的时间序列聚类分析模型,并提供了完整的Matlab代码实现。该模型通过引入DTW距离度量方式,有效解决了传统欧氏距离在处理长度不一或存在时间偏移的时间序列数据时的局限性,能够更准确地捕捉序列间的形状相似性。结合Kmeans算法,实现了对具有相似变化趋势的时间序列进行高效聚类,适用于电力负荷、气象数据、金融走势等领域中的模式识别与数据挖掘任务。文中系统阐述了算法原理、关键步骤、代码结构及参数设置,便于用户理解、复现与拓展应用。; 适合人群:具备一定Matlab编程基础,从事数据分析、信号处理、电力系统、自动化、气象预测、金融工程等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①对非等长时间序列或存在时间错位的数据进行聚类分析;②研究DTW与传统聚类算法融合的技术路径;③应用于负荷曲线分类、设备运行状态识别、金融市场走势划分、气候模式聚类、生物信号分析等实际科研与工程项目中的特征提取与数据降维任务。; 阅读建议:建议结合所提供的Matlab代码进行动手实践,点理解DTW距离矩阵的构建过程以及Kmeans在非欧式空间中的迭代优化机制,可通过加载真实数据集验证模型性能,并尝试将其扩展至其他聚类算法(如层次聚类、谱聚类)以比较效果差异。
内容概要:本文详细介绍了“谐波含量闭环调控的光储VSG并网自适应虚拟谐波阻抗策略”的Simulink仿真实现方法,聚焦于光伏发电与储能系统结合虚拟同步发电机(VSG)并网的技术背景,提出了一种能够动态调节谐波阻抗的自适应控制策略,旨在提升并网电能质量与系统稳定性。研究深入剖析了谐波闭环调控机制与虚拟阻抗自适应调整算法的设计原理,并通过构建完整的Simulink仿真模型进行验证,展示了在不同运行工况下有效抑制谐波电流、优化并网性能的能力。该策略对于高比例新能源接入条件下电网谐波治理和系统稳定运行具有要的理论价值与工程应用前景。; 适合人群:具备电力电子、新能源并网、自动控制等相关专业知识,从事电气工程、能源系统仿真与控制领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究光储系统并网过程中的谐波抑制与电能质量问题;②为VSG并网控制策略的优化设计提供可靠的仿真验证平台;③适用于新型电力系统中自适应控制算法开发与电能质量综合治理技术的研究; 阅读建议:建议结合Simulink仿真模型与技术文档同步学习,点关注控制逻辑实现细节与关键参数整定方法,可进一步拓展至多机并联、弱电网等复杂场景下的适应性分析,需具备MATLAB/Simulink基本操作能力。
内容概要:本文系统阐述了基于多面体聚合方法(包括内近似模型与闵可夫斯基和)对大规模电动汽车群体的可调能力(即功率容量)进行量化评估的研究,并配套提供了完整的Matlab代码实现。该方法通过构建单辆电动汽车充放电行为的多面体灵活性模型,利用内近似策略降低计算复杂度,并通过闵可夫斯基和运算实现对海量个体灵活性集合的聚合,从而精确刻画电动汽车集群在不同时间尺度下的总体可控功率边界。研究点在于平衡模型精度与计算效率,确保所提方法适用于实际电力系统中对电动汽车作为灵活资源的调度潜力分析,为电网侧的需求响应、辅助服务参与及新型电力系统规划提供理论支撑与实用工具。; 适合人群:电力系统、智能电网、电动汽车与电网互动(V2G)、可再生能源集成等领域的科研人员、高校研究生及工程技术人员,需具备良好的凸几何、集合论基础知识以及Matlab编程与数值计算能力。; 使用场景及目标:①评估大规模电动汽车集群在日内或日前尺度下的可调度功率范围,支撑电网公司制定削峰填谷、频率调节等调度策略;②为电力市场中的需求响应项目、辅助服务产品设计提供量化依据;③服务于城市级充电基础设施规划与主动配电网的灵活性提升研究,推动电动汽车从用电负荷向移动式储能资源的角色转变。; 阅读建议:建议读者深入研读内近似模型的数学推导过程,理解其在保证保守性前提下提升计算可行性的优势,并结合所提供的Matlab代码,动手实现从小规模算例到大规模场景的仿真验证,点关注聚合后灵活性域的几何特征演变及算法性能随车辆数量增长的变化趋势。
内容概要:本文针对计及风电不确定性的电力系统黑启动与负荷恢复协同优化问题展开研究,提出了一种融合风电出力随机性与波动性的不确定性优化模型,并基于Matlab平台实现了算法仿真与验证。研究聚焦于电力系统在大面积停电后的恢复过程中,如何充分利用风电等可再生能源作为黑启动电源,科学规划机组启动顺序、黑启动路径以及关键负荷的恢复时序,从而提升系统恢复的效率、安全性与经济性。通过引入场景生成与削减技术处理风电不确定性,结合智能优化算法求解多阶段、多约束的协同优化问题,实现了对恢复过程的精细化决策支持。; 适合人群:具备电力系统分析、随机优化理论基础及Matlab编程能力的研究生、高校科研人员以及电力公司从事系统运行与应急管理的技术人员。; 使用场景及目标:①为含高比例新能源的新型电力系统制定黑启动预案提供理论依据与量化分析工具;②支撑极端灾害下电网恢复策略的仿真评估与优化设计;③深化对新能源参与系统恢复机理的理解,推动电力系统韧性能力的提升。; 阅读建议:建议读者结合Matlab代码深入理解模型构建、不确定性处理及算法求解全过程,点关注场景概率建模、目标函数构建与多约束条件的处理方法,可进一步将该框架拓展应用于其他复杂电力系统恢复与优化问题的研究中。
内容概要:本文系统研究了基于W-GAN(Wasserstein生成对抗网络)的光伏出力场景生成方法,并提供了完整的Python代码实现。该方法利用深度学习技术,有效捕捉光伏发电功率时间序列中的复杂非线性特征与时序依赖关系,克服了传统参数化建模和随机抽样方法在处理高不确定性、强波动性数据时的局限性。通过引入Wasserstein距离与梯度惩罚机制,模型提升了训练稳定性与收敛性能,能够生成具有高度真实感和统计一致性的多样化光伏出力场景,充分反映光照强度、天气突变、季节变化等多种外部不确定性因素的影响。研究涵盖了模型架构设计、损失函数构建、训练流程优化及生成效果评估等关键环节,并结合实测光伏数据进行验证,展示了其在场景多样性、分布保真度和时间连续性方面的优越表现。; 适合人群:具备一定Python编程能力与机器学习理论基础,从事新能源发电预测、电力系统规划、不确定性建模、智能算法开发等相关领域的高校研究生、科研机构研究人员及电力行业工程技术人才。; 使用场景及目标:①为含高比例光伏接入的电力系统提供高质量的多场景输入,支撑随机优化调度、可靠性评估与风险防控;②作为先进的不确定性建模工具,服务于微电网、综合能源系统、储能配置与需求响应等场景下的多情景仿真与决策分析;③帮助研究者深入理解W-GAN在能源时序数据生成中的应用机理,掌握其网络结构设计、训练技巧与评价指标体系,推动其在风电、负荷等其他能源序列生成任务中的迁移与拓展。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,点理解生成器与判别器的网络结构设计、Wasserstein距离的实现方式以及梯度惩罚项的加入方法,同时可通过调整超参数、更换数据集等方式开展对比实验,进一步深化对模型特性的认识,并尝试将其应用于其他相关领域的时间序列生成问题中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值