16,551
社区成员
发帖
与我相关
我的任务
分享DWORD CtrlNetcard(TCHAR* NetCardDescription,BOOL bStatus)
{
/*cout<<"1"<<endl;
wprintf(_T("1 %s\n"),NetCardDescription);*/
LPCTSTR HardwareId = _T("{4D36E972-E325-11CE-BFC1-08002BE10318}"); //网卡类
GUID g = {0X4D36E972, 0XE325, 0X11CE, {0XBF, 0XC1, 0X08, 0X00, 0X2B, 0XE1, 0X03, 0X18}};//网卡的GUID
DWORD NewState = 0;
//调用ddk函数,来禁用网卡
DWORD i = 0, err = 0;
HDEVINFO hDevInfo = NULL;
SP_DEVINFO_DATA spDevInfoData = {0};
//如果bStatus 为TRUE,则NewState为1-enable,否则为2-disable
NewState = bStatus ? DICS_ENABLE : DICS_DISABLE;
//访问系统的硬件库,过滤出PCI设备,得到PCI设备集合
//hDevInfo = SetupDiGetClassDevs(NULL, _T("PCI"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
hDevInfo = SetupDiGetClassDevs(&g, NULL, NULL, DIGCF_PRESENT);
if(INVALID_HANDLE_VALUE == hDevInfo)
{
_tprintf(_T("访问系统硬件出错!"));
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;
//获得硬件的属性值,找GUID
while(!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&spDevInfoData,
/*SPDRP_ENUMERATOR_NAME*/
SPDRP_DEVICEDESC,
NULL,
PropertyBuffer,
PropertyBufferSize,
&PropertyBufferSize))
{ //如果返回FAILE,判断是不是buffer不合适,如果是则重新分配buffer再次调用,
//否则退出此循环
if(ERROR_INSUFFICIENT_BUFFER == GetLastError())
{
if(PropertyBuffer)
{
free(PropertyBuffer);
}
PropertyBuffer = (PBYTE)malloc(PropertyBufferSize);
}
else
{
break;
}
}
//如果调用成功,判断buffer是否有值,没有则枚举下一设备
if(!PropertyBuffer)
{
continue;
}
//wprintf(_T("2 %s\n"),(LPTSTR)PropertyBuffer);
//buffer有值,判断buffer里的GUID是不是网卡GUID
if(!_tcsicmp(/*_T("PCI")*/NetCardDescription, (LPTSTR)PropertyBuffer)) //如果GUID是网卡GUID则进行相关处理
{
//cout<<"2"<<endl;
SP_PROPCHANGE_PARAMS spPropChangeParams ;
free(PropertyBuffer);
spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
spPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; //表示设备安装信息将要改变,通知系统重新安装
spPropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC /*DICS_FLAG_GLOBAL*/; //Make the change in all hardware profiles
spPropChangeParams.StateChange = DICS_DISABLE /*NewState*/; //disable or enable
printf("disable");
if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,
(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))
{ //修改,若成功则返回TRUE,否则返回FALSE
err = GetLastError();
//cout<<"err1 : "<<err<<endl;
goto cleanup_DeviceInfo;
}
if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))
{ //重新安装,若成功则返回TRUE,否则返回FALSE
err = GetLastError();
//cout<<"err2 : "<<err<<endl;
goto cleanup_DeviceInfo;
}
SP_DEVINSTALL_PARAMS DeviceInstallParams;
//printf("hello");
if(SetupDiGetDeviceInstallParams(hDevInfo,&spDevInfoData,&DeviceInstallParams))
{
if((DeviceInstallParams.Flags == DI_NEEDREBOOT) ||
(DeviceInstallParams.Flags == DI_NEEDRESTART ))
{
cout<<"Need Reboot!"<<endl;
}
}
else
goto cleanup_DeviceInfo;
}
else //若没有值则枚举下一个设备信息
{
free(PropertyBuffer);
}
}
cleanup_DeviceInfo :
SetupDiDestroyDeviceInfoList(hDevInfo);
return err;
}