如何通过编写程序禁用网卡,并且网卡禁用后不能被手动启动?

张大户 2012-05-28 10:55:18
本人有这样一个需求,我的软件运行过程中需要禁用wifi,在网上找了很多禁用网卡的程序,基本都是调用setupapi实现的,附程序如下:
void EnumDevices(HDEVINFO hDevInfo)
{
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
LPOLESTR guid;
char devName[128];
char instanceId[128];
for (int i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
{
StringFromCLSID(DeviceInfoData.ClassGuid,&guid);
SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid,devName,128,NULL);
if(!strcmp(devName,"Net"))
{
SetupDiGetDeviceInstanceId(hDevInfo,&DeviceInfoData,instanceId,128,NULL);
if(!strncmp(instanceId,"PCI",3))
{
wprintf(L"%s\n",guid);
printf("%s\n",devName);
printf("%s\n",instanceId);
SP_PROPCHANGE_PARAMS params = {sizeof(SP_CLASSINSTALL_HEADER )};
params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
params.Scope = DICS_FLAG_CONFIGSPECIFIC;
// params.StateChange = DICS_ENABLE; //禁用:DICS_DISABLE,DICS_ENABLE启用
params.StateChange = DICS_DISABLE; //禁用:DICS_DISABLE,DICS_ENABLE启用
params.HwProfile = 0;
SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)¶ms, sizeof(SP_PROPCHANGE_PARAMS));
SetupDiChangeState(hDevInfo, &DeviceInfoData);
}
}
CoTaskMemFree(guid);
}
}
int main(int argc, char* argv[])
{
HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
hDevInfo = SetupDiGetClassDevs(NULL,NULL,NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
if(INVALID_HANDLE_VALUE == hDevInfo)
return GetLastError();
EnumDevices(hDevInfo);
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}

问题是当运行程序后,网卡虽然被禁用了,但可以手动启动,这样的话程序就没什么用了。是不是要从驱动层面来实现,不懂,请高手指点如何禁用网卡并且不能通过手动启动网卡。
...全文
924 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
张大户 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

WDM的class 过滤驱动,{4D36E972-E325-11CE-BFC1-08002bE10318}

或者设备过滤驱动,对指定网络适配器设备进行过滤

都是 LowerFilter,想法迫使其不能加载设备的上层设备驱动,如果成功了,那么之前正常的设备前可能会有一个黄叹号
[/Quote]
项目时间紧,驱动不会,现学现卖也来不及了。
fly4free 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

用这个软件访问文件服务器的上的文件,他不会删的
[/Quote]

25楼说的是:假如我是安装了你的软件的用户,我可能会想法设法把这个东西给删掉。而管理员另有其人。

fly4free 2012-05-30
  • 打赏
  • 举报
回复
WDM的class 过滤驱动,{4D36E972-E325-11CE-BFC1-08002bE10318}

或者设备过滤驱动,对指定网络适配器设备进行过滤

都是 LowerFilter,想法迫使其不能加载设备的上层设备驱动,如果成功了,那么之前正常的设备前可能会有一个黄叹号
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
可以,但用户也可以把你的驱动程序卸载
张大户 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

只要使用者能够登录管理员账户,不管你做的再严,有经验的都能手工破解
如果使用者不能登录管理员账户,则用设备管理器就可解决,不知你能明白否
[/Quote]
非常感谢你的回复,我能明白你的意思,我之前都是Linux下开发,windows内核原理不是很清楚。我看windows内核的书,发现有一种驱动程序叫过滤驱动程序,现在的想法是编写wifi的过滤驱动程序,过滤掉所有的数据,这就相当于禁用了网卡,不知可不可以?
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
只要使用者能够登录管理员账户,不管你做的再严,有经验的都能手工破解
如果使用者不能登录管理员账户,则用设备管理器就可解决,不知你能明白否
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
如果你的程序通过WM_DEVICECHANGE 检测,可以结束进程
张大户 2012-05-29
  • 打赏
  • 举报
回复
限制本机
张大户 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

只要是管理员用户,你做得再严也可以手工破解,正确的做法是普通使用者不给予管理员账户,禁用启用网卡直接用管理员通过控制面板解决,无需自己编程序
[/Quote]
软件的大概流程是这样的,当用户运行软件,本地连接只限定在局域网内访问,wifi必须禁用掉,之所以禁用掉是防止用户通过无线网访问外网,软件的目的就是限定用户访问外网,所以能通过手动禁用启用无线网卡软件就失去了意义,不知你能明白否。
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
什么对了
张大户 2012-05-29
  • 打赏
  • 举报
回复
你说对了
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
服务器?你这不是限制本机么
张大户 2012-05-29
  • 打赏
  • 举报
回复
用这个软件访问文件服务器的上的文件,他不会删的
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
管理员完全可以删除你的程序
张大户 2012-05-29
  • 打赏
  • 举报
回复
可能我没说清楚,我的软件不分权限,任何权限的用户都能用包括管理员,不管谁运行这个软件,wifi都必须被禁用。另外,能通过这个消息 WM_DEVICECHANGE 检测到网卡被启用或禁用,我试了,现在问题就简单了。
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
说了好几次,普通使用者不给予管理员账户
张大户 2012-05-29
  • 打赏
  • 举报
回复
有什么好的方法?
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
有好的方法不用,偏用那些吃力不讨好的
张大户 2012-05-29
  • 打赏
  • 举报
回复
悲剧了
Lactoferrin 2012-05-29
  • 打赏
  • 举报
回复
不会.
加载更多回复(14)

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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