disable/enable 程序控制网卡

注意的是:在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*) &params,
					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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值