1. SetupDiGetClassDevs
获得设备信息列表
2.SetupDiEnumDeviceInfo
枚举设备信息
循环查找:
{
3.SetupDiGetDeviceRegistryProperty(hDevInfo,&DevInfoData,SPDRP_CLASS,...,...)
得到设备类型,如果类型是"Net",说明是网络设备,一般就是NIC.
4.SetupDiGetDeviceRegistryProperty(hDevInfo,&DevInfoData,SPDRP_COMPATIBLEIDS,.....)
来得到设备的CompatibleIDs,从而确定对应的设备(如果有多个网卡的话).
使用SPDRP_FRIENDLYNAME或SPDRP_DEVICEDESC得到设备名字或描述
也可以根据其他条件来确定.
5.SetupDiSetClassInstallParams
设置参数,其中一个参数是SP_PROPCHANGE_PARAMS
例如
SP_PROPCHANGE_PARAMS sp_propchange_params={sizeof(SP_CLASSINSTALL_HEADER)};
//设置参数:
sp_propchange_params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
sp_propchange_params.Scope = DICS_FLAG_GLOBAL;
sp_propchange_params.StateChange = DICS_DISABLE(or DICS_ENABLE);
6.SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,pDevInfoData)
使设置生效.
}
使用同样的方法,先DICS_DISABLE再DICS_ENABLE,即可重启网卡.
///看看例子//来自CSDN
bool CNetCardStateSet::NetCardStateChange(void * NetCardPoint, bool Enabled)
{
//---------------------------------------------------------------------------
//功能:NetCardStateChange 网卡的启用与禁用
//参数:NetCardPoint 是 PNetCardStruct 的指针.
//参数:Enabled true = 启用 false = 禁用
//---------------------------------------------------------------------------
PNetCardStruct NetCard = (PNetCardStruct)NetCardPoint;
DWORD DeviceId = NetCard->Id;
HDEVINFO hDevInfo = 0;
if (INVALID_HANDLE_VALUE == (hDevInfo =
SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES)))
{
return false;
}
/*
SetupDiGetClassDevs(
(LPGUID) &GUID_DEVCLASS_NET, // GUID_DEVCLASS_NET表示仅列出网络设备
NULL,
this->m_hWnd,
DIGCF_PRESENT);
*/
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
DWORD Status, Problem;
if (!SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData)) //
return false;
if (CM_Get_DevNode_Status(&Status, &Problem,
DeviceInfoData.DevInst,0) != CR_SUCCESS) //读取网卡状态
return false;
SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
PropChangeParams.Scope = DICS_FLAG_GLOBAL;
if (Enabled)
{
if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))) //如果网卡是启用中的,则不处理
{
NetCard->Disabled = false;
return false;
}
PropChangeParams.StateChange = DICS_ENABLE;
}
else
{
if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))
{
NetCard->Disabled = true;
return false;
}
if (!((Status & DN_DISABLEABLE) && (CM_PROB_HARDWARE_DISABLED != Problem)))
return false;
PropChangeParams.StateChange = DICS_DISABLE;
}
if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData,(SP_CLASSINSTALL_HEADER *)&PropChangeParams, sizeof(PropChangeParams)))
{//功能:设置网卡有效或无效
return false;
}
if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData))
{
return false;
}
if (CM_Get_DevNode_Status(&Status, &Problem,DeviceInfoData.DevInst,0) == CR_SUCCESS)
{
NetCard->Disabled = (Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem);
}
return true;
}