python 禁用网卡_在C++程序中开启和禁用Windows设备的无线网卡的方法

1.列出当前网卡:SetupDiEnumDeviceInfo

2.找出当前无线网卡的名字(用natvie wifi api)

3.卸载\安装此驱动

问题:

log为:SetupDiSetClassInstallParams failed. -536870347

完整代码如下:

// ControlWirelessCard.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include

#include

#include

#include

#include

#include

#pragma comment(lib,"setupapi.lib")

#pragma comment(lib, "wlanapi.lib")

using namespace std;

wstring getWirelessNetworkCardName()

{

wstring wirelessName;

HANDLE hClient = NULL;

DWORD dwMaxClient = 2; //

DWORD dwCurVersion = 0;

DWORD dwResult = 0;

DWORD dwRetVal = 0;

int iRet = 0;

WCHAR GuidString[39] = {0};

unsigned int i;

/* variables used for WlanEnumInterfaces */

PWLAN_INTERFACE_INFO_LIST pIfList = NULL;

PWLAN_INTERFACE_INFO pIfInfo = NULL;

dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);

if (dwResult != ERROR_SUCCESS) {

wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);

return wirelessName;

}

dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);

if (dwResult != ERROR_SUCCESS) {

wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);

return wirelessName;

} else {

PWLAN_AVAILABLE_NETWORK_LIST pWLAN_AVAILABLE_NETWORK_LIST = NULL;

dwResult = WlanGetAvailableNetworkList(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid,

WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,

NULL, &pWLAN_AVAILABLE_NETWORK_LIST);

if (dwResult != ERROR_SUCCESS)

{

printf("WlanGetAvailableNetworkList failed with error: %u\n",dwResult);

WlanFreeMemory(pWLAN_AVAILABLE_NETWORK_LIST);

return wirelessName;

}

for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) {

pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];

iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString,

sizeof(GuidString)/sizeof(*GuidString));

wirelessName = pIfInfo->strInterfaceDescription;

}

}

return wirelessName;

}

BOOL changeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)

{

LPTSTR lpszMsg = NULL;

HCURSOR hCursor = NULL;

try

{

SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};

hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));

// Get a handle to the Selected Item.

if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))

{

wprintf(L"SetupDiEnumDeviceInfo failed. %d\n",GetLastError());

throw lpszMsg;

}

// Set the PropChangeParams structure.

PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;

PropChangeParams.Scope = DICS_FLAG_GLOBAL;

PropChangeParams.StateChange = NewStatus;

if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,

sizeof(PropChangeParams)))

{

wprintf(L"SetupDiSetClassInstallParams failed. %d\n",GetLastError());

throw lpszMsg;

}

// Call the ClassInstaller and perform the change.

if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))

{

wprintf(L"SetupDiCallClassInstaller failed. %d\n",GetLastError());

throw lpszMsg;

}

SetCursor(hCursor);

return TRUE;

}

catch (TCHAR * pszError)

{

SetCursor(hCursor);

if (NULL != lpszMsg)

{

LocalFree((HLOCAL)lpszMsg);

}

return FALSE;

}

}

int _tmain(int argc, _TCHAR* argv[])

{

LPTSTR lpszMsg = NULL;

try

{

/*

TCHAR * GUIDString = NULL;

GUID guid;

ZeroMemory(&guid, sizeof(GUID));

GUIDString = _T("4d36e972-e325-11ce-bfc1-08002be10318");

UuidFromString((unsigned char *)GUIDString, &guid);

*/

//GUID guid = getWirelessNetworkCardGUID();

HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET,/*L"WIRELESS"*/NULL,NULL,DIGCF_PRESENT);

//HDEVINFO hDevInfo = SetupDiGetClassDevs(&guid,/*L"WIRELESS"*/NULL,NULL,DIGCF_PRESENT);

if (INVALID_HANDLE_VALUE == hDevInfo)

{

wprintf(L"INVALID_HANDLE_VALUE");

return -1;

}

DWORD i;

int Icount=0;

SP_DEVINFO_DATA DeviceInfoData;

ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)

{

//Get DeviceInfo

LPTSTR buffer = NULL;

DWORD buffersize = 0;

DWORD Status, Problem;

BOOL bDisabled = FALSE;

while (!SetupDiGetDeviceRegistryProperty(

hDevInfo,

&DeviceInfoData,

SPDRP_DEVICEDESC, //Read the names of the designated card

NULL,

(PBYTE) buffer,

buffersize,

&buffersize)

)

{

if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )

{

if (buffer) LocalFree(buffer);

buffer=(LPTSTR)LocalAlloc(LPTR,buffersize);

}

else

{

wprintf(L"read network card failed!");

}

}

std::wstring strEthernet = buffer;

//wprintf(L"the buffer is %ws\n",buffer);

wstring wirelessName = getWirelessNetworkCardName();

if(wirelessName.empty())

{

wprintf(L"wirelessName IS empty\n");

return -1;

}

//wprintf(L"wirelessName is %ws\n",wirelessName);

if(wirelessName == buffer)

{

wprintf(L"Found the wireless card: %ws\n",wirelessName);

if (int i= CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst,0) != CR_SUCCESS)

{

wprintf(L"CM_Get_DevNode_Status failed. %d\n",GetLastError());

throw "failed\n";

}

if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem)))

{

bDisabled = FALSE;

}

if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))

{

bDisabled = TRUE;

}

if(bDisabled==FALSE)

{

wprintf(L"disable the network card\n");

changeStatus(DICS_DISABLE, i, hDevInfo);//disable

}

if(bDisabled==TRUE)

{

wprintf(L"enable the network card\n");

changeStatus(DICS_ENABLE, i, hDevInfo);// enable

}

}

}

return SetupDiDestroyDeviceInfoList(hDevInfo);

}

catch (TCHAR * pszError)

{

if (NULL != lpszMsg)

{

LocalFree((HLOCAL)lpszMsg);

}

return FALSE;

}

return 0;

}

一些常见错误解决一、

从错误返回值入手。

-536870347,用windows自带计算器,选择程序员模式,将此十进制转换为16进制为E0000235.

用此错误号搜索,就是大名鼎鼎的32位程序跑在64位系统中报错。

虽然我用的64位win8下VS编译的程序,但是编译选项中仍然是WIN32程序。那么我们只需要修改成x64编译即可,操作如下。

BUILD-->Configuration Manager...-->找到要修改的project,将platform选择为x64.

如果没有,说明没有添加x64编译项,接着上面,在platform中选择 -->New platform下选x64-->OK.

二、

编译64位程序,运行之。

仍然报错,返回值是5.ACCESS_DENIED.

权限不够,我们需要申请高权限。如下申请Admin权限:

你项目的Properties-->Linker-->Manifest File-->UAC Execution Level选requireAdministrator。

三、

继续运行。卸载无线网卡驱动成功。

但是上一篇的程序仍然有个问题,由于驱动卸载了,就不能用wlan api得到无线网卡名称,

所以程序加载无线网卡驱动就会失败。

我们可以用关键字“Wireless Network Adapter”来查找无线网卡,省掉使用wlan api那一步。

概要:   DevCon 实用工具是一种命令行实用工具,可以替代设备管理器。使用 DevCon,您可以启用、禁用、重新启动、更新、删除和查询单个设备或一组设备。DevCon 提供与开发人员有关但无法在设备管理器看到的信息。   您可以将 DevCon 用于 Windows 2000 、Windows XP和Windows vista。不能将 Devcon 用于 Microsoft Windows 95、Windows 98、或 Windows Millennium Edition。   下载:http://download.microsoft.com/download/1/1/f/11f7dd10-272d-4cd2-896f-9ce67f3e0240/devcon.exe 用法及参数说明:   devcon.exe [-r] [-m:\\] [...]   -r 如果指定它,在命令完成后若需要则重新启动计算机。    是目标计算机的名称。    是将要执行的命令(如下所示)。   ... 是命令需要的一个或多个参数。   要获取关于某一特定命令的帮助,请键入:devcon.exe help   classfilter 允许修改类别筛选程序。   classes 列出所有设备安装类别。   disable 禁用与指定的硬件或实例 ID 匹配的设备。   driverfiles 列出针对设备安装的驱动程序文件。   drivernodes 列出设备的所有驱动程序节点。   enable 启用与指定的硬件或 实例 ID 匹配的设备。   find 查找与指定的硬件或 实例 ID 匹配的设备。   findall 查找设备,包括那些未显示的设备。   help 显示此信息。   hwids 列出设备的硬件 ID。   install 手动安装设备。   listclass 列出某一安装类别的所有设备。   reboot 重新启动本地计算机。   remove 删除与特定的硬件或 实例 ID 匹配的设备。   rescan 扫描以发现新的硬件。   resources 列出设备的硬件资源。   restart 重新启动与特定的硬件或 实例 ID 匹配的设备。   stack 列出预期的设备驱动程序堆栈。   status 列出设备的运行状态。   update 手动更新设备。   UpdateNI 手动更新设备,无用户提示   SetHwID 添加、删除和更改根枚举设备的硬件 ID 的顺序。 示例:   devcon -m:\\test find pci\* 列出计算机 test 上的所有已知 PCI 设备。(通过使用 -m,您可以指定一个目标计算机。您必须使用“进程间通信”(IPC) 访问此计算机。)   devcon -r install Windows directory\Inf\Netloop.inf *MSLOOP 安装一个新的 Microsoft 环回适配器实例。这将创建一个新的根枚举设备节点,使用此节点您可以安装“虚拟设备”,如环回适配器。如果需要重新启动计算机,此命令还将以安静模式重启计算机。   devcon classes 列出所有已知的安装类别。输出结果包含短的未本地化的名称(例如,“USB”)和描述性名称(例如,“通用串行总线控制器”)。 禁用启用网卡的步骤:   1.用devcon hwids PCI*命令得到所有以PCI开头的设备。这时会列出很多设备,那么哪个才是网卡对应的呢?   2.打开设备管理器,展开网络适配器,找到网卡的名称,然后记住到刚才得到的列表找对应的Name,然后你会在下面看到好几个ID,随便挑一个就行   3.用devcon disable "PCI\VEN_11AB&DEV_4380&SUBSYS_301B17AA&REV_10"禁用网卡(启用的话讲disable换成enable就行了)   4.其实用PCI开头得到的几组设备一般第一个就是网卡设备 sysdzw 16:01 2010-11-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值