- UID
- 84037
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-10-4
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
我想定时关闭\开启网卡来控制上网时间,在网上找到了这个源程序,但不会用,请高手帮忙一下,十分谢谢!我的邮箱:gxqf888@163.com[/COLOR]
在google以及csdn上搜索了一下关于网卡禁用的程序,发现所示用的方法都一样,都是使用SetupAPI相关函数,本人也用同样方法写了一个程序,但是发现一个问题(在2k以及XP下都有),使用程序启用和禁用网卡都很正常,但如果是手工禁用网卡(在设备管理器中选择网卡,并停用),则无法用程序启用,而程序却报告启用成功,事实上此时网卡无法使用。本人登陆OS是Administrator身份。现将程序贴上,希望大家指点迷津。
#include <windows.h>
#include <SetupAPI.h>
#include <stdio.h>
#include <tchar.h>
#pragma comment(lib,"setupapi.lib")
DWORD CtrlNetcard(BOOL bStatus);
void _tmain(int arg, TCHAR** argv)
{
BOOL b = FALSE;
DWORD err = 0;
if(2 == arg)
{
argv++;
if(!_tcsicmp(TEXT("enable"), *argv))
{
b = TRUE;
err = CtrlNetcard(TRUE);
}
else if(!_tcsicmp(TEXT("disable"), *argv))
{
b = FALSE;
err = CtrlNetcard(FALSE);
}
else
{
goto main_end;
}
_tprintf("\n%s NetAdapter %s !\n",
b ? TEXT("Enable") : TEXT("Disable"),
err ? TEXT("fail") : TEXT("success"));
return;
}
main_end:
_tprintf(TEXT("\nenable NetCard: enable"));
_tprintf(TEXT("\ndisable NetCard: disable\n"));
}
DWORD CtrlNetcard(BOOL bStatus)
{
LPCTSTR HardwareId = TEXT("{4D36E972-E325-11CE-BFC1-08002BE10318}");
GUID g = {0X4D36E972, 0XE325, 0X11CE, {0XBF, 0XC1, 0X08, 0X00, 0X2B, 0XE1, 0X03, 0X18}};
DWORD NewState = 0;
//调用ddk函数,来禁用网卡
DWORD i = 0, err = 0;
HDEVINFO hDevInfo = NULL;
SP_DEVINFO_DATA spDevInfoData = {0};
NewState = bStatus ? DICS_ENABLE : DICS_DISABLE;
//访问系统的硬件库
hDevInfo = SetupDiGetClassDevs(NULL, TEXT("PCI"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
if(INVALID_HANDLE_VALUE == hDevInfo)
{
_tprintf(TEXT("访问系统硬件出错!"));
return GetLastError();
}
//枚举硬件,获得需要的接口
spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
memcmp(&(spDevInfoData.ClassGuid), &g, sizeof(GUID));
for(i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
{
PBYTE PropertyBuffer = NULL;
DWORD PropertyBufferSize = 0;
//获得硬件的属性值
while(!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&spDevInfoData,
SPDRP_CLASSGUID,
NULL,
PropertyBuffer,
PropertyBufferSize,
&PropertyBufferSize))
{
if(ERROR_INSUFFICIENT_BUFFER == GetLastError())
{
if(PropertyBuffer)
{
free(PropertyBuffer);
}
PropertyBuffer = (PBYTE)malloc(PropertyBufferSize);
}
else
{
break;
}
}
if(!PropertyBuffer)
{
continue;
}
if(!_tcsicmp(HardwareId, (LPTSTR)PropertyBuffer))
{
SP_PROPCHANGE_PARAMS spPropChangeParams ;
free(PropertyBuffer);
spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
spPropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;
spPropChangeParams.Scope = DICS_FLAG_GLOBAL;
spPropChangeParams.StateChange = NewState;
if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))
{
err = GetLastError();
goto cleanup_DeviceInfo;
}
if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))
{
err = GetLastError();
goto cleanup_DeviceInfo;
}
}
else
{
free(PropertyBuffer);
}
}
cleanup_DeviceInfo :
SetupDiDestroyDeviceInfoList(hDevInfo);
return err;
} |
|