注意的是:在SetupDiClassNameFromGuid返回的参数devName含有‘\0'结束符,我写了个递归函数去掉结束符。在windows平台测试通过。
在VS2008里Properties->C/C++->Advanced->Complie As 选项里选择 Compile as C Code (/TC)
#include <windows.h>
#include <Setupapi.h>
/* remove '\0' in a array */
void RemoveBlank(char* chs, unsigned int start, unsigned int end) {
/* check parameters */
if (chs == NULL)
return;
if (start + 1 == end)
return;
else {
if (*(chs + start) == '\0') {
unsigned int tep = start + 1;
for (; tep < end; tep++) {
if (*(chs + tep) != '\0') {
*(chs + start) = *(chs + tep);
*(chs + tep) = '\0';
break;
}
}
}
/* recursive caller */
RemoveBlank(chs, start + 1, end);
}
}
void EnumDevices(HDEVINFO hDevInfo, DWORD StateChange) {
SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
LPOLESTR guid;
char devName[128] = { 0 };
char instanceId[128] = { 0 };
int i = 0;
for (; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) {
StringFromCLSID(&DeviceInfoData.ClassGuid, &guid);
SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL);
RemoveBlank(devName, 0, 128);
if (!strcmp(devName, "Net")) {
SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId,
128, NULL);
RemoveBlank(instanceId, 0, 128);
if (!strncmp(instanceId, "PCI", 3)) {
SP_PROPCHANGE_PARAMS params =
{ sizeof(SP_CLASSINSTALL_HEADER) };
params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
params.Scope = DICS_FLAG_CONFIGSPECIFIC;
params.StateChange = StateChange;
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, DICS_DISABLE ); // disable net
EnumDevices(hDevInfo, DICS_ENABLE ); // enable net
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}