急:如何获取网卡状态?

samesky76 2003-09-23 10:27:24
需要将当前活动的网卡禁用,知道如何禁用,查MSDN却找不到获得网卡状态的方法,好着急!那位高人能给指点一下?
...全文
572 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoha2003 2003-10-07
  • 打赏
  • 举报
回复
有谁告诉我这个SetupDiEnumDeviceInterfaces()怎么用?
会思考的草 2003-09-24
  • 打赏
  • 举报
回复
查询状态的话,我想应该可以通过查询网卡电源状态来判断吧。具体没有试验过。
会思考的草 2003-09-24
  • 打赏
  • 举报
回复
首先要知道网卡的GUID,这个东西是固定的,譬如光驱设备的:
DEFINE_GUID \
(CDROM_GUID,0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e,0xfb, 0x8b);
你可以去查查。
samesky76 2003-09-24
  • 打赏
  • 举报
回复
谢谢大家!
yaoha2003(耀哈) 提供的方法可以启用和停用网卡,但还是无法知道当前网卡是启用还是停用。
用netbios倒是能得到一些适配器的信息,但是我装两个网卡的话好像也判断不出来是两个都已启用还是一个启用一个停用。
我用SetupDiEnumDeviceInterface(记不太清是不是这样写的了)结果总是失败,它需要Interface GUID,不知从哪里取。
大家还有没有其他好方法呢?
一起努力!

elyta 2003-09-24
  • 打赏
  • 举报
回复
xp下的话,可以用 MIB_IFROW 中的 dwOperStatus 来判断。

但是在NT和ME下,该值居然恒为"1",所以没有能够实现。

算是抛砖引玉吧。
elyta 2003-09-24
  • 打赏
  • 举报
回复
用 MIB_IFROW 中的 dwOperStatus 来判断状态。

但是,好像只在WindowsXP下可以用。不知道为什么,在winme和win2000中就恒为"1"了。
shootingstars 2003-09-23
  • 打赏
  • 举报
回复
一直在关注,好像只听到过写驱动的方法。
会思考的草 2003-09-23
  • 打赏
  • 举报
回复
禁用?断开网络连接吗?拦截所有的包不就可以了?Winpcap或许可以。
如果你想获取网卡的电源状态,恐怕得写网卡驱动。
yaoha2003 2003-09-23
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <tchar.h>
#include <windows.h>
#include <setupapi.h>

#pragma comment (lib,"setupapi")

#define UnknownDevice TEXT("<Unknown Device>")

HDEVINFO hDevInfo = 0;


BOOL StateChange(DWORD NewState, DWORD SelectedItem,HDEVINFO hDevInfo)
{
SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
HCURSOR hCursor;

//
// This may take a while :^(
//
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));

//
// Get a handle to the Selected Item.
//
if (!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData))
{
printf("EnumDeviceInfo");
return FALSE;
}

//
// Set the PropChangeParams structure.
//
PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
PropChangeParams.Scope = DICS_FLAG_GLOBAL;
PropChangeParams.StateChange = NewState;

if (!SetupDiSetClassInstallParams(hDevInfo,
&DeviceInfoData,
(SP_CLASSINSTALL_HEADER *)&PropChangeParams,
sizeof(PropChangeParams)))
{
printf("SetClassInstallParams");
SetCursor(hCursor);
return FALSE;
}

//
// Call the ClassInstaller and perform the change.
//
if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
hDevInfo,
&DeviceInfoData))
{
printf("SetClassInstallParams");
SetCursor(hCursor);
return TRUE;
}

SetCursor(hCursor);
return TRUE;
}


BOOL IsClassNet( GUID * ClassGuid )
{
#define MAX_NUM 50

HKEY hKeyClass;
LONG lRet;
char ClassType[MAX_NUM];
char NetClass[MAX_NUM] = "Net";
DWORD dwLength = MAX_NUM,dwType = REG_SZ;

if (hKeyClass = SetupDiOpenClassRegKey(ClassGuid,KEY_READ))
{
lRet = RegQueryValueEx(hKeyClass,
TEXT("Class"),
NULL, &dwType, LPBYTE(ClassType), &dwLength);
RegCloseKey(hKeyClass);

if (lRet != ERROR_SUCCESS)
return FALSE;

if (!strcmp(ClassType,NetClass))
return TRUE;
}

return FALSE;
}

int main(int argc, char* argv[])
{
if (INVALID_HANDLE_VALUE == (hDevInfo =
SetupDiGetClassDevs(NULL,NULL,0,
DIGCF_PRESENT|DIGCF_ALLCLASSES)))
{
printf("GetClassDevs");
return 0;
}

DWORD i, Status, Problem;
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};

HKEY hKeyClass;
char DeviceName[200];
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
{
if (IsClassNet(&DeviceInfoData.ClassGuid))
{
printf(" the class's index is %d\n",i);
//
//DICS_DISABLE-->禁用网络
//DICS_ENABLE--->恢复网络
//
if (StateChange(DICS_ENABLE,i,hDevInfo))
printf("NetWork stopped");

}
}

return 0;
}

windows_editor 2003-09-23
  • 打赏
  • 举报
回复
用netbios 网卡加密 获取状态 芯片信息。。。。
maginn 2003-09-23
  • 打赏
  • 举报
回复
可以用netbios中的ncbastat
samesky76 2003-09-23
  • 打赏
  • 举报
回复
我是想通过程序实现类似于在设备管理器中将设备状态为“正常工作”的网卡“停用”的工作。
停用网卡的方法倒是有,就是没有判断网卡的设备状态为“正常工作”还是“已停用”的方法。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧