分享
 
 
 

编程实现重起网卡等设备

王朝other·作者佚名  2006-04-28
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有